Delphi-PRAXiS
Seite 6 von 6   « Erste     456   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Referenzen auf ungültige Objekte (https://www.delphipraxis.net/159095-referenzen-auf-ungueltige-objekte.html)

stahli 6. Nov 2011 19:12

AW: Referenzen auf ungültige Objekte
 
Nachtrag zum Beitrag #45, falls es mal jemand nachbaut...
Es ist noch folgende Änderung notwendig:

Delphi-Quellcode:
procedure Tod._RemoveRef(od: Tod);
begin
  if (csDestroying in ComponentState) then
    Exit;
  if not Assigned(FRefList) then
    Exit;
  FRefList.Remove(od);
  if FRefList.Count = 0 then
    FreeAndNil(FRefList);
end;

procedure Tod._RemoveFromRefList(od: Tod);
begin
  if (csDestroying in ComponentState) then
    Exit;
  if Assigned(FRefList) then
    FRefList.Remove(od);
end;
(Ich kann den Beitrag leider nicht mehr editieren.)

Thom 2. Mär 2012 20:44

AW: Referenzen auf ungültige Objekte
 
Zitat:

Zitat von Thom (Beitrag 1089247)
Zitat:

Zitat von stahli (Beitrag 1089229)
Jeder Anfänger geht doch erst mal davon aus, dass nach
Delphi-Quellcode:
O := TObject.Create;
O1 := O;
O.Free;
O1 = nil ist.

[...]

Es gibt viele Lösungsmöglichkeiten, das von Dir beschriebene Problem anzugehen (viele davon wurden schon diskutiert).
Aber mich ausschließlich auf den Compiler verlassen!? Nicht wirklich.

Mal ein Gegenbeispiel für den Aufwand, der entstehen würde:
Eine Objektreferenz wird in einer TObjectList gespeichert. Diese wird aufgelöst, bevor das Objekt freigegeben wird. Und nun!? Jetzt müßte Code generiert werden, wie und ob auf die Objektreferenz überhaupt noch zugegriffen werden kann.

Ich denke, der einfachste und sicherste Weg ist eine saubere Programmierung im Einzelfall - auf für weniger anspruchsvolle Programmierer wie mich... 8-)

Ein knappes Jahr später kann ich dazu nur noch sagen: :wall:

Du hast vollkommen Recht, stahli: Es gibt durchaus sinnvolle Anwendungsmöglichkeiten für ein derartiges Verhalten und ich habe inzwischen auch Situationen gefunden, in denen das sogar zwingend notwendig ist.
Inzwischen funktioniert es auch:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  o, o1: INotify;
begin
  o:=TNotifyObject.Create;
  o1:=o;
  o.Free;
  if not assigned(o) and not assigned(o1)
    then ShowMessage('Toll!')
    else ShowMessage('War wohl nichts...');
end;
Natürlich erscheint die erste Meldung. :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:13 Uhr.
Seite 6 von 6   « Erste     456   

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