Einzelnen Beitrag anzeigen

Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#63

Re: Record zurücksetzen (löschen)

  Alt 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.
  Mit Zitat antworten Zitat