Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Instanz sich selber zerstören lassen? (https://www.delphipraxis.net/12042-instanz-sich-selber-zerstoeren-lassen.html)

Minz 19. Nov 2003 11:14


Instanz sich selber zerstören lassen?
 
Hallösche,

ist es möglich, dass sich eine Instanz einer Klasse selber zerstört?

Also ich erstelle sie mit create(nil).

Gruß Minz

Motzi 19. Nov 2003 11:18

Re: Instanz sich selber zerstören lassen?
 
Ja.. -> Self.Free;

Minz 19. Nov 2003 11:19

Re: Instanz sich selber zerstören lassen?
 
lol, danke ! :wall:

Rumpi 19. Nov 2003 11:59

Re: Instanz sich selber zerstören lassen?
 
Hi,

oder auch mit
Delphi-Quellcode:
FreeAndNil( Self );
Worauf du aber immer achten solltest ist:
Delphi-Quellcode:
  XYZ = class
    ...
  destructor Destroy; override; // override nicht vergessen
 
  end;

....

destructor XYZ.Destroy;
begin
  // sauber machen nicht vergessen
  inherited; // Parent destructor
end;
sonnst wird bei Free oder FreeAndNil
nur der Default Parent Destructor gerufen und
nicht der in deiner Klasse XYZ und der
reservierte Speicher in XYZ wird nicht freigegeben!


mfg Rumpi

SirThornberry 19. Nov 2003 12:32

Re: Instanz sich selber zerstören lassen?
 
haben wir nicht schon vor paar wochen festgestellt das selbst zerstören nicht geht da man sich in einer Methode befindet von dem Object was zerstört werden soll und da kommt dann so weit ich mich erinnere ein Abstract Error

mr2 19. Nov 2003 13:12

Re: Instanz sich selber zerstören lassen?
 
Hallo,
mit einer class procedure sollte es auf jeden Fall funktionieren:
Delphi-Quellcode:
class procedure TIrgendwas.Machwas;
begin
  with Create(nil) do try
    MachDasEine;
    MachDasAndere;
  finally
    Free;
  end;
end;

SirThornberry 19. Nov 2003 13:16

Re: Instanz sich selber zerstören lassen?
 
als ich das mal probiert hab kams zu einem fehler weil man sich ja noch in der instanz von TIrgendwas.Machwas befindet während die instanz zerstört wird

mr2 19. Nov 2003 13:41

Re: Instanz sich selber zerstören lassen?
 
Hallo,

Du hast wahrscheinlich das kleine Wörtchen
Delphi-Quellcode:
class
übersehen.
Das bedeutet, dass die Methode wie man in C sagen würde statisch ist. Sie "hängt" an der Klasse und nicht an der Instanz, daher kann hier problemlos die Instanz freigegeben werden.
Zu beachten ist allerdings der Aufruf:
Delphi-Quellcode:
  TIrgendwas.Machwas;
also immer mit dem "T" davor.
Hab' ich schon in zahlreichen Projekten so gemacht. Eignet sich vor allem bei Formularen.

OLLI_T 19. Nov 2003 13:47

Re: Instanz sich selber zerstören lassen?
 
Kleiner Tipp am Rande.

Ich hab "damals" ne kleinen ComponentEditor gebastelt, mit dem man verhindern kann, dass mehr als eine Instanz einer Komponente ins Projekt geworfen werden können. Hier ein Auszug aus der Registrierungs-Unit:

Delphi-Quellcode:
uses
  DsgnIntf, SysUtils, TypInfo, Classes, Dialogs System32;

Type

  TStopEditor = class(TComponentEditor)
  private { Private-Deklarationen }
    FRemove:Boolean;
  public
    constructor Create(AComponent: TComponent; ADesigner: IFormDesigner); override;
    Procedure GetCompNames(const S: string);
  End;

  Procedure Register;

implementation

uses PicSel;

Procedure Register;
Begin
  ....
  RegisterComponentEditor(TotStopWatch32,TStopEditor);
  ....
End;

.....

// **************************************************************************
// ** TStopEditor ***********************************************************
// **************************************************************************

constructor TStopEditor.Create(AComponent: TComponent;
  ADesigner: IFormDesigner);
Var TD:TTypeData;
begin
  inherited;
  If AComponent.Owner<>NIL Then Begin
    TD.ClassType:=TotStopWatch32;
    ADesigner.GetComponentNames(@TD,GetCompNames);
    If FRemove Then Begin
      ADesigner.DeleteSelection;
      Component.Owner.RemoveComponent(Component);
    End;
  End;
end;

Procedure TStopEditor.GetCompNames(const S: string);
Begin
  If S<>Component.Name Then Begin
    Showmessage('Es ist bereits eine Stopwatch im Projekt!');
    FRemove:=TRUE;
  End;
end;
Vielleicht kann der Eine oder Andere was damit anfangen!?

Gruss

OLLI

Minz 19. Nov 2003 13:57

Re: Instanz sich selber zerstören lassen?
 
versteh ich net so ganz!

Programm
Instanz:=MeineKlasse.create(nil);
Instanz.machwas;

MeineKlasse
class procedure machwas;
...
free;


so in etwa?

ach ähm @Olli ich kann da keinen Zusammenhang mit diesem Thema entdecken.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:16 Uhr.
Seite 1 von 2  1 2      

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