Autor Téma: TfrmFormMain = class(TBasalForm) -> nezbehnú udalosti v TBasalForm  (Přečteno 1193 krát)

Offline Stanislav Hruška

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

Kód: Delphi [Vybrat]
  1. unit BasalForm;
  2. interface
  3. type
  4.   TBasalForm = class(TForm)
  5.   strict protected
  6.     procedure CreateObjects; virtual;
  7.     procedure CreateSQL; virtual;
  8.     procedure SetForm; virtual;
  9.   public
  10.     constructor CreateForm;
  11.     destructor Destroy; override;
  12.     property pRecord: TList<Pointer> read FpRecord;
  13.   end;
  14. implementation
  15. constructor TBasalForm.CreateForm;
  16. begin
  17.   inherited Create(nil);
  18.   SetForm;
  19. end;
  20.  
  21.  
  22. destructor TBasalForm.Destroy;
  23. begin
  24.   if Assigned(oGlobalVar) and (oGlobalVar.ListOfObjects.Count > 0) then
  25.     oGlobalVar.DestroyObjects;
  26.   inherited;
  27. end;
  28.  
  29.  
  30. procedure TBasalForm.CreateObjects;
  31. begin
  32. end;
  33.  
  34.  
  35. procedure TBasalForm.CreateSQL;
  36. begin
  37. end;
  38.  
  39.  
  40. procedure TBasalForm.SetForm;
  41. begin
  42.   CreateSQL;
  43.   CreateObjects;
  44. end;
Všade to funguje (CreateForm, Destroy), len pre hlavný formulár aplikácie nie. Ten vytváram až po spustení aplikácie dynamicky. Netuším prečo a tak to neviem spojazdniť.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1646
  • Karma: 65
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Jakym zpusobem vytvaris ten hlavni form? Tvoris jej pomoci TApplication.CreateForm? Pokud ano, pak vez, ze ta zminovana metoda vola konstruktor Create.
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3938
  • Karma: 35
    • Verze Delphi: XE7 professional
Áno, tvorím ho tak. Takže jedna vec je jasná. Ako dosiahnem, aby sa mi zavolal BasalForm.Create?
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1646
  • Karma: 65
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Kód: Delphi [Vybrat]
  1. type
  2.   TBasalForm = class(TForm)
  3.   public
  4.     constructor Create(AOwner: TComponent = nil); reintroduce; override; // nepovinny parametr
  5.   end;
  6.  
  7. implementation
  8.  
  9. constructor TBasalForm.Create(AOwner: TComponent = nil); // nepovinny parametr
  10. begin
  11.   inherited Create(AOwner);
  12.   ...
  13. end;
« Poslední změna: 25-01-2019, 13:12:27 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3938
  • Karma: 35
    • Verze Delphi: XE7 professional
Ďakujem, už to ide. A ja si pozriem prečo.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1646
  • Karma: 65
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Ja jen prekryl a schoval puvodni konstruktor Create formulare (jenz se vola uvnitr metody TApplication.CreateForm) konstruktorem s nepovinnym parametrem takze je mozne jej volat i bez parametru (cimz se do vlastnika formulare dosadi nil).

P.S. k vytvoreni metod bez implementace je vhodnejsi pouzit direktivy virtual; abstract; nez jen virtual s prazdnou implementaci. Metody by vzdy nejakou implementaci mit mely; pokud realnou implementaci neobsahuji, mely by alespon vyvolat vyjimku ENotImplemented, pripadne ENotSupportedException.
« Poslední změna: 25-01-2019, 13:50:21 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2441
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
P.S. k vytvoreni metod bez implementace je vhodnejsi pouzit direktivy virtual; abstract; nez jen virtual s prazdnou implementaci. Metody by vzdy nejakou implementaci mit mely; pokud realnou implementaci neobsahuji, mely by alespon vyvolat vyjimku ENotImplemented, pripadne ENotSupportedException.
To je hloupost: pokud pouzivam polymorfismus, tak existuji dva zakladni pripady:
- chci prinutit kazdeho potomka, ze neco musi implementovat, tak pouziju abstract
- chci dat kazdemu potomkovi moznost prekryt implicitni chovani a pak pouziju virtual a v bazalni tride udelam spolecnou implementaci, treba prazdnou by default.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3938
  • Karma: 35
    • Verze Delphi: XE7 professional
Práve som napísal odpoveď, ale toto je podstatne lepšie a výstižnejšie.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1646
  • Karma: 65
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
To je hloupost: pokud pouzivam polymorfismus, tak existuji dva zakladni pripady:
- chci prinutit kazdeho potomka, ze neco musi implementovat, tak pouziju abstract
- chci dat kazdemu potomkovi moznost prekryt implicitni chovani a pak pouziju virtual a v bazalni tride udelam spolecnou implementaci, treba prazdnou by default.

S tou prazdnou metodou nesouhlasim. Pokud nema metoda implementaci, mela by byt abstraktni. Pokud i presto chces implementaci deklarovat, mel bys IMHO stejne jako v pripade volani neprekryte abstraktni metody vyvolat vyjimku.
« Poslední změna: 25-01-2019, 15:16:25 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1390
  • Karma: 34
    • Pepak.net
