Forum Delphi.cz

Delphi => Obecné => Téma založeno: Stanislav Hruška 15-11-2019, 21:46:08

Název: Získať premennú - neviem, lebo vytvorím kruhový odkaz
Přispěvatel: Stanislav Hruška 15-11-2019, 21:46:08

Používam podformuláre. Každý podformulár má vlastnú jednotku, kde sú definované triedy a premenné, do ktorých sa uložia ich inštancie.
Teraz potrebujem na jeden formulár vložiť tri podformuláre, pričom každý podformulár bude obsahovať totožný podformulár. To so doteraz neriešil.
Pre každý podformulár na podformulári sa potrebujem dostať k jeho premennej s objektom. V tomto prípade DepositState. Neviem to zrealizovať kvôli vzniku kruhového odkazu.
Ako sa to rieši?
Dosť som sa natrápil kým som zosmolil to čo mám a že mi to funguje. Takže, žiaľ, nejaký zásadný zásah do riešenia veľmi do úvahy neprichádza.
Kód: Delphi [Vybrat]
  1. unit subMonthDeposit;
  2. interface
  3. type
  4.   TfrmsubMonthDeposit = class(TBasalForm)
  5. implementation
  6. uses
  7.   ...MonthDeposit...;
  8. .
  9. unit MonthDeposit;
  10. interface
  11. uses
  12.   ...subMonthDeposit...;
  13. ...Triedy...
  14. .
  15. var
  16.   DepositState: TDepositState;
  17. implementation
Název: Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
Přispěvatel: Stanislav Hruška 15-11-2019, 21:50:56
Mohol by som jednotku zrušiť a hodiť to všetko do formulára. To by som nerád, lebo by som narušil uniformitu riešenia.
Název: Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
Přispěvatel: Morrison 15-11-2019, 22:29:43
Jestli dobře vidím, DepositState je ale globální proměnná, tu nemá každý TfrmsubMonthDeposit svoji.
Beru zpět, ony jsou to jakože dvě unity v jednom bloku [ code]
Název: Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
Přispěvatel: Morrison 15-11-2019, 22:34:28
V tom případě si přesuň "uses subMonthDeposit" z interface do implementation
Název: Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
Přispěvatel: Stanislav Hruška 16-11-2019, 08:21:44
V tom případě si přesuň "uses subMonthDeposit" z interface do implementation
To by som rád, ale mám tam
Kód: Delphi [Vybrat]
  1. type
  2.  
  3.   TDepositState = class(TVstTableData)
  4.  
  5.     FForm: TfrmsubMonthDeposit;
To som predtým nezverejnil. Preto sa neviem zbaviť kruhového odkazu.
Název: Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
Přispěvatel: Stanislav Hruška 16-11-2019, 09:02:38
Také jednoduché grafické zobrazenie
Název: Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
Přispěvatel: Stanislav Hruška 16-11-2019, 09:37:42
Prikladám celú logiku vytvárania podformulárov. Od samého začiatku sa mi to nepáči, ale ináč som to nevedel.
Možno niekto navrhne čosi lepšie čo vyrieši aj môj problém s "vnorenými podformulármi".
Kód: Delphi [Vybrat]
  1. //  Hlavný/materský formulár
  2. procedure TfrmDepositDefrayalSingly.CreateObjects;
  3. begin
  4.   DepositFunction := TDepositFunction.Create;
  5.   sbfManually := TfrmsubManually.CreateAsSubform(jstpnlDepositManuallyBasic);
  6.   sbfCredit := TfrmsubCredit.CreateAsSubform(jstpnlDepositCreditBasic);
  7.   sbfDebit := TfrmsubDebit.CreateAsSubform(jstpnlDepositDebitBasic);
  8. end;
  9. //  unit subDebit;
  10. class function TfrmsubDebit.CreateAsSubform(const AParentPanel: TjstAdvPanel): TfrmsubDebit;
  11. begin
  12.   Result := TfrmsubDebit.CreateForm;
  13.   TSubForm.SetSubForm(AParentPanel, Result);
  14.   Result.sbfMonthDeposit := TfrmsubMonthDeposit.CreateAsSubform(Result.jstpnlDebitItem);
  15.   DebitDeposit := TDebitDeposit.CreateForm(Result, nil, nil, AParentPanel, nil);
  16. ...
  17. end;
  18. unit Debit;
  19. constructor TDebitOwner.CreateForm(const AForm: TfrmsubDebit; const ATable: TFDTAble; const ADataSource: TDataSource;
  20.   AParentPanel, AEditPanel: TjstAdvPanel);
  21. begin
  22.   FForm := AForm;
  23.   Create(AParentPanel, AEditPanel, ATable, ADataSource);
  24. end;
  25. constructor TDebitOwner.Create(const AParentPanel, AEditPanel: TjstAdvPanel; const ATable: TFDTable; const ADataSource:
  26.   TDataSource);
  27. begin
  28.   inherited;
  29.   ...
  30. end;
Vykonaná oprava.
Název: Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
Přispěvatel: Stanislav Hruška 16-11-2019, 09:45:48
Mám tam chybu. Pomýlil som si DebitDeposit s DepositState. Tu vytváram požadovanú inštanciu.
Kód: Delphi [Vybrat]
  1. class function TfrmsubMonthDeposit.CreateAsSubform(const AParentPanel: TjstAdvPanel): TfrmsubMonthDeposit;
  2. begin
  3.   Result := TfrmsubMonthDeposit.CreateForm;
  4.   TSubForm.SetSubForm(AParentPanel, Result);
  5. // Tu potrebujem pre každý podformulár vlastnú inštanciu. Takto budem mať vždy len jedinú. Poslednú!
  6.   DepositState := TDepositState.CreateForm(Result, nil, nil, AParentPanel, nil);
  7.   oGlobalVar.AddObject(DepositState);
  8.   Result.Show;
  9. end;
