![]() |
Delphi-Version: XE2
Member Class löschen
Hallo,
Mit einem Record ist das ja kein Problem.
Delphi-Quellcode:
Den Code will ich in einem alten Programm mit einer Klasse ersetzen.
datRec = record
p1: string; p2: integer; end; var x: Datrec; fillchar(x,sizeof(x),0); Als Möglichkeit fällt mir im Moment ein - die Klasse freizugeben und neu zu erzeugen. - Ein Vorfahre der über RTTI alls Member auf null setzt. - Eine Methode Clear, die alle Member auf Null setzt. Fällt jemanden noch eine weitere Variante ein? |
AW: Member Class löschen
![]() Aber das kann auch schon mal ins Auge gehen, wenn Ableitungen von der Klasse nicht damit rechnen... |
AW: Member Class löschen
Ist aber unsicher?
Zitat: Da InitInstance keine virtuelle Methode ist, können Sie sie nicht überschreiben: Initialisieren Sie daher alle Daten eines Objekts im Konstruktor. |
AW: Member Class löschen
FillChar wird bei records doch meistens eh nur benutzt, um eine lokale Variable zu initialisieren. Das ist bei einer Klasse nicht notwendig.
|
AW: Member Class löschen
Wenn ich das richtig verstanden habe, will er eine bereits instanzierte Klasse wieder reseten - und das mit einer einzigen Methode, wie für alle denkbaren Klassen funktioniert. Wegen der möglichen Komplexität, die manche Klassen an den Tag legen, ist das aber meiner Meinung nach zum Scheitern verurteilt.
Insofern möchte ich meinen Vorschlag von
Delphi-Quellcode:
auch lieber zurückziehen. Es tut zwar im wörtlichen Sinne was gewünscht ist, aber in vielen Fällen ist dieses Verhalten eigentlich gar nicht erwünscht bzw. das Ergebnis dann unerwartet.
InitInstance
Entweder man schreibt eine passende Methode
Delphi-Quellcode:
für jede Klasse oder man erzeugt die Klasse neu. Das ist auf jeden Fall der sicherere Weg.
Clear
|
AW: Member Class löschen
Zitat:
|
AW: Member Class löschen
Das ist wie gesagt ein Legacy Projekt, was ich auf Unicode umstelle.
Der Record wird einmal (local) angelegt und dann beliebig oft gelöscht und mit neuen Daten gefüllt. Bisher habe ich schon (fast) jede Klasse mit einer Assign und einer Clear Methode ergänzt. Ist zwar Copy und Paste der Variablenliste aber es nervt. Ich hatte die Hoffnung das ich noch eine Möglichkeit übersehen habe, das eleganter zu lösen. Also erst mal vielen Dank. |
AW: Member Class löschen
Zitat:
Einzige ordentliche Lösung: die Clear-Methode |
AW: Member Class löschen
Wie wär's damit, den constructor auf die Instanz anzuwenden?
Sieht zwar ungewohnt aus, hat aber den Vorteil, die Vererbungshierarchie zu berücksichtigen.
Delphi-Quellcode:
type
TClearingClass = class private public s: string; i: integer; constructor create; end; TClearingChild = class(TClearingClass) public d: double; constructor create; end; implementation { TClearingClass } constructor TClearingClass.create; begin inherited; // explizit: s := ''; i := 0; end; { TClearingChild } constructor TClearingChild.create; begin inherited; d := 0.0; end; Beispiel:
Delphi-Quellcode:
type
TForm1 = class(TForm) btnCreate: TSpeedButton; btnInit: TSpeedButton; procedure btnCreateClick(Sender: TObject); procedure btnInitClick(Sender: TObject); private public end; implementation procedure TForm1.btnCreateClick(Sender: TObject); begin ClearingChild := TClearingChild.create; //Constructor showMessageFmt('s: %s, i: %d, d: %g', [ClearingChild.s, ClearingChild.i, ClearingChild.d]); //s: , i: 0, d: 0 end; procedure TForm1.btnInitClick(Sender: TObject); begin ClearingChild.s := 'changed'; ClearingChild.i := -1; ClearingChild.d := -1.1; ClearingChild.create; //Instanz initialisieren showMessageFmt('s: %s, i: %d, d: %g', [ClearingChild.s, ClearingChild.i, ClearingChild.d]); //s: , i: 0, d: 0 end; |
AW: Member Class löschen
Zitat:
wird dieser Code auch u.U. mit einem ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:13 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