MDI Fenster mit caFree - prüfen ob Fenster existiert
Moins !
Ich habe hier ne MDI Anwendung mit einem MDI Child. Das MDI Child hat folgende OnClose Methode:
Delphi-Quellcode:
Zudem speichere ich mir zu jedem Fenster einige Infos. u.a.:
procedure TfrmMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin Action := caFree; end;
Delphi-Quellcode:
Ich habe also ein Child Fenster und das merke ich mir nach dem erstellen des Childs:
MDIChild : TForm;
Delphi-Quellcode:
Wenn ich nun das Child Fenster über das X schliesse, dann wird das Fenster ja geschlossen und der Speicher freigegeben. MDIChild ist aber keineswegs NIL.
Child := TfrmMDIChild.Create(Application);
Child.Caption := childName; Child.BringToFront; MDIChild := Child; Dazu hab ich nun mal zwei Frägn ... 1) Habe ich nun mit MDIChild := Child eine Kopie erzeugt oder verweise ich mittels MDIChild auf Child? 2) Wie kriege ich über MDIChild raus ob das Fenster noch existiert? Oder anders ausgedrückt will ich wissen ob der User das Fenster mittels dem X geschlossen hat (ohne direkt Child abzufragen). Mit MDIChild <> NIL geht es nicht. |
Re: MDI Fenster mit caFree - prüfen ob Fenster existiert
Du könntest den Master als Owner angeben und dann über
Delphi-Quellcode:
auf Nil setzen oder die Freigabe über den Master durchführen
(Self.Owner as <Klasse>).MDIChild := Nil;
|
Re: MDI Fenster mit caFree - prüfen ob Fenster existiert
Moin !
Hmm so ganz hab ichs noch nicht ... Ich beschreibe mal mein Konstrukt ... Ich habe einen Tree und die Nodes nutzen die .DATA Eigenschaft. Dazu habe ich diese Klasse definiert:
Delphi-Quellcode:
So erzeuge ich einen Node:
type
TNodeInfo = class NodeTyp : TLVObjectTyp; XMLNode : String; MDIChild : TForm; MDIChildVisible : Boolean; end;
Delphi-Quellcode:
Und nach dem Erzeugen des Nodes erzeuge ich ein MDIChild.
Node := tv.Items.Add( nil, 'DEVICE Node ' + IntToStr(TV.Items.Count) );
with Node do begin {Select the root node} Selected := true; ImageIndex := 0; SelectedIndex := 0; Data := TNodeInfo.Create; {Create the data class} TNodeInfo(Data).NodeTyp := ID_Device; end; Das MDIChild Fenster merke ich mir dann in TNodeInfo(MDIChild). Auf das Child kann ich dann so zugreifen wenn ich den Node habe:
Delphi-Quellcode:
Aber wie tu ich nun mit dem Self.owner?
TNodeInfo(Node.Data).MDIChild
|
Re: MDI Fenster mit caFree - prüfen ob Fenster existiert
Ich finde caFree nicht sehr sinnvoll, wenn du du das Formular speicherst. Ich verwende das nur, wenn ich keine Referenz mehr brauche. Ich würde einfach auf das caFree verzichten und dann die Eigenschaft Visible des Formulars abfragen oder eine eigene hinzufügen.
|
Re: MDI Fenster mit caFree - prüfen ob Fenster existiert
Hmm, aber wie tun?
Das klappt nicht:
Delphi-Quellcode:
Und das geht auch nicht:
procedure TfrmMDIChild.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin CanClose := False; frmMDIChild.Hide; end;
Delphi-Quellcode:
Führt beides zu Zugriffsverletzungen ...
procedure TfrmMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin frmMDIChild.Hide; end; |
Re: MDI Fenster mit caFree - prüfen ob Fenster existiert
Delphi-Quellcode:
(Sender as TForm).Hide;
|
Re: MDI Fenster mit caFree - prüfen ob Fenster existiert
Oder einfach nur Hide.
|
Re: MDI Fenster mit caFree - prüfen ob Fenster existiert
Nö das geht leider nicht:
Erste Gelegenheit für Exception bei $7C812AEB. Exception-Klasse EInvalidOperation mit Meldung 'Untergeordnetes MDI-Formular kann nicht verborgen werden'. Prozess TreeDragDrop.exe (7172) |
Re: MDI Fenster mit caFree - prüfen ob Fenster existiert
In diesem Falle ja. Aber wenn es mal mehrere Instanzen gibt oder eine Methode einer anderen Klasse verknüüft ist ist es sicherer den Sender auzuwerten
bringt es was .Visible auf False zu setzen? |
Re: MDI Fenster mit caFree - prüfen ob Fenster existiert
Das stimmt nicht, Markus. Der Streaming-Mechanismus bewirkt, dass die Instanz in den Methodenzeiger immer auf das übergeordnete Formular gesetzt wird, also das, auf dem sich die Komponente befindet, die das Ereignis deklariert. Beim OnClose ist es eben das Formular selbst. Wäre dem nicht so, gäbe dieses ewige nimm-nicht-Form1-sondern-Self-Gepredige auch keinen Sinn.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:57 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