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

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.