Autor Téma: Zistenie "myForm"  (Přečteno 6230 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4992
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Zistenie "myForm"
« kdy: 15-03-2013, 08:52:16 »
Hlanvé okno aplikácie okno je stále vytvorené.
Ostatné formuláre vytváram a ničím podľa potreby. Vo funkciách potrebujem pracovať s niektorými komponetami na "myForm". Môže byť vytvorených aj viac formulárov.
 
Používam dve riešenia
1)
 
function xxx(FormTag: Integer): cosi;
begin
case FormTag of
1: Result := nieco;
...
 
2) mám sitáciu keď sa mi myForm mení - nie je priradený natvrdo. Tam používam
 
function yyy(): cosi;
begin
if Assigned(frmKonkretny) then
Result := nieco;
...
 
Rád by som mal jednu univerzálnu funkciu. To spĺňa 2), len neviem či to je správne riešenie. Alebo sa to robí ináč?
 
Ďakujem
 
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1493
  • Karma: 37
    • Pepak.net
Re:Zistenie "myForm"
« Odpověď #1 kdy: 15-03-2013, 08:58:16 »
Napiš dotaz znovu a tentokrát srozumitelně. Tohle překonává i tvůj obvyklý dotazovací styl, srozumitelné je to jen po druhou větu včetně.

Nápověda: Zkus nějak nadefinovat, co si máme my prostí smrtelníci představit pod myForm (to je proměnná? typ? název formuláře? jméno tvého počítače?), cosi, nieco, frmKonkretny. Co mají dělat funkce xxx a yyy?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4992
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Zistenie "myForm"
« Odpověď #2 kdy: 15-03-2013, 09:14:54 »
Teraz neviem čo si mám myslieť. To mám takú vysokú inteligenciu? Či nízku?  ;D
Vysvetlivky:
myForm je formulár, s ktorým pracujem.
funkcie majú za úlohu vrátiť nejaký objekt. Napr. DataSet z DataModul, alebo VirtualStringTree, panel a pod. z tohto formulára. Nič iné.
Ukážka kontrétnych riešení
Kód: Delphi [Vybrat]
  1. function GetMasterDataset(FormTag: integer): TIBDataSet;
  2. begin
  3.   case FormTag of
  4.     2: Result := dmSVB.ibdtstSVB;
  5.     4: Result := dmSVB.ibdtstEntry;
  6.     6: Result := dmSVB.ibdtstPatternFlat;
  7.     8: Result := dmSVB.ibdtstPartner;
  8.     10: Result := dmSVB.ibdtstBlock;
  9.     12: Result := dmSVB.ibdtstLandlord;
  10.     14: Result := dmBook.ibdtstAccount4;
  11.     16: Result := dmSVB.ibdtstService;
  12.     25: Result := dmBook.ibdtstSubject;
  13.     26: Result := dmBook.ibdtstAccount5;
  14.     30: Result := dmSVB.ibdtstServiceDefaultValue;
  15.   else
  16.     Result := nil;
  17.   end;
  18. end;
  19. function GetMasterVST(FormTag: integer): TVirtualStringTree;
  20. begin
  21.   case FormTag of
  22.     2: Result := frmSVB.framButtomPanel.vstMaster;
  23.     4: Result := frmEntry.framButtomPanel.vstMaster;
  24.     6: Result := frmPatternFlat.framButtomPanel.vstMaster;
  25.     8: Result := frmPartner.framButtomPanel.vstMaster;
  26.     10: Result := frmBlock.framButtomPanel.vstMaster;
  27.     12: Result := frmLandlord.framButtomPanel.vstMaster;
  28.     14: Result := frmAccountingProcedure.framButtom.vstMaster;
  29.     16: Result := frmServiceObject.vstService;
  30.     25: Result := frmSubject.vstMaster;
  31.     26: Result := frmPlanOfAccounts.framMaster.vstMaster;
  32.     30: Result := frmServiceDefaultValue.vstService;
  33.   else
  34.     Result := nil;
  35.   end;
  36. end;
  37. function GetMasterVSTforBank(): TVirtualStringTree;
  38. begin
  39.   if Assigned(frmSVB) then  // 2
  40.   begin
  41.     Result := frmSVB.framButtomPanel.vstMaster;
  42.   end
  43.   else
  44.   if Assigned(frmPartner) then  // 8
  45.   begin
  46.     Result := frmPartner.framButtomPanel.vstMaster;
  47.   end
  48.   else
  49.   if Assigned(frmLandlord) then  // 12
  50.   begin
  51.     Result := frmLandlord.framButtomPanel.vstMaster;
  52.   end;
  53. end;
  54.  
  55. // Formulár Bank používam na viacerých miestach. Napr. pre SVB, partnera, majiteľa bytu...
  56. function GetMasterFormforBank(): TForm;
  57. begin
  58.   if Assigned(frmSVB) then  // 2
  59.     Result := frmSVB
  60.   else
  61.   if Assigned(frmPartner) then  // 8
  62.     Result := frmPartner
  63.   else
  64.   if Assigned(frmLandlord) then  // 12
  65.     Result := frmLandlord;
  66. end;
  67.  

V podstate chcem zistiť ten správny MasterForm - práve vytovrený/existujúci a používaný. Mám ešte v niektorých prípadoch DetailForm. Vždy je len jeden MasterForm. DetailForm-ov môže byť viac. Nateraz ich mám maximálne dva. Neviem čo prinesie budúcnosť. DetailForm vyriešim na základe riešenia/zistenia MasterForm - teraz ich nechajme bokom.
 
Citace
Tohle překonává i tvůj obvyklý dotazovací styl,
Vždy som s tým mal problém. Vlastne nie ja, ale okolie. To už žiaľ nezmením. Nikdy ma nepovažovali za normálneho a nevedeli ma pochopiť.
« Poslední změna: 15-03-2013, 09:19:34 od Stanislav Hruška »
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1142
  • Karma: 42
    • Verze Delphi: 7, 2010
Re:Zistenie "myForm"
« Odpověď #3 kdy: 15-03-2013, 09:18:13 »
:D :D :D :D

no hele ... ta funkce muze byt univerzalni asi takto

function yyy(jakysiForm: TForm): cosi;
(odpadati ten hnusnej case s miliiony formulari)

a vzdy, pri vytvoreni daneho formulare, ktery se potrebuje dotazovat nejakeho hlavniho formulare,
mu musis nastavit, ktery je ten jeho hlavni formular, tj. mujVedlejsiForm.hlavniForm:=mujHlavniForm,
nebo mujVedlejsjiForm.SetHlavniForm(mujHlavniForm)

a  z vedlejsiho pak jen volas yyy(promennaSHlavnimFormem) :D :D :D

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4992
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Zistenie "myForm"
« Odpověď #4 kdy: 15-03-2013, 09:24:50 »
Zle si ma pochopil. Zjednodušene povedané, hlavný formulár obsahuje len Menu. Ten len zobrazujem a skrýva. Tam nič nerobí.

Ja si vytvorím nejaké formuláre a jeden z nich je Master. A ten chcem zistiť. Robil som to pomocou globálnej premennej, ale teraz ich likvidujem. Preto mi vyskočil tento problém. Možno je v tomto prípade tá globálna premenná na mieste.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2790
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Zistenie "myForm"
« Odpověď #5 kdy: 15-03-2013, 09:32:44 »
Zle si ma pochopil. Zjednodušene povedané, hlavný formulár obsahuje len Menu. Ten len zobrazujem a skrýva. Tam nič nerobí.

Ja si vytvorím nejaké formuláre a jeden z nich je Master. A ten chcem zistiť. Robil som to pomocou globálnej premennej, ale teraz ich likvidujem. Preto mi vyskočil tento problém. Možno je v tomto prípade tá globálna premenná na mieste.
Stale tomu nerozumim, ale jestli ze mas vzdy prave jeden master form, tak ten si snad vytvari svoje detaily a neni prece zadny problem pri vytvareni detailu aby predal sam sebe jako Master, stejne jako se predava Owner/Parent v hierarchii widgetu.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2790
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Zistenie "myForm"
« Odpověď #6 kdy: 15-03-2013, 09:37:12 »
Kód: Delphi [Vybrat]
  1. function GetMasterDataset(FormTag: integer): TIBDataSet;
  2. begin
  3.   case FormTag of
  4.     2: Result := dmSVB.ibdtstSVB;
  5.     ...
  6.     30: Result := dmSVB.ibdtstServiceDefaultValue;
  7.   else
  8.     Result := nil;
  9.   end;
  10. end;
  11.  
No to zase pouzivas neco globalniho, co budes muset updatovat pri pridani formulare a rucne udrzovat nejakou mnozinu FormTagu oproti existujicim formularum a jejich obsahum.

Ve svete OOP by se to resilo polymorfismem, ne? Kazdy Master (nebo cokoli) by mel spolecneho predka a ten by tvoril spolecne rozhrani mezi Master a Slave a sam by si rozhodoval, ze vrati svuj VTV a o jinych by nevedel.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1493
  • Karma: 37
    • Pepak.net
Re:Zistenie "myForm"
« Odpověď #7 kdy: 15-03-2013, 09:40:02 »
Teraz neviem čo si mám myslieť. To mám takú vysokú inteligenciu? Či nízku?  ;D
Radši se neptej.

