Einzelnen Beitrag anzeigen

Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Verständnisfrage VCL zu Application.CreateForm()

  Alt 30. Sep 2009, 20:22
Um die ursprüngliche Frage zu klären: TApplication.CreateForm anstatt vom einfachen Konstruktoraufruf erfüllt zwei Zwecke: Erstens wird, falls gerade das allererste Formular erstellt wird, das Mainform gesetzt. Zweitens wird die Schlamperei von einigen Delphi-Programmierern unterstützt. Letzteres kommt so:
Wenn ich MyForm := TMyForm.Create(Application) aufrufe, wird mit dem Aufruf des Konstruktors auch das OnCreate-Ereignis ausgelöst. Da der Konstruktor aber noch nicht zurückgekehrt ist, hat die Variable MyForm noch keinen neuen Wert erhalten, steht also gewöhnlich auf nil. Einige Programmierer verwenden allerdings statt Self gerne die Formular-Variable, was in OnCreate aus erwähntem Grund zu einem Fehler führt. Um das zu vermeiden, wird in CreateForm das Anfordern des Speichers und der Aufruf des Konstruktors getrennt: So erhält die Variable ihren Wert, bevor der Konstruktor aufgerufen wird und kann in OnCreate gefahrlos verwendet werden.

@DualCoreCpu: Deine Vorstellung von Ereignissen ist falsch. Windows sendet Nachrichten an einen Thread. Der Thread erhält dann zusammen mit der Nachricht auch das Fenster, dem diese Nachricht gesendet werden soll. Die anderen Komponenten "sehen" die Nachricht also nicht. Der Thread kann dann Windows beauftragen, die Nachricht dem Fenster zur Bearbeitung zu überlassen (das MSDN-Stichwort wäre DispatchMessage). Windows muss nicht wissen, welche Nachrichten welchem Formular gehören. Windows arbeitet hier Thread-weise: TApplication.HandleMessage bearbeitet die Nachrichtenqueue des aktuellen Threads.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat