AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Destroy wird ohne Aufruf ausgeführt - total strange...
Thema durchsuchen
Ansicht
Themen-Optionen

Destroy wird ohne Aufruf ausgeführt - total strange...

Ein Thema von s.h.a.r.k · begonnen am 14. Aug 2008 · letzter Beitrag vom 14. Aug 2008
Antwort Antwort
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Re: Destroy wird ohne Aufruf ausgeführt - total strange...

  Alt 14. Aug 2008, 11:25
Zitat von s.h.a.r.k:
Ich bin nun einfach mal so dreist und nutze deinen Quellcode, da der als Beispiel sehr gute passt
...ich schreibe dann mal weiter...

Wie ich oben schon schrieb: wenn das Objekt nur das Interface implementieren soll, dann benutze auch nur das Interface und nicht die Referenz auf das Objekt (s.u.). Solche zählenden Interfaces werden automatisch freigegeben, sobald sie nicht mehr benötigt werden.

Variante 1 wäre also einfach, ISomeInterface an Stelle von TSomeInterface zu benutzen:
Delphi-Quellcode:
procedure blaaa(aObject: TObject);
var
  tmp : ISomeInterface; // <-!
begin
  tmp := TSomeInterface.Create();
  tmp.registerObject(blub);

  // hier kommt nun die tolle Stelle
//FreeAndNil(tmp); // <-!
end;
Soll dein Objekt die Schnittstelle nur "nebenbei" mit implementieren, also nicht hauptsächlich oder ausschließlich dem Interface dienen, dann solltest du ganz einfach von TInterfacedPersistent (oder TComponent) ableiten:
Delphi-Quellcode:
  TSomeInterface = class(TInterfacedPersistent, ISomeInterface) // <-!
  public
    FVar : TObject;
    procedure registerObject(aObject: TObject);
  end;
Es hängt also davon ab, welchen Zweck dein Objekt bzw. dein Interface erfüllen soll.

Von TInterfacedObject abgeleitete Klasse sind -wie oben schon geschrieben- eigentlich für die ausschließliche Verwendung als Interfaces gedacht. Das Problem ist die Referenzzählung, die das Objekt automatisch freigibt, sobald der Zähler auf 0 abfällt (nachdem er mindestens ein Mal auf 1 hochging):
Delphi-Quellcode:
var
  T: TSomeInterface;
  I: ISomeInterface;
begin
  T := TSomeInterface.Create; // Zähler: 0
  I := T as ISomeInterface; // Zähler: 1
  I := nil; // Zähler: 0 --> Objekt wird freigegeben
  // ab hier ist T nicht mehr gültig
end;
Merkregel: Nachdem du ein von TInterfacedObject abgeleitetes Objekt einmal als Interface benutzt hast, solltest du es nicht mehr über die Objektreferenz ansprechen.

Zitat von s.h.a.r.k:
PS: Kennst du ein gutes Tutorial oder dergleichen, wo man das nachlesen kann?! Habe bisher eben noch kein gutes gefunden, wo drin stehst was wann und warum passiert!?
Tut mir leid, ein gutes Tutorial dazu habe ich auch noch nicht gefunden.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:37 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