Citace
myForm je formulár, s ktorým pracujem.
funkcie majú za úlohu vrátiť nejaký objekt. Napr. DataSet z DataModul, alebo VirtualStringTree, panel a pod. z tohto formulára. Nič iné.
Obvykle se to dělá pomocí dědičnosti, třeba pomocí interfaců. Tak, že všechny možné zpracovávané formuláře mají jednu metodu, která přijme ten tvůj tag a vrátí objekt z tohoto formuláře. Ty si napřed určíš formulář, se kterým chceš pracovat (to stejně děláš) a pak zavoláš tuto jeho metodu s požadovaným tagem. Něco jako:
Kód: Delphi [Vybrat]
  1. type
  2.   IZjisteniKomponentyPodleTagu = interface
  3.     function ZjistiKomponentu(Tag: integer): TObject;
  4.   end;
  5. type
  6.   TForm1 = class(TForm, IZjisteniKomponentyPodleTagu)
  7.     public
  8.       function ZjistiKomponentu(Tag: integer): TObject;
  9.     end;
  10. function TForm1.ZjistiKomponentu(Tag: integer): TObject;
  11. begin
  12.   case Tag of
  13.     1: Result := Self.EditNazev;
  14.     2: Result := Self.EditUrl;
  15.     3: Result := Self.ButtonOK;
  16.     ....
  17.     else
  18.        Result := nil;
  19.     end;
  20. end;
  21.  
Kód: Delphi [Vybrat]
  1. procedure UdelejNecoSFormularem(LibovolnyForm: TForm);
  2. var
  3.   Dataset: TDataset;
  4. begin
  5.   Dataset := (LibovolnyForm as IZjisteniKomponentyPodleTagu).ZjistiKomponentu(10) as TDataset;
  6.   ...
  7. end;
Bacha na automatický reference counting u interfaců, tohle je zrovna jeden z (mnoha) případů, kdy je nutné ARC zablokovat. Pokud se na to necítíš, můžeš si udělat nějakého společného předka pro všechny formuláře a v něm definovat ZjistiKomponentu jako virtuální abstraktní metodu - pak se obejdeš úplně bez interfaců.

Citace
Citace
Tohle překonává i tvůj obvyklý dotazovací styl,
Vždy som s tým mal problém. Vlastne nie ja, ale okolie. To už žiaľ nezmením. Nikdy ma nepovažovali za normálneho a nevedeli ma pochopiť.
Buď to změníš, nebo budeš mít i nadále sakra velké problémy s tím, aby ti někdo poradil.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4992
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Zistenie "myForm"
« Odpověď #8 kdy: 15-03-2013, 09:59:52 »
Citace
Buď to změníš, nebo budeš mít i nadále sakra velké problémy s tím, aby ti někdo poradil.
Michal Tučný: Starýho psa novým kouskům
 
Citace
Ty si napřed určíš formulář, se kterým chceš pracovat (to stejně děláš)

Práve že nie. Tu mám problém. Ja ho vytvorím, ale "nič o ňom neviem". Nikde si o ňom nič neukladám, ani inú informáciu. Nepoznám formulár ani jeho tag. Robím to takto:
 
Kód: Delphi [Vybrat]
  1.   Application.CreateForm(TfrmPerson, frmPerson);
  2.   frmPerson.Enabled := True;
  3.   frmPerson.Show;
  4.   Application.CreateForm(TfrmBankAccount, frmBankAccount);
  5.   Application.CreateForm(TfrmLandLord, frmLandLord);
  6.   frmBankAccount.MyOwner := TProprietorForm(frmLandLord);
  7.   frmPerson.MyOwner := TProprietorForm(frmLandLord);
  8. ....
  9.  
MasterForm je v tomto prípade frmLandLord. A ten potrebujem zistiť, ak nechcem použiť globálnu premennú.
Samozrejme, môžem presunúť vytvorenie ostatných formulárov do formulára frmLandLord.
 
