Registriert seit: 9. Apr 2006
389 Beiträge
Delphi 10.3 Rio
|
Re: Record zurücksetzen (löschen)
16. Sep 2008, 22:36
Hier das Demo:
Delphi-Quellcode:
unit Unit2;
(*
==============================
Record-Variable schnell leeren
==============================
Um alle Felder einer Record-Variablen schnell und einfach zu leeren,
kann man die Routinen "Finalize" + "FillChar" benutzen. Diese
wurden in diesem Demo in der Prozedur "Clear" zusammengefasst.
Dabei werden String-Variablen auf leer, Zahlen-Variablen auf Null,
... gesetzt.
Auch verschachtelte Records können damit geleert werden. Das heißt,
Records die selbst wieder Records enthalten.
In der Methode Clear müssen vor dem abschließenden FillChar-Befehl
alle (dynamischen) Daten im Record freigegeben werden. Finalize
selbst berücksichtigt nur die referenzgezählten Daten.
Speicherbereiche, die mit New o. ä. angelegt wurden, sowie Objekte,
die durch Aufruf eines Konstruktors erzeugt wurden, muss man also
auch wieder manuell freigeben.
Tipp von Hawkeye219 auf [url]www.delphipraxis.net[/url], in meinem Thread
"Sonstige Fragen zu Delphi \ Record zurücksetzen (löschen)".
Forum-Thread und Demo von Guido Eisenbeis, 2008-09-14.
*)
interface
uses
Windows;
Type
TMyRecord = record
Test_1 : string;
Test_2 : string;
Integer_1 : Integer;
Integer_2 : Integer;
FindData: TWIN32FINDDATA;
procedure Clear();
end;
implementation
// Finalize + FillChar Lösung
procedure TMyRecord.Clear();
begin
Finalize(Self);
FillChar(Self, SizeOf(Self), 0);
end;
end.
Beispiel:
----------
Delphi-Quellcode:
unit Unit1;
...
implementation
{$R *.dfm}
uses
Unit2;
// Einige Testwerte setzen
procedure SetTestValues( var AMyRecord: TMyRecord);
begin
AMyRecord.Test_1 := ' Hallo';
AMyRecord.Test_2 := ' Welt!';
AMyRecord.Integer_1 := 9;
AMyRecord.Integer_2 := 2008;
AMyRecord.FindData.cFileName := ' TestVal';
end;
// String für Ausgabe formatieren
function PrepareMsg(AMyRecord: TMyRecord): string;
begin
Result :=
' Test_1: ' + ' >' + AMyRecord.Test_1 + ' <' + #13#10+
' Test_2: ' + ' >' + AMyRecord.Test_2 + ' <' + #13#10+
' Integer_1: ' + IntToStr(AMyRecord.Integer_1) + #13#10+
' Integer_2: ' + IntToStr(AMyRecord.Integer_2) + #13#10+
' FindData.cFileName: ' + ' >' + AMyRecord.FindData.cFileName + ' <';
end;
procedure TForm1.Button1Click(Sender: TObject);
var
MyRecord: TMyRecord;
begin
// Undefinierte Anfangswerte (beim ersten Test erscheinen hier Zufallswerte).
ShowMessage(PrepareMsg(MyRecord));
// Beispielwerte zuweisen
SetTestValues(MyRecord);
ShowMessage(PrepareMsg(MyRecord));
// Alle Record-Felder mit "FillChar" leeren.
MyRecord.Clear;
ShowMessage(PrepareMsg(MyRecord));
// Beispielwerte zur Kontrolle erneut zuweisen
SetTestValues(MyRecord);
ShowMessage(PrepareMsg(MyRecord));
end;
Guido.
|
|
Zitat
|