Autor Téma: Získať premennú - neviem, lebo vytvorím kruhový odkaz  (Přečteno 559 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4546
  • Karma: 40
    • Verze Delphi: XE7 professional

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
« Poslední změna: 15-11-2019, 21:49:11 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4546
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
« Odpověď #1 kdy: 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.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 278
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
« Odpověď #2 kdy: 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]
« Poslední změna: 15-11-2019, 22:32:26 od Morrison »
nil

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 278
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
« Odpověď #3 kdy: 15-11-2019, 22:34:28 »
V tom případě si přesuň "uses subMonthDeposit" z interface do implementation
nil

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4546
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
« Odpověď #4 kdy: 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.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4546
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
« Odpověď #5 kdy: 16-11-2019, 09:02:38 »
Také jednoduché grafické zobrazenie
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4546
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
« Odpověď #6 kdy: 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.
« Poslední změna: 16-11-2019, 09:50:50 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4546
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
« Odpověď #7 kdy: 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;
« Poslední změna: 16-11-2019, 09:48:28 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4546
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
« Odpověď #8 kdy: 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.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4546
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
« Odpověď #9 kdy: 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.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2611
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
« Odpověď #10 kdy: 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.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4546
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
« Odpověď #11 kdy: 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.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 811
  • Karma: 45
    • Verze Delphi: 10.3
Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
« Odpověď #12 kdy: 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

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4546
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
« Odpověď #13 kdy: 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.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4546
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Získať premennú - neviem, lebo vytvorím kruhový odkaz
« Odpověď #14 kdy: 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.
« Poslední změna: 17-11-2019, 18:42:12 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.