Totálne som zabudol, že tam mám MyOwner  >:(   To je z riešenia dokovania okien.
 
« Poslední změna: 15-03-2013, 10:04:03 od Stanislav Hruška »
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2790
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Zistenie "myForm"
« Odpověď #9 kdy: 15-03-2013, 10:36:10 »
Kód: Delphi [Vybrat]
  1. Dataset := (LibovolnyForm as IZjisteniKomponentyPodleTagu).ZjistiKomponentu(10) as TDataset;
  2.  

Bacha na automatický reference counting u interfaců, tohle je zrovna jeden z (mnoha) případů, kdy je nutné ARC zablokovat.
Prece staci, kdyz si udela jednu referenci  pro cely formular, tou si jednak pridrzi tu instanci formulare a dvak nebude muset pokazde psat LibovolnyForm as IZjisteniKomponentyPodleTagu, ale treba jen FMasterIntf.ZjistiKomponentu(10)

I kdyz neco takoveho ZjistiKomponentu(10) as TDataset by se IMHO v OOP designu melo vyskytovat spis vyjimecne, pokud vubec.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4992
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Zistenie "myForm"
« Odpověď #10 kdy: 15-03-2013, 10:46:08 »
Ja vlastne hovorím o tom ako zistím tag formulára (či samotný formulár) ak nepoznám formulár. Úplne jednoducho. Použijem

 Application.CreateForm(TfrmLandLord, frmLandLord);

a čo teraz? Formulár mám + nejaké ďalšie a na pozadí hlavný, aby som to nemal jednoduché. Nepoznám formulár a tým ani jeho tag či inú informáciu. Globálnu premennú chcem obísť.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1493
  • Karma: 37
    • Pepak.net
Re:Zistenie "myForm"
« Odpověď #11 kdy: 15-03-2013, 10:46:46 »
Prece staci, kdyz si udela jednu referenci  pro cely formular, tou si jednak pridrzi tu instanci formulare a dvak nebude muset pokazde psat LibovolnyForm as IZjisteniKomponentyPodleTagu, ale treba jen FMasterIntf.ZjistiKomponentu(10)
Stačilo by, ale ne vždycky to je vhodné - dejme tomu, že do toho Form bude chtít dávat Self.Owner as TForm.

Citace
I kdyz neco takoveho ZjistiKomponentu(10) as TDataset by se IMHO v OOP designu melo vyskytovat spis vyjimecne, pokud vubec.
Pochopitelně. Důvody, proč Stanislav používá takovéhle konstrukce, už jsem radši ani nekomentoval.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1493
  • Karma: 37
    • Pepak.net
Re:Zistenie "myForm"
« Odpověď #12 kdy: 15-03-2013, 10:49:29 »
Ja vlastne hovorím o tom ako zistím tag formulára (či samotný formulár) ak nepoznám formulár. Úplne jednoducho.
Znovu a nějakým lidským jazykem, prosím.

Citace
a čo teraz? Formulár mám + nejaké ďalšie a na pozadí hlavný, aby som to nemal jednoduché. Nepoznám formulár a tým ani jeho tag či inú informáciu. Globálnu premennú chcem obísť.
Pokud vytváříš formuláře takhle, tak k té globální proměnné aspoň jednou přistoupit musíš (radši k frmLandlord než k Screen.Forms).

Normálně se to dělá tak, že si formuláře vytváříš za běhu a v okamžiku vytvoření si instanci rovnou uložíš do lokální proměnné.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2790
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Zistenie "myForm"
« Odpověď #13 kdy: 15-03-2013, 10:56:46 »
Ja si vytvorím nejaké formuláre a jeden z nich je Master. A ten chcem zistiť. Robil som to pomocou globálnej premennej, ale teraz ich likvidujem. Preto mi vyskočil tento problém. Možno je v tomto prípade tá globálna premenná na mieste.
Ja bych to jako globalni promennou nedelal, protoze dneska rikas, ze mas jenom jeden Master form, ale zitra muze zakaznik pozadovat, aby mohl otevrit jiny master, aniz by ten predchozi zavrel a budes prerabat...

Jinak muzes kazdy Master formular vybavit nejakou vlastnosti, podle ktere si ho budou umet najit, ale pokud existuje jasna hierarchie mezi formulari, tak bych ji promitnul do spravy zivotniho cyklu formularu tj. master by si svoje slaves vytvarel a rusil sam a nastavil by se jim jako master.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4992
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Zistenie "myForm"
« Odpověď #14 kdy: 15-03-2013, 15:13:28 »
To sa naozaj vyjadrujem tak debilne?
 Skúsim ešte posledný zúfalý pokus. Vytvorím si formulár
Application.CreateForm(TfrmLandLord, frmLandLord);
Na základe Vašich doporúčaní sa chcem vyhnúť globálnej premennej. (Tak som to mal doteraz. Padlo slovo o lokálnej premennej, ale tomu som neporozumel.) Ďalej mám nejakú funkciu (alebo vlastnosť formulára), ktorá mi vráti požadované.
Ale funkcii neviem poslať formulár/tag a vlastnosť tiež nevyvolám(?), nakoľko nepoznám formulár. Nemám na ten formulár žiaden odkaz. Ja vlastne neviem, ktorý formulár som práve vytvoril.
 
V OOP som slabý. Môžem vytvoriť predka, ktorý bude mať danú vlastnosť. Tá ovšem musí byť minimálne overide. V potomkovi ju prepíšem. Dokážem vyvolať v predkovi (ten sa mi nemení, čiže ho stále "poznám") vlastnosť v potomkovi? Pokiaľ viem, tak nie. (Opačne áno.)
Hm, po odoslaní príspevku ma napadlo, že ten predok vôbec nemusí byť (a ani nebude) priamo prístupný.
 
Citace
Jinak muzes kazdy Master formular vybavit nejakou vlastnosti, podle ktere si ho budou umet najit
Tejto časti nerozumiem ako to/čo tým myslíš.
Citace
ale pokud existuje jasna hierarchie mezi formulari, tak bych ji promitnul do spravy zivotniho cyklu formularu tj. master by si svoje slaves vytvarel a rusil sam a nastavil by se jim jako master.
Existuje. To tak prerobím. Tu problém nebude.
Citace
Ja bych to jako globalni promennou nedelal, protoze dneska rikas, ze mas jenom jeden Master form, ale zitra muze zakaznik pozadovat, aby mohl otevrit jiny master, aniz by ten predchozi zavrel a budes prerabat...
Hm, to teda teraz vylúčiť nemôžem. A postačím si na to sám.
« Poslední změna: 15-03-2013, 15:15:53 od Stanislav Hruška »
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1493
  • Karma: 37
    • Pepak.net
Re:Zistenie "myForm"
« Odpověď #15 kdy: 15-03-2013, 15:31:13 »
To sa naozaj vyjadrujem tak debilne?
Možná ne debilně, ale určitě nesrozumitelně. Bohužel.

Citace
Na základe Vašich doporúčaní sa chcem vyhnúť globálnej premennej. (Tak som to mal doteraz. Padlo slovo o lokálnej premennej, ale tomu som neporozumel.)
Pokud formulář vytváříš takhle pomocí Delphi (jednoduché, defaultní, ale velmi velmi omezující), tak se globální proměnné nevyhneš. Mohl by sis ji tak akorát zkopírovat do nějaké lokální proměnné (Form123.FormularKteryMeVlastni := Form356;), ovšem nepřinese ti to téměř žádnou výhodu.

Dělá se to tak, že pomocí Delphi se vytvoří jen jediný formulář, všechny ostatní si vytváříš dynamicky v okamžiku, kdy je potřebuješ, a ukládáš si je do proměnných vytvářející komponenty. Pak máš mimo jiné zaručeno, že vytvářející komponenta vždy ví, kde má své podformuláře, a dokáže si řídit její životní cyklus. Například:

Kód: Delphi [Vybrat]
  1. type
  2.   TForm1 = class(TForm)
  3.     procedure FormCreate(Sender: TObject);
  4.     procedure FormDestroy(Sender: TObject);
  5.     procedure Button1Click(Sender: TObject);
  6.   private
  7.     PodformularA: TPodformularA;
  8.     PodformularB: TPodformularB;
  9.   end;
  10.  
  11. procedure TForm1.FormCreate(Sender: TObject);
  12. begin
  13.   PodformularA := TPodformularA.Create(Self);
  14.   PodformularB := TPodformularB.Create(Self);
  15. end;
  16.  
  17. procedure TForm1.FormDestroy(Sender: TObject);
  18. begin
  19.   FreeAndNil(PodformularA);
  20.   FreeAndNil(PodformularB);
  21. end;
  22.  
  23. procedure TForm1.Button1Click(Sender: TObject);
  24. var
  25.   F: TPodformularC;
  26. begin
  27.   if PodformularA.ShowModal = mrOK then
  28.     begin
  29.     F := TPodfomularC.Create(Self);
  30.     try
  31.       F.ShowModal;
  32.     finally
  33.       FreeAndNil(F);
  34.       end;
  35.     end;
  36. end;

Citace
Ja vlastne neviem, ktorý formulár som práve vytvoril.
Jak to, že ne? To bys skoro vědět měl. Pokud to nevíš, je logika programu úplně blbě.
 
Citace
Môžem vytvoriť predka, ktorý bude mať danú vlastnosť. Tá ovšem musí byť minimálne overide. V potomkovi ju prepíšem. Dokážem vyvolať v predkovi (ten sa mi nemení, čiže ho stále "poznám") vlastnosť v potomkovi? Pokiaľ viem, tak nie. (Opačne áno.)
Samozřejmě že ano. Pokud chceš příklad, tak se podívej například na TDataset.Locate.

Citace
Hm, po odoslaní príspevku ma napadlo, že ten predok vôbec nemusí byť (a ani nebude) priamo prístupný.
No a?

Citace
Citace
Jinak muzes kazdy Master formular vybavit nejakou vlastnosti, podle ktere si ho budou umet najit
Tejto časti nerozumiem ako to/čo tým myslíš.
Kód: Delphi [Vybrat]
  1. type
  2.   TForm1 = class(TForm)
  3.   private
  4.     fMujVlastnik: THlavniFormular;
  5.   public
  6.     property MujVlastnik: THlavniFormular read fMujVlastnik write fMujVlastnik;
  7.   end;

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4992
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Zistenie "myForm"
« Odpověď #16 kdy: 15-03-2013, 15:40:48 »
Citace
Jak to, že ne? To bys skoro vědět měl. Pokud to nevíš, je logika programu úplně blbě.
Ja som to myslel tak, že vytvorím formulár v Taction. Samozrejme ja ako osoba viem ktorý. Ale môj kód to nevie = neviem s ním pracovať napr. vo funkcii, lebo ho tam neviem poslať.
 
Ak to z Locate vyčítam, tak by som to s uvedenými ukážkami mal zvládnuť.
 
Ďakujem. Príjemný víkend.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1493
  • Karma: 37
    • Pepak.net
Re:Zistenie "myForm"
« Odpověď #17 kdy: 15-03-2013, 15:47:14 »
Citace
Jak to, že ne? To bys skoro vědět měl. Pokud to nevíš, je logika programu úplně blbě.
Ja som to myslel tak, že vytvorím formulár v Taction. Samozrejme ja ako osoba viem ktorý. Ale môj kód to nevie = neviem s ním pracovať napr. vo funkcii, lebo ho tam neviem poslať.
Funkci dáš parametr typu TForm a do tohoto parametru dáš vytvořený formulář.
 
Citace
Ak to z Locate vyčítam, tak by som to s uvedenými ukážkami mal zvládnuť.
Možná ještě spíš se podívej na TDataset.Open a prokrokuj se až k místu, které volá InternalOpen - jehož implementaci určuje právě až konkrétní potomek, o kterém TDataset nic neví.

Ale můžeš vyjít i z čehokoliv jiného, třeba TStrings.Add - ten také neví nic o tom, jak je v konkrétním potomkovi vkládání řešené, stačí mu, že ví, jakou to má deklaraci. Obecně cokoliv, co má abstract, je příprava na to, aby předek mohl volat potomka, o kterém nic neví...

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4992
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Zistenie "myForm"
« Odpověď #18 kdy: 15-03-2013, 16:07:50 »
Citace
Funkci dáš parametr typu TForm a do tohoto parametru dáš vytvořený formulář.
To už si robíš zo mňa srandu  ;)
Celý čas sa bavím o tom, že vytvorený formulár neviem získať.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1493
  • Karma: 37
    • Pepak.net