Název: Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
Přispěvatel: Stanislav Hruška 16-11-2019, 12:00:58
Prišla mi na um myšlienka vytvoriť v každom podformulári premennú pre vnorený podformulár. Problém je v tom, že sa hodnota do premennej odovzdáva odkazom. Ja to potrebujem hodnotou.
Prišiel mi na um Assign. Ten funguje na objekty typu Persistent. Tak som základnú triedu odvodil od TComponent. Dočítal som sa, že v takom prípade dostanem výnimku. Žiaľ áno.
Dá sa uložiť objekt do premennej hodnotou aj iným spôsobom? Samozrejme, že tam mám aj private field.
Název: Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
Přispěvatel: Stanislav Hruška 16-11-2019, 12:10:50
Vyzerá to tak, že to predsa len funguje. Chybu som mal inde. V inicializovaní polí objektu. Sem tam som ho vynechal.
Název: Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
Přispěvatel: pf1957 17-11-2019, 13:49:18
Ako sa to rieši?
V soucasnem OOP se programuje proti interfacum, takze:
a) vytvorit interface pro pristup k subformu (interfacu muze byt nekolik) z modelu
b) implementovat pozadovane interfacy na urovni subformu (ev. na urovni jeho predka)
c) Do modelu nepredavat konkretni tridu subformu (nebo cehokoli), ale v podstate jen instanci objektu, na kterem si model vyloudi prislusny interface a ten pak pouziva.

Tim to mas decouplovane, protoze interface muze implementovat kdokoli a nikomu v podstate neni nic do toho, kdo interface implementuje.
Název: Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
Přispěvatel: Stanislav Hruška 17-11-2019, 14:17:54
O interface v podstate viem, že existujú. Všeobecné pojednanie o interface mi nepomôže. O modeloch viem to isté čo o interface. Keď som niečo hľadal pre delphi (MCV), tak som nič nenašiel.
Dal by sem niekto nejaké odkazy, či kľúčové slová v zmysle príspevku pf1957?
Vopred ďakujem.
Název: Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
Přispěvatel: vandrovnik 17-11-2019, 17:13:22
Jestli se rozhodneš to přepsat na použití interface, vřele doporučuju si jejich používání nejprve někde mimo tenhle projekt opravdu důkladně vyzkoušet a zvládnout, jinak z toho budeš na mrtvici :-)
Něco třeba na http://www.nickhodges.com/page/Why-You-Should-be-Using-Interfaces-and-not-Direct-References.aspx (http://www.nickhodges.com/page/Why-You-Should-be-Using-Interfaces-and-not-Direct-References.aspx)
Název: Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
Přispěvatel: Stanislav Hruška 17-11-2019, 18:33:47
Jestli se rozhodneš to přepsat na použití interface, vřele doporučuju si jejich používání nejprve někde mimo tenhle projekt opravdu důkladně vyzkoušet a zvládnout, jinak z toho budeš na mrtvici :-)
Rozhodnutý ešte nie som. To má čas. V každom prípade si to najprv vyskúšam. Na mŕtvicu to je často aj teraz :)
Vďaka za odkaz. Naštudujem.
Název: Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
Přispěvatel: Stanislav Hruška 17-11-2019, 18:37:05
Tú knihu aj jej pokračovanie mám. Ak by mal niekto záujem pokojne pošlem. Ak sa dobre pamätám, tak obe boli free.
.
Dodatok
Mám tieto knihy:

Marco Breveglieri Delphi Succinctly.pdf
Marco Cantu Delphi 2009 Handbook.pdf
Marco Cantu Object Pascal Handbook.pdf
Martin Mareš, Tomáš Valla Prúvodce labyrintem algoritmu.pdf
MegaKniha Delphi.pdf
Mgr. Jaromír Křížek Programovani v jazyce Delphi teorie.pdf
Nick Hodges Coding In Delphi.pdf
Nick Hodges More Coding in Delphi.pdf
Pawel Glowacki Expert Delphi.pdf
Primož Gabrijelčič Delphi High Perfomance.pdf
Robert Sedgewick Delphi - Algorithms.pdf
Sébastien Doeraene Generics with Delphi 2009 Win32.pdf
Stefan Cruysberghs Debugging techniques in Delphi.pdf
TsiLang Users Guide Lokalizácia aplikácie.pdf
.
Niektoré som aj čítal ;) Len nie všetky sú free. Ale neviem ktoré ???  V prípade záujmu stačí napísať na e-mail.
Název: Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
Přispěvatel: starous 19-11-2019, 09:25:11
V tom případě si přesuň "uses subMonthDeposit" z interface do implementation
To by som rád, ale mám tam
Kód: Delphi [Vybrat]
  1. type
  2.   TDepositState = class(TVstTableData)
  3.     FForm: TfrmsubMonthDeposit;
To som predtým nezverejnil. Preto sa neviem zbaviť kruhového odkazu.

Nahraď to zápisem:
Kód: Delphi [Vybrat]
  1. type
  2.   TDepositState = class(TVstTableData)
  3.     FForm: TForm;

Při použití to pak přetypuješ na správný typ:
Kód: Delphi [Vybrat]
  1. var
  2.   SubForm : TfrmsubMonthDeposit;
  3. begin
  4.    SubForm:= FForm as TfrmsubMonthDeposit;
  5.    ...
  6. end;
Název: Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
Přispěvatel: Stanislav Hruška 19-11-2019, 12:09:37
Už som to vyriešil. Ale ak to budem potrebovať, tak si na to snáď spomeniem :)
Minimálne by som to mohol využiť na presunutie definície FForm do koreňového predka.