Hi Ihr Guten!
Es geht um Referenzen(Pointer) auf Instanzen die noch auf die Instanzen zeigen wenn die Instanzen schon freigegeben sind. (Der Speicher freigegeben ist)
Habe warscheinlich ein grundsätzliches Problem zu lösen. Ich lass am besten mal den Code sprechen, der sagt mehr als Worte und wenn Ich hier lange rede dann meißt eh nur um meinen Kopf und Kragen.
Delphi-Quellcode:
//type
TMeinObject = class(TObject)
public
VarX : TMeinObject;
end;
KlasseA : TMeinObject;
KlasseB : TMeinObject;
//implmnt...
KlasseA := TKLasseA.Create;
KlasseB := TKLasseB.Create;
KlasseB.VarX := KlasseA;
KlasseA.VarX := KlasseB;
FreeAndNil(KlasseA);
if (Assigned(KlasseB.VarX)) then
begin
ShowMessage('It is assigned... this did not help you sir.');
end;
Und klar kann ich so nicht herrausfinden ob da noch Zugriffsrechte bestehen weil die Referenz ja bloß ein ahnungsloser Pointer ist... KlasseB.VarX möchte doch bitte NIL sein. Deswegen:
Delphi-Quellcode:
TMeinObject = class(TObject)
public
VarX : TMeinObject;
ReferenzListe : TList;
procedure FreeNotification(Sender : TObject);
constructor Create;
destructor Destroy; override;
end;
var
KlasseA : TMeinObject;
KlasseB : TMeinObject;
implementation
{$R *.dfm}
procedure wayne...
begin
KlasseA := TKLasseA.Create;
KlasseB := TKLasseB.Create;
KlasseB.VarX := KlasseA;
KlasseA.ReferenzListe.Add(KlasseB);
KlasseA.VarX := KlasseB;
KlasseB.ReferenzListe.Add(KlasseA);
FreeAndNil(KlasseA);
if (Assigned(KlasseB.VarX)) then
begin
ShowMessage('It is assigned... this did not help you sir.');
end;
end;
constructor TMeinObject.Create;
begin
ReferenzListe := TList.Create;
end;
destructor TMeinObject.Destroy;
var
I: Integer;
begin
// Referenzlisten Einträge Nillen
for I := 0 to ReferenzListe.Count - 1 do
begin
TMeinObject(ReferenzListe[I]).FreeNotification(Self);
end;
ReferenzListe.Free;
inherited;
end;
procedure TMeinObject.FreeNotification(Sender: TObject);
begin
if Sender = VarX then
VarX := nil;
end;
end.
Damit das jetzt alles brav implementiert wird und alle Klassen von denen Ich auch Referenzen erzeuge Ihre Referenzen selbst verwalten hatte Ich jetzt vor ein IInterface zu verwenden, das habe ich aber noch nie verwendet.
Delphi-Quellcode:
unit ReferenzVerwaltungsInterface;
interface
type
IReferenceManager =
interface(IInterface)
end;
implementation
end.
Bevor Ich jetzt anfange zu Programmieren wollte Ich noch mal hier nachfragen ob es üblich ist so mit dem Problem umzugehen oder ob es etwas viel besseres / cooleres gibt wie man jetzt am besten einen solchen Referenzmanager aufbaut.
Grüße.