Re:Zistenie "myForm"
« Odpověď #19 kdy: 15-03-2013, 16:26:38 »
Moc by mě zajímal kód, který dokáže vytvořit instanci třídy (libovolné) a pak tuto instanci nedokáže předat dál. To bych fakt rád viděl.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2790
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Zistenie "myForm"
« Odpověď #20 kdy: 15-03-2013, 22:34:11 »
Citace
Jinak muzes kazdy Master formular vybavit nejakou vlastnosti, podle ktere si ho budou umet najit
Tejto časti nerozumiem ako to/čo tým myslíš.
Uz to nakous pepak, rekneme, ze si definujes nejake rozhrani, ktere potrebujes pro komunikace slave -> master.
Pak si muzes udelat abstraktniho predka spolecneho vsem master formularu, ve kterem deklarujes to rozhrani, napr.
Kód: Delphi [Vybrat]
  1. TAbstractMasterForm = class(TAbstractForm)
  2. protected
  3.   function _GetNavigatingTree: TVirtualStringTree; virtual; abstract;
  4.   function _GetMainGrid: TVirtualStringTree; virtual; abstract;
  5. public
  6.   property NavigatingTree: TVirtualStringTree read _GetNavigatingTree;
  7.   property MainGrid: TVirtualStringTree read _GetNavigatingTree;
  8.   ...
  9. end;
  10.  
