AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi MDI Fenster mit caFree - prüfen ob Fenster existiert
Thema durchsuchen
Ansicht
Themen-Optionen

MDI Fenster mit caFree - prüfen ob Fenster existiert

Ein Thema von moelski · begonnen am 17. Dez 2008 · letzter Beitrag vom 18. Dez 2008
Antwort Antwort
Seite 1 von 2  1 2      
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#1

MDI Fenster mit caFree - prüfen ob Fenster existiert

  Alt 17. Dez 2008, 19:54
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.:
     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.
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: MDI Fenster mit caFree - prüfen ob Fenster existiert

  Alt 17. Dez 2008, 19:58
Du könntest den Master als Owner angeben und dann über (Self.Owner as <Klasse>).MDIChild := Nil; auf Nil setzen oder die Freigabe über den Master durchführen
Markus Kinzler
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#3

Re: MDI Fenster mit caFree - prüfen ob Fenster existiert

  Alt 17. Dez 2008, 20:11
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:
TNodeInfo(Node.Data).MDIChild Aber wie tu ich nun mit dem Self.owner?
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: MDI Fenster mit caFree - prüfen ob Fenster existiert

  Alt 17. Dez 2008, 20:17
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#5

Re: MDI Fenster mit caFree - prüfen ob Fenster existiert

  Alt 17. Dez 2008, 20:20
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 ...
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: MDI Fenster mit caFree - prüfen ob Fenster existiert

  Alt 17. Dez 2008, 20:25
(Sender as TForm).Hide;
Markus Kinzler
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: MDI Fenster mit caFree - prüfen ob Fenster existiert

  Alt 17. Dez 2008, 20:28
Oder einfach nur Hide.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#8

Re: MDI Fenster mit caFree - prüfen ob Fenster existiert

  Alt 17. Dez 2008, 20:31
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)
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: MDI Fenster mit caFree - prüfen ob Fenster existiert

  Alt 17. Dez 2008, 20:31
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?
Markus Kinzler
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: MDI Fenster mit caFree - prüfen ob Fenster existiert

  Alt 17. Dez 2008, 20:37
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 05:46 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