Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Warum zerstören sich meine Classen (https://www.delphipraxis.net/159283-warum-zerstoeren-sich-meine-classen.html)

rollstuhlfahrer 22. Mär 2011 12:01

AW: Warum zerstören sich meine Classen
 
Der GC macht ja nichts anderes als .Free aufzurufen, wenn keine Instanzen mehr vorhanden sind. Wenn du jetzt den Referenzzähler nicht benutzt, brauchst du eine Methode, die zumindest intern .Free aufruft. Du kannst aber auch das Free über dein Interface nach außen geben.

Bernhard

EWeiss 22. Mär 2011 12:07

AW: Warum zerstören sich meine Classen
 
Zitat:

Zitat von rollstuhlfahrer (Beitrag 1090237)
Der GC macht ja nichts anderes als .Free aufzurufen, wenn keine Instanzen mehr vorhanden sind. Wenn du jetzt den Referenzzähler nicht benutzt, brauchst du eine Methode, die zumindest intern .Free aufruft. Du kannst aber auch das Free über dein Interface nach außen geben.

Bernhard

Ja verstehe ich nur "Free" muss ja irgendetwas machen. ;)

Mit TInterfacedPersistent wird jetzt kein Destroy mehr aufgerufen.
Wie muss die Funktion Free also aussehen?

gruss

rollstuhlfahrer 22. Mär 2011 12:11

AW: Warum zerstören sich meine Classen
 
.Free ist eine Methode deines OBJEKTES und diese Methode existiert weiterhin. Da sie in TObject definiert worden ist, sollte es kein Problem sein, diese zu verwenden.

Was sie macht: Nach einer Prüfung, ob das Objekt überhaupt existiert, wird Destroy veranlasst.

Bernhard

EWeiss 22. Mär 2011 12:20

AW: Warum zerstören sich meine Classen
 
Zitat:

Zitat von rollstuhlfahrer (Beitrag 1090242)
.Free ist eine Methode deines OBJEKTES und diese Methode existiert weiterhin. Da sie in TObject definiert worden ist, sollte es kein Problem sein, diese zu verwenden.

Was sie macht: Nach einer Prüfung, ob das Objekt überhaupt existiert, wird Destroy veranlasst.

Bernhard

Sorry ich habe kein TObject sondern TInterfacedPersistent.
Deshalb auch meine Frage.

gruss

rollstuhlfahrer 22. Mär 2011 12:26

AW: Warum zerstören sich meine Classen
 
Natürlich hast du immer ein Objekt, da man Klassen nur ableiten kann und die Grundklasse, die immer dabei ist ist TObjekt.

Du kannst dir das wie eine Hierarchie vorstellen und an der Spitze steht immer TObject.

Bernhard

EWeiss 22. Mär 2011 12:35

AW: Warum zerstören sich meine Classen
 
Zitat:

Zitat von rollstuhlfahrer (Beitrag 1090246)
Natürlich hast du immer ein Objekt, da man Klassen nur ableiten kann und die Grundklasse, die immer dabei ist ist TObjekt.

Du kannst dir das wie eine Hierarchie vorstellen und an der Spitze steht immer TObject.

Bernhard

Procedure Free: TObject; ?

Das wollte ich gerne wissen.
Wenn ich Free nach außen weiterleite muss die Anwendung doch wissen was sie damit tun soll..
Bzw auf was sie verzweigt.

gruss

rollstuhlfahrer 22. Mär 2011 12:41

AW: Warum zerstören sich meine Classen
 
Falsche Richtung.

Delphi-Quellcode:
type
  IMyInterface = interface(IUnknown)
  public
    // ...
    procedure Free;
  end;
So war das gemeint. Du sollst nicht das Objekt irgendwo hin geben, sondern wo anders die Möglichkeit anbieten, das Objekt zu löschen.

Bernhard

EWeiss 22. Mär 2011 13:04

AW: Warum zerstören sich meine Classen
 
Zitat:

Zitat von rollstuhlfahrer (Beitrag 1090250)
Falsche Richtung.

Delphi-Quellcode:
type
  IMyInterface = interface(IUnknown)
  public
    // ...
    procedure Free;
  end;
So war das gemeint. Du sollst nicht das Objekt irgendwo hin geben, sondern wo anders die Möglichkeit anbieten, das Objekt zu löschen.

Bernhard

Sorry wenn ich nochmal blöd frage..
Es reicht in meiner Classe ein einfaches procedure Free zu deklarieren?
Und die ruft dann Tobject vom Interface TInterfacedPersistent auf.

Delphi-Quellcode:
type
  ISkinGrid = interface
    ['{89A97429-5E4B-43B6-87D8-381DD4E8CF21}']
    function GetHandle: hWnd;
    property Handle: hWnd read GetHandle;
    procedure Free;
  end;

Hmm etwas unverständlich.
Ja ich lerne es noch mit den Interfacen.

EDIT:
Es funktioniert auf jedenfall.
Danke für eure Hilfe!

gruss

rollstuhlfahrer 22. Mär 2011 14:04

AW: Warum zerstören sich meine Classen
 
So grob stimmt das. Du definierst ein Free in deinem Interface und schon ist es zugänglich. Free ist bei deinem Objekt schon definiert und zieht mit deinem TInterfacedPersistent ein (passiert auch bei TInterfacedObject). Free sorgt dafür, dass das Objekt verschwindet. Heißt also: Von außen Free aufrufen und weg ist das Objekt.

Bernhard

ADD: Eben so, als würdest du das Objekt vor dir haben.

EWeiss 22. Mär 2011 14:14

AW: Warum zerstören sich meine Classen
 
Zitat:

Zitat von rollstuhlfahrer (Beitrag 1090261)
So grob stimmt das. Du definierst ein Free in deinem Interface und schon ist es zugänglich. Free ist bei deinem Objekt schon definiert und zieht mit deinem TInterfacedPersistent ein (passiert auch bei TInterfacedObject). Free sorgt dafür, dass das Objekt verschwindet. Heißt also: Von außen Free aufrufen und weg ist das Objekt.

Bernhard

ADD: Eben so, als würdest du das Objekt vor dir haben.

Danke für deine Erklärung..
Überlege nun ob ich alle Interface nach TInterfacedPersistent umlege.
Das verhindert zumindest das sie selbst zerstört werden.

In wie weit sich das jetzt auf Speicher usw.. bemerkbar macht weiss ich allerdings nicht.
Denke da könnte einiges zusammen kommen wenn diese während der laufzeit nicht freigegeben werden.

Da ist eure Meinung gefragt. :)

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 Uhr.
Seite 2 von 3     12 3      

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