![]() |
Delphi-Version: 7
MDI Child manuell erstellen
Hi,
ich habe gerade ein merkwürdiges Problem. Ich würde gerne ein MDI Child Form zur Laufzeit manuell erzeugen. Es gibt aktuell zwei Forms FormMain und FormChild. FormMain wird automatisch durch Application.CreateForm erzeugt. Im OnCreate des MainForm soll nun das FormChild erzeugt werden.
Delphi-Quellcode:
Das führt nun zu der Exception "Cannot create form. No MDI forms are currently active".
formChild := TFrmChild.Create(Application);
Jemand eine Idee woran das liegt ? |
AW: MDI Child manuell erstellen
Zitat:
Du erstellst die MainForm auch gerade erst, also kann sie zu diesem Zeitpunkt noch nicht aktiv sein. :roll: Wie wäre es im OnShow? (jedenfalls erst nach dem Erstellen) |
AW: MDI Child manuell erstellen
Hm sehe aber das Grundproblem nicht.
Im OnCreate liegen die Ressourcen von FormMain ja bereits im Speicher und können angesprochen werden. Vom Gefühl her ist das OnCreate auch der einzig passende Ort um beim Programmstart Fenster zu erzeugen. OnShow oder OnActivate werden ja durchaus mehrfach ausgeführt. Der Einzige Weg wäre dann im OnCreate ein Flasg zusetzen im ersten OnShow die Initialisierung zu machen und das Flag danach wieder zurück zu setzen um mir sozusagen ein OnCreated zu erzeugen. Ist aber auch wieder unschönes gefrickel. Wäre es möglich das MDI Form als normales Form im OnCreate zu erzeugen und dann lediglich im erstmaligen OnShow des Main Form auf FormStyle auf fsMDIForm zu setzen ? Wobei auch das fraglich ist ob das noch schön ist. |
AW: MDI Child manuell erstellen
Das Grundproblem ist, dass du versuchst mit dem Auto in den Urlaub zu fahren, obwohl es gerade erst gebaut wird. Das funktioniert eben so nicht.
Die Application Instanz registriert die erste über
Delphi-Quellcode:
erzeugte Form als
Application.CreateForm
Delphi-Quellcode:
. Bitte auf das Wort erzeugte achten. Die Form muss also den kompletten Geburtsvorgang abgeschlossen haben. Im
Application.MainForm
Delphi-Quellcode:
befinden wir uns aber mitten im Geburtsprozess und Application hat noch keine Instanz-Referenz zurückbekommen.
TForm.OnCreate
|
AW: MDI Child manuell erstellen
Versuch mal
Delphi-Quellcode:
aufzurufen, bevor du das MDI-Child erstellst, denn es wird nunmal ein Handle (HWND) benötigt, welcher als Parent genutzt werden kann. :stupid:
HandleNeeded;
Delphi-Quellcode:
Aber so oder so muß der MDI-Parent wirklich erst als MainForm registriert sein, wie man ebenfalls in dem Code erkennen kann.
procedure TCustomForm.CreateWindowHandle(const Params: TCreateParams);
var CreateStruct: TMDICreateStruct; NewParams: TCreateParams; begin if (FormStyle = fsMDIChild) and not (csDesigning in ComponentState) then begin if (Application.MainForm = nil) or (Application.MainForm.ClientHandle = 0) then raise EInvalidOperation.Create(SNoMDIForm); Und das passiert erst nach dem Constructor, wie man sich gerne in TApplication.CreateForm angucken kann. (wofür es zwar auch eine Lösung gäbe, aber ein offizieller Weg ist nunmal anders) |
AW: MDI Child manuell erstellen
Okay dann doch mit einem Starup Flag im OnShow. :)
|
AW: MDI Child manuell erstellen
Und warum nicht der "normale" Weg?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz