Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie funktioniert der OnCreate-Eventhandler (https://www.delphipraxis.net/136661-wie-funktioniert-der-oncreate-eventhandler.html)

Aphton 5. Jul 2009 13:41


Wie funktioniert der OnCreate-Eventhandler
 
Hierbei handelt es sich ausschließlich um eine Logikfrage:

Wie zum Teufel funktioniert ein OnCreate-Eventhandler.

Einer Instanz kann man doch, bevor sie noch nicht erstellt wurde, keinen Eventhandler zuweisen?!

Beispiel mit Destroy

Delphi-Quellcode:
var
  C: TMyClass;
...
  C := TMyClass.Create;
  C.OnDestroy := DestroyEvent;
  C.Free; // Hier wird Destroyaufgerufen, in der wiederum DestroyEvent() aufgerufen wird...
Die einzige Möglichkeit, die mir grad so einfällt, wäre, dass man dem Constructor gleich den Eventhandler mitgibt

Delphi-Quellcode:
  C := TMyClass.Create( CreateEvent ); //Edit
Sorry für die blöde Frage

MfG
Emre

rollstuhlfahrer 5. Jul 2009 13:54

Re: Wie funktioniert der OnCreate-Eventhandler
 
Hallo Aphton,

das OnCreate-Ereignis gibt es doch eigentlich nur bei den VCL-Komponenten, wenn sie per Ressource ihre Parameter zugewiesen bekommen. In eigenen Objekten/Klasses/WasAuchImmer müsste das OnCreate-Ereignis definitiv per Parameter an den Konsturktor übergeben werden. Alles andere finde ich nicht logisch. Und nach dem Konstruktor wird dann sofort die AfterConstruction-Methode aufgerufen. Also bleibt wirklich kein Platz mehr, irgendwo noch eine Zuweisung machen zu können.

Hier nochmal, wie das bei TForm geht:
Delphi-Quellcode:
{ TCustomForm }

constructor TCustomForm.Create(AOwner: TComponent);
begin
  GlobalNameSpace.BeginWrite;
  try
    CreateNew(AOwner);
    if (ClassType <> TForm) and not (csDesigning in ComponentState) then
    begin
      Include(FFormState, fsCreating);
      try
        if not InitInheritedComponent(Self, TForm) then
          raise EResNotFound.CreateFmt(SResNotFound, [ClassName]);
      finally
        Exclude(FFormState, fsCreating);
      end;
      if OldCreateOrder then DoCreate; // DoCreate ruft OnCreate auf und setzt danach Visible auf WAHR
    end;
  finally
    GlobalNameSpace.EndWrite;
  end;
end;

Bernhard

mkinzler 5. Jul 2009 13:57

Re: Wie funktioniert der OnCreate-Eventhandler
 
Wenn du einen entsprechenden Konstruktor bereitstellst.
Aber ich verstehe noch nicht ganz, auf was du hinaus willst

Aphton 5. Jul 2009 14:06

Re: Wie funktioniert der OnCreate-Eventhandler
 
Danke Rollstuhlfahrer.

Ich werd wohl auf ein OnCreate verzichten müssen.

@mkinzler
Stell dir mal das Beispiel mit einem CreateEvent vor; dann wirst du mein Problem schon verstehen.

MfG und danke nochmal

himitsu 5. Jul 2009 14:18

Re: Wie funktioniert der OnCreate-Eventhandler
 
Sagen wir es mal so, wenn du im Code selber ein Object erstellst, dann kannst du auch gleich selber drauf reagieren.

Wenn es von der VCL erstellt wird, dann weißt du ja nicht (genau) wann dieses geschieht und darum wurde dort dieses Ereignis eingeführt (und über die Interna hat ja rollstuhlfahrer schon was gesagt).

Außerdem kannst du im Code ja alles nötige notfalls per Parameter einem Create mitgeben. (wenn man sich selber eine Klasse erstellt)

rollstuhlfahrer 5. Jul 2009 14:29

Re: Wie funktioniert der OnCreate-Eventhandler
 
Mir persönlich gehts so, dass ich noch nie ein OnCreate-Event außerhalb des des Forms benötigt habe. Alle anderen Komponenten lassen sich direkt über den OI oder gleich über FormCreate einstellen. Bei Klassen hab ich dann das Problem, dass hin und wieder 2-zeilige Definitionen auftreten, da die Liste der übergebenen Parameter etwas größer ist. Aber nach dem Aufruf von Create kann man ja dann mit einem imaginären OnCreate rumspielen, also etwa so:

Delphi-Quellcode:
var
  c: TMyCLass;
begin
  c := TMyClass.Create(Param1, Param2, Param3);
  // OnCreate
  AfterCreateOf(c);
end;
Bernhard


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz