Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi MDI Fenster mit caFree - prüfen ob Fenster existiert (https://www.delphipraxis.net/126082-mdi-fenster-mit-cafree-pruefen-ob-fenster-existiert.html)

moelski 17. Dez 2008 18:54


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:
procedure TfrmMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;
Zudem speichere ich mir zu jedem Fenster einige Infos. u.a.:
Delphi-Quellcode:
     MDIChild       : TForm;
Ich habe also ein Child Fenster und das merke ich mir nach dem erstellen des Childs:
Delphi-Quellcode:
  Child          := TfrmMDIChild.Create(Application);
  Child.Caption  := childName;
  Child.BringToFront;
  MDIChild       := Child;
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.

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.

mkinzler 17. Dez 2008 18:58

Re: MDI Fenster mit caFree - prüfen ob Fenster existiert
 
Du könntest den Master als Owner angeben und dann über
Delphi-Quellcode:
(Self.Owner as <Klasse>).MDIChild := Nil;
auf Nil setzen oder die Freigabe über den Master durchführen

moelski 17. Dez 2008 19:11

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:
type
  TNodeInfo = class
     NodeTyp        : TLVObjectTyp;
     XMLNode        : String;
     MDIChild       : TForm;
     MDIChildVisible : Boolean;
  end;
So erzeuge ich einen Node:
Delphi-Quellcode:
  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;
Und nach dem Erzeugen des Nodes erzeuge ich ein MDIChild.
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:
TNodeInfo(Node.Data).MDIChild
Aber wie tu ich nun mit dem Self.owner?

Apollonius 17. Dez 2008 19:17

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.

moelski 17. Dez 2008 19:20

Re: MDI Fenster mit caFree - prüfen ob Fenster existiert
 
Hmm, aber wie tun?

Das klappt nicht:
Delphi-Quellcode:
procedure TfrmMDIChild.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := False;
  frmMDIChild.Hide;
end;
Und das geht auch nicht:
Delphi-Quellcode:
procedure TfrmMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  frmMDIChild.Hide;
end;
Führt beides zu Zugriffsverletzungen ...

mkinzler 17. Dez 2008 19:25

Re: MDI Fenster mit caFree - prüfen ob Fenster existiert
 
Delphi-Quellcode:
(Sender as TForm).Hide;

Apollonius 17. Dez 2008 19:28

Re: MDI Fenster mit caFree - prüfen ob Fenster existiert
 
Oder einfach nur Hide.

moelski 17. Dez 2008 19:31

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)

mkinzler 17. Dez 2008 19:31

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?

Apollonius 17. Dez 2008 19:37

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.
Seite 1 von 2  1 2      

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