Einzelnen Beitrag anzeigen

Guido Eisenbeis

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

Re: Record zurücksetzen (löschen)

  Alt 14. Sep 2008, 12:29
@Michael:
Danke für das "Entschrummpeln" der Forumsansicht!


Zitat von Luckie:
Oder besser noch, sag uns, was du eigentlich vor hast.
Zitat von sirius:
Was heißt den löschen?
Record löschen, zurücksetzen, oder wie Marius schrieb "Alle Felder leeren", also alle Werte des Records auf einen Anfangswert setzen. Z. B. Strings auf '' (leer), Integer auf 0, ...

Was ich vorhabe:

Zum einen will ich hierbei meinen Delphi-Horizont erweitern. Bisher habe ich bei Records eine Routine geschrieben, in der alle Felder auf einen definierten Wert gesetzt wurden. Beispiel:

Delphi-Quellcode:

Type
  TMyRecord = record
    Test_1 : string;
    Test_2 : string;
    Integer_1 : Integer;
    Integer_2 : Integer;
  end;


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);
end;


procedure ResetMyRecord(var AMyRecord: TMyRecord);
begin
  AMyRecord.Test_1 := '';
  AMyRecord.Test_2 := '';
  AMyRecord.Integer_1 := 0;
  AMyRecord.Integer_2 := 0;
end;


procedure SetTestValues(var AMyRecord: TMyRecord);
begin
  AMyRecord.Test_1 := 'Hallo ';
  AMyRecord.Test_2 := 'Welt!';
  AMyRecord.Integer_1 := 9;
  AMyRecord.Integer_2 := 2008;
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));

  // mit "händischer" Lösung auf definierte AnfangsWerte setzen
  ResetMyRecord(MyRecord);
  ShowMessage(PrepareMsg(MyRecord));

  // BeispielWerte zuweisen
  SetTestValues(MyRecord);
  ShowMessage(PrepareMsg(MyRecord));

  // "FillChar"-Lösung
  Finalize(MyRecord);
  FillChar(MyRecord, SizeOf(MyRecord), 0);
  ShowMessage(PrepareMsg(MyRecord));
end;
Nun will ich zum Einen wissen, ob es da eine einfachere Möglichkeiten gibt, um meinen Code kürzer und übersichtlicher zu halten.
Zum Anderen hat die obige "händische" Lösung zwar den Vorteil, dass man selbst definierte Werte erhält, aber den Nachteil, dass das bei umfangreicheren Records schnell recht aufwendig wird. Hinzu kommt, dass in meinem konkretten Fall (Verknüpfungen auslesen) mein Record auch noch einen weiteren Record enthält. Da ist dann die Frage, wie weit die händische Lösung sinnvoll ist.

Delphi-Quellcode:
type
  TMyRecord = record
    Test_1 : string;
    Test_2 : string;
    Integer_1 : Integer;
    Integer_2 : Integer;
    FindData: TWIN32FINDDATA; // <-- weiterer Record in meinem Record
  end;

@toms

Die "MyBlankRecord"-Lösung entspricht in meiner Auffassung der "händischen" Lösung, ist hier also nicht gewollt.

Die "FillChar"-Lösung erscheint mir eher als eine Lösung in meinem Sinne. Gewünscht ist eine Lösung mit kurzem Code, die schon-vorhandene Delphi Routinen benutzt. Und das wäre hierbei der Fall. Und es schein sogar recht elegant zu sein.

OK, nach ersten Tests (siehe Komplett-Code oben) scheint die "FillChar"-Möglichkeit tatsächlich die gewünschte "elegange" Lösung zu sein. Ich werde nun noch Test mit dem zusätzlichen Record in meinem Record (FindDate: TWIN32FINDDATA) durchführen.


@Ronny
Meines Wissens nach werden mit FillChar auch die Strings auf "0" gesetzt (komplett mit Nullen gefüllt, also sozusagen Null-terminiert). Das entspricht einem leeren String und ist das gewünschte Ziel.

Mal sehen, was die anderen sagen.

Guido.
  Mit Zitat antworten Zitat