Autor Beitrag
NewMori
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45
Erhaltene Danke: 1



BeitragVerfasst: Fr 14.05.10 10:57 
Hi,
ich habe schon wieder eine Frage. Ich schreibe gerade eine Klasse, von dieser werden mehrere Klassen abgeleitet. Die Pointer der Instanzen werden in einer Liste gespeichert. Wenn ich jetzt die Pointer habe und mit
ausblenden Delphi-Quelltext
1:
TPlayer(Pointer).Destroy					

aufrufe, wird dann der Destructor der eigendlichen Klasse zB. TLocalPlayer aufgerufen, also als hätte ich Destroy als abstract deklariert oder wir das Destroy von TPlayer aufgerufen. Mir geht es hier darum ob ich immer die richtige Klasse kennen muss oder ob es reicht das Destroy der Elternklasse aufzurufen.

_________________
Es ist keine Kunst in ein Programm 20 Fehler zu schreiben. Die Kunst ist es das Programm dann noch zum laufen zu bekommen.
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Fr 14.05.10 11:10 
Hängt davon ba wie Du en Destroctor implementierst:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TMk=Class(Tobject)
    Destructor Destroy; override;  // so klappts
    //Destructor Destroy;          // so nicht 
  End;
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  p:TObject;
begin
  p := TMK.Create;
  p.Destroy;
end;

{ TMk }

destructor TMk.Destroy;
begin
  Showmessage('Kaputt');
  inherited;
end;

end.
NewMori Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45
Erhaltene Danke: 1



BeitragVerfasst: Fr 14.05.10 11:17 
Das ist, was ich nicht haben will, es sollen alle Destructoren der reinfolge nach abgearbeitet werden. Kann man Delphi nicht klarmachen, das der alte verschoben werden soll ud durch den neuen ersetzt wird.

Bzw: Override funktioniert doch nur wenn die Funktion vorher Virtuell war, oder nicht?

_________________
Es ist keine Kunst in ein Programm 20 Fehler zu schreiben. Die Kunst ist es das Programm dann noch zum laufen zu bekommen.
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Fr 14.05.10 11:25 
ich fürchte ich verstehe Dein Problem nicht ....
destroy ist virtual
und IMHO verhält sich alles so wie es soll

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type

  TMkPrior=Class (Tobject)
    Destructor Destroy; override;
  End;
  TMk=Class(TMkPrior)
    Destructor Destroy; override;
  End;
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  p:TObject;
begin
  p := TMK.Create;
  p.Destroy;
end;

{ TMk }

destructor TMk.Destroy;
begin
  Showmessage('Kaputt');
  inherited;
end;

{ TMkPrior }

destructor TMkPrior.Destroy;
begin
  Showmessage('Prior  Kaputt');
  inherited;
end;

end.
NewMori Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45
Erhaltene Danke: 1



BeitragVerfasst: Fr 14.05.10 11:28 
Sorry,
ich habe bis jetzt mit virtual; abstract; gearbeitet und nicht gewusst, das man virtual auch alleine einsetzen kann. :oops:
Danke bummi für die Antworten

_________________
Es ist keine Kunst in ein Programm 20 Fehler zu schreiben. Die Kunst ist es das Programm dann noch zum laufen zu bekommen.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 14.05.10 11:32 
Moin!

Zur Sicherheit: Laut DOH sollte man nicht den Destruktor direkt, sondern statt dessen .Free aufrufen. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
NewMori Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45
Erhaltene Danke: 1



BeitragVerfasst: Fr 14.05.10 11:41 
Bei Free wird doch nur noch mal auf Nil geprüft, oder? Ich höre die ganze Zeit was anderes die einen sagen Free die anderen Destroy was ist denn der Unterschied?

_________________
Es ist keine Kunst in ein Programm 20 Fehler zu schreiben. Die Kunst ist es das Programm dann noch zum laufen zu bekommen.
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Fr 14.05.10 11:44 
Free könnte auch schon überschrieben sein ...
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 14.05.10 11:49 
Der Unterschied ist, dass die Compiler-Magic beim Aufruf von Destroy eine andere ist, weil Destroy als Destructor einen versteckten Parameter mitbekommt, der das Speichermanagement betrifft. Von daher IMMER Obj.Free; Obj:=Nil; aufrufen oder FreeAndNil(Obj);.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
NewMori Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45
Erhaltene Danke: 1



BeitragVerfasst: Fr 14.05.10 12:03 
Das heißt, dass ich dann auch Free überschreiben sollte oder nicht?

_________________
Es ist keine Kunst in ein Programm 20 Fehler zu schreiben. Die Kunst ist es das Programm dann noch zum laufen zu bekommen.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 14.05.10 12:17 
Moin!

user profile iconNewMori hat folgendes geschrieben Zum zitierten Posting springen:
Das heißt, dass ich dann auch Free überschreiben sollte oder nicht?
Nein, warum? Du überschreibst den Destruktor, aber rufst .Free auf, fertig. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.