Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit TObject (https://www.delphipraxis.net/104576-problem-mit-tobject.html)

Eppos 6. Dez 2007 17:16


Problem mit TObject
 
Hallo zusammen,

ich habe ein Problem mit TObject.

Ich habe folgendes gemacht:

Delphi-Quellcode:
Kopf : TObject;

.....

Kopf.Free;
Der Kopf wird aber durch das Free nicht gelöscht?!
Was muss ich tun damit der Kopf gelöscht wird?

Vielen Dank!

mkinzler 6. Dez 2007 17:17

Re: Problem mit TObject
 
Delphi-Quellcode:
FreeAndNil( Kopf);

Eppos 6. Dez 2007 17:29

Re: Problem mit TObject
 
wenn ich dann aber "kopf" wieder erstelle, bekomme ich eine Fehlermeldung(Access Violation).

sirius 6. Dez 2007 17:31

Re: Problem mit TObject
 
Könntest du mal ein bisschen mehr verraten, was du machst?

Der_Unwissende 6. Dez 2007 17:41

Re: Problem mit TObject
 
Hi,
erstmal vorweg möchte ich Sirius voll zustimmen, es sind echt wenige Info's die Du da bereit stellst, das macht es nicht gerade einfach Dir zu helfen!

Da Du aber von einem Kopf und Löschen sprichst, denke ich mal, dass Du eine Aufgabe hast, die das Thema Queue/Schlange oder verkettete Liste behandelt? Wenn dem so ist, dann wird kein einfacher Befehl das Löschen übernehmen. Da musst Du schon zeigen, wie Dein kompletter Ansatz bisher aussieht.
Gelöscht wird der Kopf im übrigen mit dem Free schon (aus dem Speicher wird er entfernt), aber Du behälst noch eine Referenz auf diesen Speicherbereich (der allerdings kein gültiges Datum mehr enthält). Mit FreeAndNil sorgst Du dann dafür, dass die Referenz aut. auf nil zeigt, einen Speicherbereich von dem Du (und Delphi) weißt dass er nicht gültig sein kann. Mittels assigned kannst Du dann prüfen, ob der Kopf im Moment auf nil zeigt oder nicht (achtung, Du kannst nicht prüfen ob der Speicher schon frei gegeben wurde!)

Gruß Der Unwissende

Eppos 6. Dez 2007 18:06

Re: Problem mit TObject
 
Ich generiere ein TObject mit

Delphi-Quellcode:
kopf.create;
In diesem kopf werden mehrere TObjects geladen.

Ich Lösche das TObject mit

Delphi-Quellcode:
kopf.free;
dann steht aber im Kopf noch sämtliche Daten drin.
d.h. wenn ich das TObject nochmals erstelle, dann nimmt er die Daten aus dem vorherigen Kopf, obwohl ich diese mit free gelöscht habe.
NilAndFree habe ich auch schon ausprobiert.

Ich komme aber auf keinen grünen Zweig.

Muetze1 6. Dez 2007 18:09

Re: Problem mit TObject
 
Zitat:

Zitat von Eppos
Ich generiere ein TObject mit

Delphi-Quellcode:
kopf.create;

Damit generierst du nix. Wenn, dann den Constructor der Klasse aufrufen:

Delphi-Quellcode:
kopf := TKopf.Create;
Zitat:

Zitat von Eppos
dann steht aber im Kopf noch sämtliche Daten drin.
d.h. wenn ich das TObject nochmals erstelle, dann nimmt er die Daten aus dem vorherigen Kopf, obwohl ich diese mit free gelöscht habe.

Weil du kein neue Instanz erzeugt hast, hast du natürlich alles beim alten...

Eppos 6. Dez 2007 18:16

Re: Problem mit TObject
 
so ungefähr siehts aus...

Delphi-Quellcode:
TKopf = class(TObject)
  A : TObject
...

end;


Kopf := TKopf.Create;
...

Kopf.Free;
Kopf := nil;


...


Kopf := TKopf.Create;
// Fehler Access Violation
// Daten wurden aus vorherigem TKopf nicht gelöscht

sirius 6. Dez 2007 18:19

Re: Problem mit TObject
 
Was willst du?
Nach "Kopf:=TObject.create" ist A immer nil.

Eppos 6. Dez 2007 18:23

Re: Problem mit TObject
 
ja ist nil, ist richtig, aber ich kann den zweiten create Befehl nicht ausführen, weil ich eine Access Violation bekomme.

mkinzler 6. Dez 2007 18:25

Re: Problem mit TObject
 
Zeig mal den Code deines Konstruktors.

Eppos 6. Dez 2007 18:29

Re: Problem mit TObject
 
Delphi-Quellcode:
constructor TKopf.Create;
begin
  inherited Create;
  A := tObject.Create;
end;

destructor TKopf.Destroy;
begin
  A.free;
  A := nil;
  inherited Destroy;
end;

DeddyH 6. Dez 2007 18:31

Re: Problem mit TObject
 
Zitat:

Zitat von Delphi-Hilfe
Hinweis: TObject wird nie direkt instantiiert. Obwohl keine Programmiersprachenelemente zum Verhindern der Instantiierung verwendet werden, ist TObject eine abstrakte Klasse.


Eppos 6. Dez 2007 18:57

Re: Problem mit TObject
 
wie muss ich das jetzt verstehen?

DeddyH 6. Dez 2007 18:59

Re: Problem mit TObject
 
Dass es keinen Sinn macht, eine Instanz von TObject anzulegen.

mkinzler 6. Dez 2007 19:01

Re: Problem mit TObject
 
Ein TObject wird per Compilermagic erzeugt. Ich würde aber in abgeleiteten Klassen trotzdem inherited aufrufen.

Eppos 6. Dez 2007 19:15

Re: Problem mit TObject
 
also eigentlich, sollte es dann so funktionieren wie ich es gemacht habe?!

DeddyH 6. Dez 2007 19:18

Re: Problem mit TObject
 
TObject ist eine abstrakte Klasse.

jottkaerr 7. Dez 2007 06:09

Re: Problem mit TObject
 
Zitat:

Zitat von DeddyH
Zitat:

Zitat von Delphi-Hilfe
Hinweis: TObject wird nie direkt instantiiert. Obwohl keine Programmiersprachenelemente zum Verhindern der Instantiierung verwendet werden, ist TObject eine abstrakte Klasse.


In welcher Version von Delphi steht denn solch ein Blödsinn in der Hilfe. Bei Delphi 5 heißt es noch

Zitat:

Zitat von Delphi-Hilfe
Hinweis

TObject ist zwar technisch gesehen keine abstrakte Klasse, trotzdem werden Objekte dieses Typs normalerweise nicht instantiiert.

Und das ist auch richtig so, denn andernfalls müsste man ja bei jeder Klasse Methoden von TObject überschreiben, um nicht die Warnung zu erhalten, dass man Instanz der abgeleiteten Klasse mit abstrakten Methoden erstelle.

jkr

Ghostwalker 7. Dez 2007 07:26

Re: Problem mit TObject
 
Zitat:

Zitat von jottkaerr
Und das ist auch richtig so, denn andernfalls müsste man ja bei jeder Klasse Methoden von TObject überschreiben, um nicht die Warnung zu erhalten, dass man Instanz der abgeleiteten Klasse mit abstrakten Methoden erstelle.
jkr

Direkt aus der TD2006-Hilfe:

Zitat:

Hinweis:
TObject wird nie direkt instantiiert. Obwohl keine Programmiersprachenelemente zum Verhindern der Instantiierung verwendet werden, ist TObject eine abstrakte Klasse.
Den Hinweis bekommst du auch, wenn du z.B. einen Destructor Destroy in deine Klasse einbaust, ohne das Zauberwort "overwrite" zu benutzen.

jottkaerr 7. Dez 2007 07:42

Re: Problem mit TObject
 
[quote="Ghostwalker"]
Zitat:

Zitat von jottkaerr
Zitat:

Hinweis:
TObject wird nie direkt instantiiert. Obwohl keine Programmiersprachenelemente zum Verhindern der Instantiierung verwendet werden, ist TObject eine abstrakte Klasse.
Den Hinweis bekommst du auch, wenn du z.B. einen Destructor Destroy in deine Klasse einbaust, ohne das Zauberwort "overwrite" zu benutzen.

Nein, mit

Delphi-Quellcode:
type
  TTest= class
  public
    destructor Destroy;
  end;
erhalte ich die Meldung "Methode 'Destroy' verbigt virtuelle vom Basistyp 'TObject'".

jkr

Ghostwalker 7. Dez 2007 10:17

Re: Problem mit TObject
 
Jetzt wo du es sagst..stimmt mit dem virtual.

Dennoch steht der Hinweis so in der Hilfe bei mir :)

Mal ganz davon abgesehen, das man mit einer Instanz von TObject nicht wirklich was anfangen kann :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:50 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