Excellent
Rated 1 time
S tou prazdnou metodou nesouhlasim. Pokud nema metoda implementaci, mela by byt abstraktni. Pokud i presto chces implementaci deklarovat, mel bys IMHO stejne jako v pripade volani neprekryte abstraktni metody vyvolat vyjimku.
Ty necítíš rozdíl mezi metodou, která nemá implementaci, a metodou, která má implementaci, která nic nedělá? Nebo jsi zastáncem názoru, že metoda TObject.AfterConstruction měla být deklarována jako abstract, protože přece nemá implementaci a každý potomek TObject si ji může snadno naimplementovat podle svých představ?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3938
  • Karma: 35
    • Verze Delphi: XE7 professional
Citace
Pokud i presto chces implementaci deklarovat, mel bys IMHO stejne jako v pripade volani neprekryte abstraktni metody vyvolat vyjimku.
A toto je vec ktorej nerozumiem. Prečo mám obsluhovať nejakú výnimku, keď to nie je chyba, ale zámer (prázdna rutina)? Môžeš mi to vysvetliť? A ani si neviem predstaviť ako by taká obsluha výnimky mala vyzerať.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2441
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
TObject.AfterConstruction měla být deklarována jako abstract, protože přece nemá implementaci a každý potomek TObject si ji může snadno naimplementovat podle svých představ?
Lepsi priklad pro Delphistu asi neexistuje.

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1646
  • Karma: 65
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
S tou prazdnou metodou nesouhlasim. Pokud nema metoda implementaci, mela by byt abstraktni. Pokud i presto chces implementaci deklarovat, mel bys IMHO stejne jako v pripade volani neprekryte abstraktni metody vyvolat vyjimku.
Ty necítíš rozdíl mezi metodou, která nemá implementaci, a metodou, která má implementaci, která nic nedělá? Nebo jsi zastáncem názoru, že metoda TObject.AfterConstruction měla být deklarována jako abstract, protože přece nemá implementaci a každý potomek TObject si ji může snadno naimplementovat podle svých představ?

Jiste. Jen si stojim za tim, ze by takova metoda mela zajistit vyvolani udalosti nez nedelat vubec nic.

Citace
Pokud i presto chces implementaci deklarovat, mel bys IMHO stejne jako v pripade volani neprekryte abstraktni metody vyvolat vyjimku.
A toto je vec ktorej nerozumiem. Prečo mám obsluhovať nejakú výnimku, keď to nie je chyba, ale zámer (prázdna rutina)? Môžeš mi to vysvetliť? A ani si neviem predstaviť ako by taká obsluha výnimky mala vyzerať.

Pro me je prazdna metoda chybou implementace.
« Poslední změna: 25-01-2019, 21:07:28 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1390
  • Karma: 34
    • Pepak.net
Jiste. Jen si stojim za tim, ze by takova metoda mela zajistit vyvolani udalosti nez nedelat vubec nic.
A řešit situaci, kdy stejnou "událost" bude chtít víc různých tříd v řetězci potomků, budeme jak? Seznamem zájemců o obsluhu události? Pořadí událostí bude určeno čím? Jak zařídím, aby potomek úplně nahradil událost z předka?

Jako pro mě za mě si tak programuj, ale můj názor je, že tvoje poněkud fundamentalistické lpění na událostech všude je pomalé, paměťově neefektivní, neohrabané a nedokáže řešit všechny situace, které mohou nastat. Neříkám, že nemáme nikdy používat události - někdy jsou užitečné, tak je použijme, ale podle mě je dobré mít na výběr. Tak, jak to je ve VCL - podle situace se rozhodnu, jestli chci dát událost do OnShow, nebo jestli overridnu DoShow.

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1646
  • Karma: 65
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
A řešit situaci, kdy stejnou "událost" bude chtít víc různých tříd v řetězci potomků, budeme jak? Seznamem zájemců o obsluhu události? Pořadí událostí bude určeno čím?

Prekrytim a pridanim kodu implementace dane metody vyvolavajici udalost, jak jinak...

Jak zařídím, aby potomek úplně nahradil událost z předka?

Tim, ze nezavolas inherited, nebo snad nevis, co se ve Tvych tridach odehrava? Volat bezhlave inherited metody mi neprijde v poradku (opravdu je lepsi rict nejakym zpusobem, sorry, ja to, rekneme, "jeste" neimplementoval). Tedy, za me by mela pri volani takove metody alespon vypadnout chyba o chybejici implementaci nebo o volani abstraktni metody (coz se ostatne deje s direktivou abstract).

Jako pro mě za mě si tak programuj, ale můj názor je, že tvoje poněkud fundamentalistické lpění na událostech všude je pomalé, paměťově neefektivní, neohrabané a nedokáže řešit všechny situace, které mohou nastat.

Budu. A nejde o udalosti, jen o prazdne metody. Metoda podle me nema byt prazdna. Runtime chyba nebo minimalne varovani kompilatoru v pripade prazdne implementace metody je pro me minimem. Porad totiz nevidim argument, jenz by me presvedcil k tomu, abych nechal metodu prazdnou a z potomka volal inherited s tim, ze se nic nestane...

Jiste, spousta lidi si tu rekne, co zase ten delfin plodi za nesmysly, ale to jsem zazil. Lidi nebyli schopni ani vlozit do takove prazdne metody komentar, natoz napr. ToDo polozku...
« Poslední změna: 26-01-2019, 06:48:58 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Kolik je šest plus čtyři (slovem):