![]() |
Re: Record zurücksetzen (löschen)
Zitat:
|
Re: Record zurücksetzen (löschen)
Zitat:
|
Re: Record zurücksetzen (löschen)
Hier das Demo:
Delphi-Quellcode:
Beispiel:
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. ----------
Delphi-Quellcode:
Guido.
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; |
Re: Record zurücksetzen (löschen)
Zitat:
noch auf speicherbereiche in denen der "müll" von anderen anwendungen rumliegt. naja soweit glaube ich es verstanden zu haben. mfg smallsmoker |
Re: Record zurücksetzen (löschen)
Zitat:
|
Re: Record zurücksetzen (löschen)
Hallo smallsmoker, willkommen in der Runde. :-D
Hab ich mich da nicht deutlich genug ausgedrückt ? :gruebel: Zitat:
Zitat:
Somit haben wir beide das Gleiche gesagt, nur anders ausgedrückt. Ich dachte, dass Programmierer das so interpretieren. :P Guido. |
Re: Record zurücksetzen (löschen)
Zufallswerte sind nicht undefinierte Werte.
Da gibt es riesige Unterschiede, aber das würde das Thema hier sprengen ;-) |
Re: Record zurücksetzen (löschen)
Zitat:
Guido. |
Re: Record zurücksetzen (löschen)
Zitat:
|
Re: Record zurücksetzen (löschen)
Und?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:12 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