Autor Téma: Zistenie "myForm"  (Přečteno 6229 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.