No a pak muzes hledat vsechny instance formularu a zjistovat, jestli implementuji potrebne master rozhrani  tj. jestli jsou potomky TAbstractMasterFrom tj. pomoci InheritsFrom

Nebo muzes misto abstraktniho predka definovat primo interface napr.
Kód: Delphi [Vybrat]
  1. IMasterForm = interface(IInterface)['{B343B0A7-3C0B-4011-86FF-822A5A17128D}']
  2.   function GetNavigatingTree: TVirtualStringTree;
  3.   function GetMainGrid: TVirtualStringTree;
  4.   property NavigatingTree: TVirtualStringTree read GetNavigatingTree;
  5.   property MainGrid: TVirtualStringTree read GetNavigatingTree;
  6. end
  7.  
  8. TMaster1Form = class(TForm, IMasterForm)
  9. private
  10.   // Implementace metod rozhrani IMasterForm
  11.   function GetNavigatingTree: TVirtualStringTree;
  12.   function GetMainGrid: TVirtualStringTree;
  13. ...
  14.  

A formular muzes hledat treba takhle:
Kód: Delphi [Vybrat]
  1. var
  2.   i: integer;
  3.   iMaster: IMasterForm;
  4. begin
  5.   iMaster := nil;
  6.   for i := 0 to Screen.FormCount-1 do
  7.     if Supports(Screen.Forms[i], IMasterForm, iMaster) then
  8.       Break;
  9.   if not Assigned(iMaster) then
  10.     raise Exception.Create('IMasterForm interface not found');
  11.   for i := 0 to iMaster.MainGrid.RootNode.ChildCount-1 do
  12.     begin
  13.       //
  14.     end;
  15. end;
  16.  

A jak uz jsme ti s pepak psali, nemusis nic hledat, ale predavat to primo v hierarchii instanci.

Ale bud dedicnost nebo interfejsy bys mel pouzit. Interfejsy maji vyhodu, ze jich muzes udelat, kolik chces, takze nektere rozhrani muze implementovat jak form, tak treba datamodule nebo buhvi co. Jestli mas implementovane rozhrani budes zjistovat pomoci Supports
« Poslední změna: 15-03-2013, 22:38:15 od pf1957 »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4992
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Zistenie "myForm"
« Odpověď #21 kdy: 16-03-2013, 09:32:34 »
Citace
Moc by mě zajímal kód, který dokáže vytvořit instanci třídy (libovolné) a pak tuto instanci nedokáže předat dál. To bych fakt rád viděl.

Samozrejme že ju dokáže odovzdať. Ale na základe mojich vedomostí napr. do nejakej globálnej premennej, čo nechcem.
 
Keď to už teraz nedám dokopy, tak nikdy. Už si len vybrať (najprv pochopiť  ??? ) či interface alebo OOP.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1493
  • Karma: 37
    • Pepak.net
Re:Zistenie "myForm"
« Odpověď #22 kdy: 16-03-2013, 09:35:37 »
Samozrejme že ju dokáže odovzdať. Ale na základe mojich vedomostí napr. do nejakej globálnej premennej, čo nechcem.
Kód: Delphi [Vybrat]
  1. function VytvoritInstanci: TObject;
  2. begin
  3.   Result := TTrida.Create(...);
  4. end;
  5.  
  6. procedure VytvorInstanci2(out Instance: TObject);
  7. begin
  8.   Instance := TTrida.Create(...);
  9. end;
Toto můžeš opakovat pořád dál, dokud se nedostaneš do místa, kde můžeš instanci uložit např. do proměnné v instanci třídy.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4992
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Zistenie "myForm"
« Odpověď #23 kdy: 16-03-2013, 09:40:01 »
Toto by ma asi nikdy nenapadlo. Veľmi pekné. I tak si naštudujem ostatné tu uvedené techniky.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4992
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Zistenie "myForm"
« Odpověď #24 kdy: 17-03-2013, 12:58:11 »
Ešte niečo. Mám unit Docked na dokovanie okien od <z>. Preto som ho využil a rozšíril a vami nahodené riešenia.
 
Interface face to face ma poriadne vycvičil. Už som sa s ním čiastočne dohodol.
 
Viem, že "function GetMasterForm" a "function TMasterForm.GetForm()" mi vrátia to isté. Niečo som nepochopil a čosi nevidím. function GetMasterForm som doplnil kvôli tomu, že priamo s GetForm.NejakaMetoda sa nedá pracovať(?).

Hlavne, že som chcel funkciu na automatické vrátenie formulára. A teraz ho tam dávam natvrdo.
Kód: Delphi [Vybrat]
  1. unit Docked;
  2. type
  3.   IMasterForm = interface (IInterface) ['{741B5A7A-BBC9-4EF1-B1AD-A9ECA099B9F0}']
  4.     function GetMasterForm: TForm;
  5.     property MasterForm: TForm read GetMasterForm;
  6.   TMasterForm = class(TForm, IMasterForm)
  7.   public
  8.     function GetForm(): TForm;
  9.     function GetMasterForm: TForm; virtual; abstract;
  10. var
  11.   MasterForm: TMasterForm;
  12.   fDockedFormList: TList;
  13. implementation
  14. function TMasterForm.GetForm(): TForm;
  15. var
  16.   i: integer;
  17.   iMaster: IMasterForm;
  18. begin
  19.   iMaster := nil;
  20.   for i := 0 to Screen.FormCount-1 do
  21.     if Supports(Screen.Forms[i], IMasterForm, iMaster) then
  22.     begin
  23.       Result := iMaster.MasterForm;
  24.       Break;
  25.     end;
  26.   if not Assigned(iMaster) then
  27.     raise Exception.Create('IMasterForm interface not found');
  28. end;
  29. procedure TMasterForm.DoDestroy;
  30. begin
  31.   fDockedFormList.Clear;
  32.   inherited;
  33. end;
  34. V hlavnom formulári
  35. procedure TfrmMain.actSVBExecute(Sender: TObject);
  36. begin
  37.   Application.CreateForm(TfrmSVB, frmSVB);
  38. end;
  39. unit SVB;
  40. interface
  41. type
  42.   TfrmSVB = class(TMasterForm, IMasterForm)
  43.   public
  44.     function GetMasterForm: TForm; override;
  45. var
  46.   frmSVB: TfrmSVB;
  47. implementation
  48. function TfrmSVB.GetMasterForm: TForm;
  49. begin
  50.   Result := Self;
  51. end;
  52. procedure TfrmSVB.FormCreate(Sender: TObject);
  53. begin
  54.   MasterForm := Self;
  55. A použitie napr.
  56.   MasterForm.GetMasterDataset.Delete;
  57.  
Najprv mi vadí, že musím priradiť do MasterForm svoj formulár.
Fukcia GetForm() mi vráti požadovaný form, ale neviem sa dostať na jeho ozhranie. Vráti mi TForm a ja neviem ako ďalej
GetForm.GetMasterForm i všetky ostatné mi samozrejme nefungujú.
Dá sa zbaviť priradenia MasterForm := Self a zaistenia fungovania pomocou GetForm.nejakametoda?
 
Poďakovanie
Vďaka vám som dosiahol
 
1) zlikvidovanie všetkých funkcií ktoré slúžili na získanie objektu
2) zrušenie všetkých parametrov vo funkciách paracujúcich s objektmi formulárov
3) sprehľadnenie zdrojáka
To ma veľmi teší
« Poslední změna: 17-03-2013, 13:20:49 od Stanislav Hruška »
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2790
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Zistenie "myForm"
« Odpověď #25 kdy: 17-03-2013, 13:20:26 »
Hlavne, že som chcel funkciu na automatické vrátenie formulára. A teraz ho tam dávam natvrdo.
No ja mam pocit, ze jsi splacal vsechny alternativy od predavani master form pres polymorfismus az po interfacy do jednoho podivneho reseni, misto aby sis vybral jedno.

1. Pokud si predas master form, tak si ho zapamatujes v poli formulare a pak tu zapamatovanou hodnotu pouzivas. Nic dalsiho nepotrebujes.
2. Pokud pouzijes polymorfismus tj. nejakeho spolecneho predka master formularu, tak si pomoci InheritsFrom zjistis, jestli je formular jeho potomkem a pak si ho pretypujes na toho spolecneho predka a nadale pouzivas jako hodnotu predanou v bode 1).
3. Pokud pouzijes interface, tak si zkontroluje, jestli formular implementuje ten interface a jestli jo, tak si ten interface zapamatujes a s formulares operujes pres to zapamatovane rozhrani.



Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2790
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Zistenie "myForm"
« Odpověď #26 kdy: 17-03-2013, 13:23:46 »
Takze pokud nechces nic predavat, tak si ve slave formulari v OnCreate vyhledej bud podle InheritsFrom nebo Supports mezi Screen.Forms[] , pretypuj a zapamatuj bud form nebo interface.

A Abys to nemusel delat porad v kazdem OnCreate, tak si udelej predka vsechn slave formularu a dej do nej metodu FindMasterForm(...)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4992
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Zistenie "myForm"
« Odpověď #27 kdy: 17-03-2013, 13:24:21 »
Citace
No ja mam pocit, ze jsi splacal vsechny alternativy od predavani master form pres polymorfismus az po interfacy do jednoho podivneho reseni, misto aby sis vybral jedno.
To mám aj ja. Idem domov a na základe Tvojich rád si to idem upraviť.
Toho spoločného predka si vyžaduje práve Docked.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4992
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Zistenie "myForm"
« Odpověď #28 kdy: 17-03-2013, 13:27:23 »
Citace
a zapamatuj bud form nebo interface.
form si zapamätám uložením do premennej. Ale ako si zapamätám interface. Ja si to neviem predstaviť (vizualizovať)  a tým pádom mám problém - nehnem sa. Tak fungujem.
 
Citace
A Abys to nemusel delat porad v kazdem OnCreate, tak si udelej predka vsechn slave formularu a dej do nej metodu FindMasterForm(...)
Toto nepotrebujem. Ja tam mám nahodené v MasterForm všetko čo potrebujem. Len sa k tomu treba správne dostať.
« Poslední změna: 17-03-2013, 13:33:34 od Stanislav Hruška »
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2790
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Zistenie "myForm"
« Odpověď #29 kdy: 17-03-2013, 13:40:09 »
form si zapamätám uložením do premennej. Ale ako si zapamätám interface. Ja si to neviem predstaviť (vizualizovať)  a tým pádom mám problém - nehnem sa. Tak fungujem.
stejne jako ten form, napr. tohle v tom kodu mas lokalni (automatickou) promennou
Kód: Delphi [Vybrat]
  1. iMaster: IMasterForm;
  2.  
Takze kdyz s z toho udelas pole formulare, tak treba
Kód: Delphi [Vybrat]
  1. FMasterIntf: IMasterForm;
  2.  

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2790
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Zistenie "myForm"
« Odpověď #30 kdy: 17-03-2013, 13:42:01 »
A priradis to bud
Kód: Delphi [Vybrat]
  1. FMasterIntf := Form as IMasterForm;
  2.  
nebo
Kód: Delphi [Vybrat]
  1.   if not Supports(Form, IMasterForm, FMasterIntf) then
  2.     ...
  3.  

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4992
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Zistenie "myForm"
« Odpověď #31 kdy: 18-03-2013, 08:10:24 »
Interface som vyhodil. Ak pracujem priamo vo formulári tak GetNieco funguje bez problémov.
Ak to chcem použiť mimo formulára, tak musím v form.onCreate priradiť   
Docked.MasterForm := Self;

 Potom to používam
 DetailVST := MasterForm.GetDetailVST;
 
Otázka znie či to je dobre, alebo mám správne poslať do funkcie daný formulár. Teraz mám zásadne len jeden MasterForm. Ale čo ak ich bude viac?
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.