AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Member Class löschen

Ein Thema von hanspeter · begonnen am 28. Jul 2014 · letzter Beitrag vom 28. Jul 2014
Antwort Antwort
Seite 1 von 2  1 2      
hanspeter

Registriert seit: 26. Jul 2003
Ort: Leipzig
1.350 Beiträge
 
Delphi XE2 Professional
 
#1

Member Class löschen

  Alt 28. Jul 2014, 09:31
Delphi-Version: XE2
Hallo,
Mit einem Record ist das ja kein Problem.
Delphi-Quellcode:
datRec = record
 p1: string;
 p2: integer;
end;

var
 x: Datrec;

fillchar(x,sizeof(x),0);
Den Code will ich in einem alten Programm mit einer Klasse ersetzen.
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?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

AW: Member Class löschen

  Alt 28. Jul 2014, 09:42
InitInstance?

Aber das kann auch schon mal ins Auge gehen, wenn Ableitungen von der Klasse nicht damit rechnen...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
hanspeter

Registriert seit: 26. Jul 2003
Ort: Leipzig
1.350 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Member Class löschen

  Alt 28. Jul 2014, 09:52
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.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: Member Class löschen

  Alt 28. Jul 2014, 09:57
FillChar wird bei records doch meistens eh nur benutzt, um eine lokale Variable zu initialisieren. Das ist bei einer Klasse nicht notwendig.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#5

AW: Member Class löschen

  Alt 28. Jul 2014, 10:08
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 InitInstance 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.

Entweder man schreibt eine passende Methode Clear für jede Klasse oder man erzeugt die Klasse neu. Das ist auf jeden Fall der sicherere Weg.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: Member Class löschen

  Alt 28. Jul 2014, 10:17
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 InitInstance 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.

Entweder man schreibt eine passende Methode Clear für jede Klasse oder man erzeugt die Klasse neu. Das ist auf jeden Fall der sicherere Weg.
Dem kann ich nur zustimmen.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
hanspeter

Registriert seit: 26. Jul 2003
Ort: Leipzig
1.350 Beiträge
 
Delphi XE2 Professional
 
#7

AW: Member Class löschen

  Alt 28. Jul 2014, 10:33
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: Member Class löschen

  Alt 28. Jul 2014, 11:48
Mit einem Record ist das ja kein Problem.
Delphi-Quellcode:
datRec = record
 p1: string;
 p2: integer;
end;

var
 x: Datrec;

fillchar(x,sizeof(x),0);
Und schon hast du ein Speicherleck, da du die Referenzzählung des Strings zerschießt. (wenn in p1 etwas drin war)

Einzige ordentliche Lösung: die Clear-Methode
$2B or not $2B

Geändert von himitsu (28. Jul 2014 um 11:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von smallie
smallie

Registriert seit: 8. Jan 2013
19 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Member Class löschen

  Alt 28. Jul 2014, 12:59
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;
"There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors."

Geändert von smallie (28. Jul 2014 um 13:18 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

AW: Member Class löschen

  Alt 28. Jul 2014, 13:54
Wie wär's damit, den constructor auf die Instanz anzuwenden?
Davon möchte ich dringend abraten. Außer, dass es schlechter Stil ist, den Konstructor als Clear Methode zu missbrauchen,
wird dieser Code auch u.U. mit einem Compiler Fehler quittiert.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:45 Uhr.
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