AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Record zurücksetzen (löschen)

Ein Thema von Guido Eisenbeis · begonnen am 14. Sep 2008 · letzter Beitrag vom 10. Okt 2008
Antwort Antwort
Seite 7 von 9   « Erste     567 89      
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#61

Re: Record zurücksetzen (löschen)

  Alt 16. Sep 2008, 19:38
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.
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#62

Re: Record zurücksetzen (löschen)

  Alt 16. Sep 2008, 19:38
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
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
Benutzerbild von smallsmoker
smallsmoker

Registriert seit: 12. Nov 2007
Ort: Duisburg
283 Beiträge
 
#64

Re: Record zurücksetzen (löschen)

  Alt 16. Sep 2008, 22:51
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
  Mit Zitat antworten Zitat
Benutzerbild von SubData
SubData

Registriert seit: 14. Sep 2004
Ort: Stuhr
1.078 Beiträge
 
Delphi 11 Alexandria
 
#65

Re: Record zurücksetzen (löschen)

  Alt 17. Sep 2008, 08:10
Zitat von smallsmoker:
noch auf speicherbereiche in denen der "müll" von anderen anwendungen rumliegt.
Was ggf. direkt zu einer Zugriffsverletzung führen kann.
Ronny
/(bb|[^b]{2})/
  Mit Zitat antworten Zitat
Guido Eisenbeis

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

Re: Record zurücksetzen (löschen)

  Alt 17. Sep 2008, 21:15
Hallo smallsmoker, willkommen in der Runde.

Hab ich mich da nicht deutlich genug ausgedrückt ?

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.

Guido.
  Mit Zitat antworten Zitat
Benutzerbild von SubData
SubData

Registriert seit: 14. Sep 2004
Ort: Stuhr
1.078 Beiträge
 
Delphi 11 Alexandria
 
#67

Re: Record zurücksetzen (löschen)

  Alt 17. Sep 2008, 22:37
Zufallswerte sind nicht undefinierte Werte.

Da gibt es riesige Unterschiede, aber das würde das Thema hier sprengen
Ronny
/(bb|[^b]{2})/
  Mit Zitat antworten Zitat
Guido Eisenbeis

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

Re: Record zurücksetzen (löschen)

  Alt 17. Sep 2008, 22:57
Zitat von SubData:
Zufallswerte sind nicht undefinierte Werte.
Warum erwähnst du das? Das hat niemand behauptet!

Guido.
  Mit Zitat antworten Zitat
Benutzerbild von SubData
SubData

Registriert seit: 14. Sep 2004
Ort: Stuhr
1.078 Beiträge
 
Delphi 11 Alexandria
 
#69

Re: Record zurücksetzen (löschen)

  Alt 18. Sep 2008, 08:33
Zitat von Guido Eisenbeis:
Zitat:
zeigen die pointer noch auf speicherbereiche in denen der "müll" von anderen anwendungen rumliegt.
= Zufallswerte.
Ronny
/(bb|[^b]{2})/
  Mit Zitat antworten Zitat
Guido Eisenbeis

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

Re: Record zurücksetzen (löschen)

  Alt 18. Sep 2008, 10:07
Und?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 7 von 9   « Erste     567 89      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:37 Uhr.
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