Autor Beitrag
itspeed
Hält's aus hier
Beiträge: 13

Win NT/2000/XP/Vista, Server 2003/2008
Delphi 2006 Architect, 2009, Clarion, Oberon
BeitragVerfasst: Mo 23.02.09 13:59 
Hallo Leute

Nachdem ich nun die Goup durchsucht habe bin ich mir nicht im klaren wie ich jetzt meine Herausforderung gelöst kriege.

Ich möchte ein MDI Form über das BorderIcon biClose (?) {das weise X auf rotem Grund oben rechts... ;-)} schliessen. Leider Funktioniert das nur ein mal. Danach scheint es einen Konflikt zu geben:

Zum anlegen des Form verwende ich folgende Prozedur um sicherzustellen, das das Form nur einmal offen ist, bzw. wenn es schon offen ist, es wieder in den Vordergrund kommt:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
type
  TABLmanager = class(TForm)
    ADOConPSDat: TADOConnection;
    // :
    // code snip
    // :
    end;

var
  ABLmanager: TABLmanager;

// :
// code snip
// :

procedure TPMCatcher.dxBarButton_ABLmgrClickClick(Sender: TObject);
 procedure createIt();
 begin
  Screen.Cursor := crHourGlass;
  ABLmanager := TABLmanager.Create(Application);
 end;
begin
 if (ABLmanager = nil) then
 begin
  createIt();
 end else
 begin
  ABLmanager.Show();
 end;
end;


Zum Schliessen verwende ich folgenden Event-Handler:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TABLmanager.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := caFree;
end;


Schliess wohl das Form aber gibt nicht allen Speicher frei. Zumindest scheint ABLmanager <> nil zu sein...
Mit ".Close" oder ".Release" oder ".Destroy" hatte ich auch keinen erfolgt!

Wer von Euch hat sich damit schon mal rumgeschlagen und erfolg gehabt. Gespannt warte ich auuf Eure kreativen Lösungen!
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 23.02.09 14:47 
Moin!

user profile iconitspeed hat folgendes geschrieben Zum zitierten Posting springen:
Schliess wohl das Form aber gibt nicht allen Speicher frei. Zumindest scheint ABLmanager <> nil zu sein...
Schließt das Formular und der Speicher wird freigegeben, wie beabsichtigt. ;) Allerdings wird dadurch nicht die Referenz auf das Objekt entfernt. :idea: Der Inhalt der Variablen ABLmanager zeigt weiterhin auf das - jetzt ungültige - Objekt auf dem Heap. :nixweiss:

Fazit: das alte Problem, man kann einer Referenz nicht ansehen, ob sie auf ein gültiges Objekt zeigt. :|


user profile iconitspeed hat folgendes geschrieben Zum zitierten Posting springen:
Mit ".Close" oder ".Release" oder ".Destroy" hatte ich auch keinen erfolgt!

Wer von Euch hat sich damit schon mal rumgeschlagen und erfolg gehabt. Gespannt warte ich auuf Eure kreativen Lösungen!
Lösung: du musst dir in einer weiteren Variablen merken, ob das Formular gültig ist. Mit der Referenz alleine klappt das nicht. (also, theoretisch schon, du müsstest halt nach dem das Formular wirklich freigegeben ist die Referenz wieder auf NIL setzen - aber das geht nicht in einer Methode des Formulars. Das musst du ausserhalb der Formularklasse erledigen!)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
itspeed Threadstarter
Hält's aus hier
Beiträge: 13

Win NT/2000/XP/Vista, Server 2003/2008
Delphi 2006 Architect, 2009, Clarion, Oberon
BeitragVerfasst: Mi 25.02.09 22:15 
Danke für den Input Narses

Habe das Problemmit einer Variablen im Modul des AppFrames gelöst...

cu ITspeed