Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.051 Beiträge
Delphi 2009 Professional
|
AW: Form dynamisch erzeugen
23. Okt 2016, 22:35
Man erstellt grundsätzlich mit Application.CreateForm und referenziert die in sich mit Self (wobei man das auch weglassen kann, was das gleiche ergibt). Bei Application.CreateForm ist Application der Besitzer der Form. Beim direkten Aufruf von Create ist halt derjenige der Besitzer, den du angibst. Das Durchlaufen der Kindkomponenten von MainForm oder Application ist auch reichlich ineffizient. Man nimmt sich am ehesten eine TList oder ein Array.
Wenn du eine Form entwirfst, gibt dir Delphi eine Instanzvariable mit dem Namen der Form ohne T dran (denn T ist der uninstanzierte Typ). Heißt deine Form TFormMessengerNW, so heißt diese Variable also FormMessengerNW. Du musst die Instanz erst erstellen, das macht man mit Application.CreateForm.
Wenn du in deinem Code, wie du es machst, nicht Self sondern eine ganz bestimmte Instanzvariable, in dem Fall die vorgegebene FormMessengerNW, schließt, aber eine völlig andere Instanzvariable namens FormMessengerNW_Instanz erstellt hast, klappt das natürlich nicht.
Du benutzt zudem try-finally-Konstrukte komplett falsch. Der finally-Block wird immer aufgerufen, egal was im try-Block passiert. Schlägt das Erstellen der Form fehl, rufst du Show auf. Show schlägt fehl, weil die Instanz gar nicht erstellt wurde. Dein try-finally-Konstrukt bringt also absolut nichts. Daher haut dir der Compiler die erste Variante auch um die Ohren, denn das Create gehört niemals in dasselbe try-finally-Konstrukt wie jegliche Befehle, die darauf zugreifen. Wenn du im finally-Block auf etwas zugreifst, was du im try-Block erstellt hast, hast du ja überhaupt keine Ahnung, ob du das überhaupt erstellt hast oder nicht.
Janni 2005 PE, 2009 PA, XE2 PA
|