Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi MDI Child manuell erstellen (https://www.delphipraxis.net/182754-mdi-child-manuell-erstellen.html)

Blamaster 15. Nov 2014 16:42

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:
formChild := TFrmChild.Create(Application);
Das führt nun zu der Exception "Cannot create form. No MDI forms are currently active".

Jemand eine Idee woran das liegt ?

himitsu 15. Nov 2014 17:09

AW: MDI Child manuell erstellen
 
Zitat:

Cannot create form. No MDI forms are currently active
Ist es doch auch noch nicht?

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)

Blamaster 15. Nov 2014 17:37

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.

Sir Rufo 15. Nov 2014 18:11

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:
Application.CreateForm
erzeugte Form als
Delphi-Quellcode:
Application.MainForm
. Bitte auf das Wort erzeugte achten. Die Form muss also den kompletten Geburtsvorgang abgeschlossen haben. Im
Delphi-Quellcode:
TForm.OnCreate
befinden wir uns aber mitten im Geburtsprozess und Application hat noch keine Instanz-Referenz zurückbekommen.

himitsu 15. Nov 2014 18:22

AW: MDI Child manuell erstellen
 
Versuch mal
Delphi-Quellcode:
HandleNeeded;
aufzurufen, bevor du das MDI-Child erstellst, denn es wird nunmal ein Handle (HWND) benötigt, welcher als Parent genutzt werden kann. :stupid:
Delphi-Quellcode:
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);
Aber so oder so muß der MDI-Parent wirklich erst als MainForm registriert sein, wie man ebenfalls in dem Code erkennen kann.
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)

Blamaster 15. Nov 2014 19:06

AW: MDI Child manuell erstellen
 
Okay dann doch mit einem Starup Flag im OnShow. :)

himitsu 15. Nov 2014 21:31

AW: MDI Child manuell erstellen
 
Und warum nicht der "normale" Weg?


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:14 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