Delphi-PRAXiS
Seite 7 von 9   « Erste     567 89      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Record zurücksetzen (löschen) (https://www.delphipraxis.net/120638-record-zuruecksetzen-loeschen.html)

toms 16. Sep 2008 18:38

Re: Record zurücksetzen (löschen)
 
Zitat:

Zitat von Guido Eisenbeis
Ich habe auch ein kleines Demo dazu geschrieben. Das fasst zwar im Prinzip nur die hier geposteten Infos zusammen, aber wenn Interesse besteht, werde ich das Demo gerne hier posten.

Hallo Guido, kannst das Demo gerne hier posten.

Neutral General 16. Sep 2008 18:38

Re: Record zurücksetzen (löschen)
 
Zitat:

Zitat von Guido Eisenbeis
Nun habe ich mich entschieden, dass die FillChar-Lösung die richtige für mein Problem ist und werde sie verwenden.

Vergiss das Finalize nicht :stupid: ;)

Guido Eisenbeis 16. Sep 2008 21:36

Re: Record zurücksetzen (löschen)
 
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.

smallsmoker 16. Sep 2008 21:51

Re: Record zurücksetzen (löschen)
 
Zitat:

// Undefinierte Anfangswerte (beim ersten Test erscheinen hier Zufallswerte).
das stimmt so nicht ganz, da du dein record nicht initialisierst vorm ersten aufruf zeigen die pointer
noch auf speicherbereiche in denen der "müll" von anderen anwendungen rumliegt.

naja soweit glaube ich es verstanden zu haben.

mfg smallsmoker

SubData 17. Sep 2008 07:10

Re: Record zurücksetzen (löschen)
 
Zitat:

Zitat von smallsmoker
noch auf speicherbereiche in denen der "müll" von anderen anwendungen rumliegt.

Was ggf. direkt zu einer Zugriffsverletzung führen kann.

Guido Eisenbeis 17. Sep 2008 20:15

Re: Record zurücksetzen (löschen)
 
Hallo smallsmoker, willkommen in der Runde. :-D

Hab ich mich da nicht deutlich genug ausgedrückt ? :gruebel:

Zitat:

da du dein record nicht initialisierst vorm ersten aufruf
= nicht- (oder un-) definierte Anfangswerte.

Zitat:

zeigen die pointer noch auf speicherbereiche in denen der "müll" von anderen anwendungen rumliegt.
= Zufallswerte.

Somit haben wir beide das Gleiche gesagt, nur anders ausgedrückt. Ich dachte, dass Programmierer das so interpretieren. :P

Guido.

SubData 17. Sep 2008 21:37

Re: Record zurücksetzen (löschen)
 
Zufallswerte sind nicht undefinierte Werte.

Da gibt es riesige Unterschiede, aber das würde das Thema hier sprengen ;-)

Guido Eisenbeis 17. Sep 2008 21:57

Re: Record zurücksetzen (löschen)
 
Zitat:

Zitat von SubData
Zufallswerte sind nicht undefinierte Werte.

Warum erwähnst du das? Das hat niemand behauptet!

Guido.

SubData 18. Sep 2008 07:33

Re: Record zurücksetzen (löschen)
 
Zitat:

Zitat von Guido Eisenbeis
Zitat:

zeigen die pointer noch auf speicherbereiche in denen der "müll" von anderen anwendungen rumliegt.
= Zufallswerte.


Guido Eisenbeis 18. Sep 2008 09:07

Re: Record zurücksetzen (löschen)
 
Und?


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:53 Uhr.
Seite 7 von 9   « Erste     567 89      

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