![]() |
inherited Free; <-- warum kommt da eine exeption?!
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, ich habe mir gerade eine Klasse geschrieben, weil ich mir für den Minichat, den ich demletzt hier in OpenSource veröffentlich habe auch noch ein Delphi-Client schreiben will. In meinem destructor:
Delphi-Quellcode:
tritt aber eine exeption auf. Meine Klasse ist von TComponent abgeleitet.
destructor TMiniChatClient.Free;
begin Logout; inherited Free; //<-- exception hier! end; Jemand eine Idee, woher das kommen kann *ratlos*. Die komplette Klasse findet ihr im Anhang. |
Re: inherited Free; <-- warum kommt da eine exeption?!
Du solltest nicht Free sondern Destroy benutzen.
|
Re: inherited Free; <-- warum kommt da eine exeption?!
Also ich versuche mal zu raten warum das so ist.
Das unterste Free (von TObject) ruft Destroy auf. Da Free eigentlich eine procedure ist und kein destructor funktioniert das ganze auch, denn ein destructor gibt am Ende das eigentliche Objekt frei. Da er nun free als destructor deklariert hat, welches wiederum Destruktor Nr.2 namens "destroy" aufruft, wird 2x versucht das eigentliche Objekt per Compilermagic freizugeben. Richtig? :-D |
Re: inherited Free; <-- warum kommt da eine exeption?!
Thx... Wenn ich in meiner Free-procedure inherited Destroy statt inherited Free aufrufe funzt es...
Nur wieso das funzt ist mir jetzt noch nicht gan klar... |
Re: inherited Free; <-- warum kommt da eine exeption?!
Zitat:
|
Re: inherited Free; <-- warum kommt da eine exeption?!
Du solltest Free in deiner eigenen Klasse nicht überschreiben.
Überschreibe den Destructor Destroy.
Delphi-Quellcode:
TMiniChatClient = class
private { Private declarations } sid: string; lastid: string; nick: string; error: string; chaturl: string; protected { Protected declarations } public { Public declarations } constructor Create(Owner: TComponent; const url: string); destructor Destroy; override; function Login(const nickname: string):integer; function Logout:integer; function postMsg(const txt: string):integer; function getNewMsgs:TJvSimpleXmlElem; published { Published declarations } end; Der Destructor Destroy:
Delphi-Quellcode:
destructor TMiniChatClient.Destroy;
begin Logout; inherited; end; Dieser Destructor wird beim Aufruf von Free automatisch aufgerufen. Das sollte dein Problem lösen. |
Re: inherited Free; <-- warum kommt da eine exeption?!
SO, ich habe das mal geändert und die geänderte Version der MiniChatClient.pas hochgeladen.
Jetzt habe ich plötzlich ein ganz anderes Problem: [Fatal Error] MiniChatClient.pas(1): Program or unit 'MiniChatClient.pas' recursively uses itself Ich habe eigentlich nichts anderes verändert als die Destroy-procedure... Wie kann es denn jetzt dazu kommen? |
Re: inherited Free; <-- warum kommt da eine exeption?!
Zitat:
Zitat:
|
Re: inherited Free; <-- warum kommt da eine exeption?!
Ich meinte damit:
Wenn man eine Klasse erstellt, dann soll man den Destructor Destroy überschreiben und nicht Free zu einem Destructor machen. Aus dem Code heraus sollte man natürlich
Delphi-Quellcode:
aufrufen um den Speicher wieder freizugeben.
KLASSE.Free
|
Re: inherited Free; <-- warum kommt da eine exeption?!
Zitat:
mfg, mh166 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:12 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 by Thomas Breitkreuz