AGB  ·  Datenschutz  ·  Impressum  







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

Nochmal: Ermiteln ob Objekt freigegeben wurde

Ein Thema von MaBuSE · begonnen am 13. Dez 2005 · letzter Beitrag vom 16. Dez 2005
 
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

Re: Nochmal: Ermiteln ob Objekt freigegeben wurde

  Alt 13. Dez 2005, 16:10
Zitat von shmia:
Du darfst die Variable Form2 nicht verwenden!!!
Empfehlung: globale Variable Form2 löschen.
Warum darf ich die nicht verwenden?
Aber keine Angst, sie wird im Projekt nicht verwendet.

Ich habe aber ein anderes Problem entdeckt.

Einige Forms werden mehrfach (in versch. Variablen) erzeugt.

Bsp:
Delphi-Quellcode:
...
// in unit1.pas
procedure TForm1.methode;
begin
  if not assigned(privateForm1Var) then
  begin
    privateForm1Var := TForm2.Create(self);
  end;
  privateForm1Var.show
end;
// in unit3.pas
procedure TForm3.andereMethode;
begin
  if not assigned(privateForm3Var) then
  begin
    privateForm3Var := TForm2.Create(self);
  end;
  privateForm3Var.show
end;
...
In dem Form2 habe ich keinen Zugriff auf privateForm1Var.
1. ist die Unit1 und Unit3 nicht in der uses des Form1 und
2. ist die Variable privat (lokal)
Außerdem weis ich ja gar nicht in welcher Variable das TForm2 enthalten ist.
Damit es nicht langweilig wird, sind manchmal auch mehrere Instanzen gleichzeitig aktiv.
(also privateForm1Var <> privateForm3Var und beide <> nil)
Ich kann also folgenden SourceCode nicht ausführen:
Delphi-Quellcode:
...
// Vorschlag von [user]tomsel[/user]
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  // hier werden noch viele weitere Dinge freigegeben
  Action := caFree;
  privateForm1Var := nil;
end;
...
Folgendes funktioniert auch nicht, da dann zwar self auf nil gesetzt wird, aber privateForm1Var immer noch auf den "alten" Speicherbereich zeigt.
Delphi-Quellcode:
...
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  // hier werden noch viele weitere Dinge freigegeben
  Action := caFree;
  self := nil;
end;
...
Der Lösungsansatz von shmia gefällt mir prinzipiell gut, aber es kann nur ein Form pro Typ erzeugt werden. Das Form muss aber auch mehrmals "sichtbar" sein.

Die Idee von Bernhard Geyer das Singleton-Pattern anwenden, fällt leider auch weg, da es ja mehrfach erzeugt wird

Der Lösungsansatz von dataspider scheint wohl der Beste zu sein.
Das Problem dort ist allerdings, dass die lokale Variable im Form definiert sein muss und das bei jedem Objekt das eine Instanz erzeugt die Notification abgeleitet werden muss.

Ich werde mit wohl eine FormFactory bauen müssen, die mir die Forms erzeugt und intern in einer Liste abspeichert. Diese FormFactory muß dann auch das Notification implementieren und dann die entsprechenden Speicherbereiche auf Nil setzen.

Mal schauen ob das funktioniert.

Danke an alle für die Anregungen
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
 


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 00:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz