Announcement

Collapse
No announcement yet.

Wieso wird Create vor CreateParams aufgerufen ???

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wieso wird Create vor CreateParams aufgerufen ???

    Hallo,<BR><BR>bei einer TForm wird bei mir zuerst OnCreate und anschließend erst CreateParams aufgerufen. CreateParams wurde als protected überschrieben.<BR><BR>Normalerweise wird zuerst CreateParams und dann erst OnCreate aufgerufen.<BR>Hat jemand eine Idee, wieso dieser merkwürdige Effekt bei mir auftritt?<BR><BR>Stephan H. (Delphi 5 Ent. (SP 1) auf W2K)<BR>

  • #2
    Nein. Normalerweise wird OnCreate() VOR CreateParams() aufgerufen, sollte dies nicht der Fall sein dann wird schon innerhalb der Erzeugung des Forms und seiner Komponenten das Fensterhandle des Forms benötigt. Dies kommt vor, ist aber extrem schlecht und zeugt davon das irgendein Control nicht "VCL<->Windowsfenster" konform arbeitet.<br>
    Die eigentlichen Delphi VCL Controls sind vollständig losgelösst von den Windows-Fensterhandles. D.h. solange ein Form und dessen Controls unsichtbar ist muss KEIN Windowsfensterhandle für diese Controls existieren. Grundsätzlich ist dies ein wohldurchdachtes Design von Borland. Allerdings halten sich viele Controls nicht daran und so kann es vorkommen das noch während das Form sich aus der Resource lädt, das Fensterhandle benötigt wird. Dies ist schlecht da es beudeuten kann das im späteren DFM-Ladeprozess wiederum Eigenschaften wie BorderStyle/BorderIcons geändert werden, die dann die Zerstörung des Fensterhandles und dessen Neuerzeugung zur Folge haben. Im schlechtesten Falle kann es also vorkommen das im TForm.Create() die Fensterhandles mehrmals erzeugt und wieder zerstört werden.<br>
    Als letzte Aktion im .Create() wird das Event OnCreate() aufgerufen, aber vorher kann schon X'mal .CreateParams() aufgerufen worden sein.<br>

    Das OnCreate() Event ist also ausschließlich ein VCL-Ereigniss und die Methode .CreateParams() ist eine Schnittstelle von der VCL zu den Windows-Fensterhandles.<br>
    Abhängig davon was du erreichen willst sollten in .CreateParams() NUR Aktionen erfolgen die das Verhalten der VCL in Bezug auf die Windows-Fenster abändern.<br>
    Willst Du eine Benachrichtigung das das Form vollständig erzeugt wurde dann sollte .Loaded() überschrieben werden.<br>

    gruß Hage

    Comment


    • #3
      Vielen Dank für die Informatio

      Comment

      Working...
      X