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

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4338
  • Karma: 38
    • 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.

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1820
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:TfrmFormMain = class(TBasalForm) -> nezbehnú udalosti v TBasalForm
« Odpověď #1 kdy: 25-01-2019, 12:52:21 »
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 the WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:TfrmFormMain = class(TBasalForm) -> nezbehnú udalosti v TBasalForm
« Odpověď #2 kdy: 25-01-2019, 13:01:02 »
Á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.

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1820
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:TfrmFormMain = class(TBasalForm) -> nezbehnú udalosti v TBasalForm
« Odpověď #3 kdy: 25-01-2019, 13:09:18 »
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 the WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:TfrmFormMain = class(TBasalForm) -> nezbehnú udalosti v TBasalForm
« Odpověď #4 kdy: 25-01-2019, 13:27:45 »
Ďakujem, už to ide. A ja si pozriem prečo.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1820
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:TfrmFormMain = class(TBasalForm) -> nezbehnú udalosti v TBasalForm
« Odpověď #5 kdy: 25-01-2019, 13:36:19 »
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 the WTFPL license! No more Google, go duck, go!

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2568
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
Re:TfrmFormMain = class(TBasalForm) -> nezbehnú udalosti v TBasalForm
« Odpověď #6 kdy: 25-01-2019, 15:04:51 »
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ů: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:TfrmFormMain = class(TBasalForm) -> nezbehnú udalosti v TBasalForm
« Odpověď #7 kdy: 25-01-2019, 15:07:50 »
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.

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1820
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:TfrmFormMain = class(TBasalForm) -> nezbehnú udalosti v TBasalForm
« Odpověď #8 kdy: 25-01-2019, 15:14:24 »
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 the WTFPL license! No more Google, go duck, go!

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1412
  • Karma: 34
    • Pepak.net
Re:TfrmFormMain = class(TBasalForm) -> nezbehnú udalosti v TBasalForm
« Odpověď #9 kdy: 25-01-2019, 16:07:08 »
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ů: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:TfrmFormMain = class(TBasalForm) -> nezbehnú udalosti v TBasalForm
« Odpověď #10 kdy: 25-01-2019, 16:49:23 »
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ů: 2568
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
Re:TfrmFormMain = class(TBasalForm) -> nezbehnú udalosti v TBasalForm
« Odpověď #11 kdy: 25-01-2019, 17:40:05 »
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.

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1820
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:TfrmFormMain = class(TBasalForm) -> nezbehnú udalosti v TBasalForm
« Odpověď #12 kdy: 25-01-2019, 21:04:18 »
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 the WTFPL license! No more Google, go duck, go!

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1412
  • Karma: 34
    • Pepak.net
Re:TfrmFormMain = class(TBasalForm) -> nezbehnú udalosti v TBasalForm
« Odpověď #13 kdy: 26-01-2019, 05:24:45 »
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.

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1820
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:TfrmFormMain = class(TBasalForm) -> nezbehnú udalosti v TBasalForm
« Odpověď #14 kdy: 26-01-2019, 06:17:39 »
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 the WTFPL license! No more Google, go duck, go!