AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MDI Child manuell erstellen

Ein Thema von Blamaster · begonnen am 15. Nov 2014 · letzter Beitrag vom 15. Nov 2014
Antwort Antwort
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#1

MDI Child manuell erstellen

  Alt 15. Nov 2014, 16:42
Delphi-Version: 7
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.

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 ?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#2

AW: MDI Child manuell erstellen

  Alt 15. Nov 2014, 17:09
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.

Wie wäre es im OnShow? (jedenfalls erst nach dem Erstellen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#3

AW: MDI Child manuell erstellen

  Alt 15. Nov 2014, 17:37
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: MDI Child manuell erstellen

  Alt 15. Nov 2014, 18:11
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 Application.CreateForm erzeugte Form als Application.MainForm . Bitte auf das Wort erzeugte achten. Die Form muss also den kompletten Geburtsvorgang abgeschlossen haben. Im TForm.OnCreate befinden wir uns aber mitten im Geburtsprozess und Application hat noch keine Instanz-Referenz zurückbekommen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#5

AW: MDI Child manuell erstellen

  Alt 15. Nov 2014, 18:22
Versuch mal HandleNeeded; aufzurufen, bevor du das MDI-Child erstellst, denn es wird nunmal ein Handle (HWND) benötigt, welcher als Parent genutzt werden kann.
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (15. Nov 2014 um 18:29 Uhr)
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#6

AW: MDI Child manuell erstellen

  Alt 15. Nov 2014, 19:06
Okay dann doch mit einem Starup Flag im OnShow.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#7

AW: MDI Child manuell erstellen

  Alt 15. Nov 2014, 21:31
Und warum nicht der "normale" Weg?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:58 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