Delphi-PRAXiS
Seite 5 von 9   « Erste     345 67     Letzte »    

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)

Hawkeye219 14. Sep 2008 14:58

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

Zitat von Neutral General
Damit dürften wohl alle Zweifel und Unklarheiten aus der Welt geschafft sein :)

Gab es noch welche? klick

Gruß Hawkeye

Neutral General 14. Sep 2008 15:03

Re: Record zurücksetzen (löschen)
 
ups :oops:

Hab aber nicht abgeschrieben, ehrlich :oops:

Hansa 14. Sep 2008 15:09

Re: Record zurücksetzen (löschen)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Bei verschachtelten Records läuft das genauso.

Delphi-Quellcode:
    MyRecord : record
      nr : Integer;
      name : string [10];
      MyRecord2 : record
        nr : Integer;
        name : string [10];
      end;
    end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyRecord.nr := 1;
  MyRecord.name := 'XYZ';
  MyRecord.MyRecord2.nr := 2;
  MyRecord.MyRecord2.name := 'XYZ2';
  memo2.Lines.Add(IntToStr(MyRecord.nr));
  memo2.Lines.Add('*'+MyRecord.name+'*');
  memo2.Lines.Add('');
  FillChar (MyRecord,SizeOf (MyRecord),0);
  memo2.Lines.Add(IntToStr(MyRecord.nr));
  memo2.Lines.Add('*'+MyRecord.name+'*');
  memo2.Lines.Add(IntToStr(MyRecord.MyRecord2.nr));
  memo2.Lines.Add('*'+MyRecord.MyRecord2.name+'*');
end;
Ergebnis : Anhang. In diesem Beispiel ist auch das Finalize völlig überflüssig.

SubData 14. Sep 2008 15:15

Re: Record zurücksetzen (löschen)
 
Hatten wir nicht gerade, dass bei globalen Variablen mit der Methode ein MemoryLeak auftritt ?!

Neutral General 14. Sep 2008 15:26

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

Zitat von Hansa
Bei verschachtelten Records läuft das genauso.

Delphi-Quellcode:
    MyRecord : record
      nr : Integer;
      name : string [10];
      MyRecord2 : record
        nr : Integer;
        name : string [10];
      end;
    end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyRecord.nr := 1;
  MyRecord.name := 'XYZ';
  MyRecord.MyRecord2.nr := 2;
  MyRecord.MyRecord2.name := 'XYZ2';
  memo2.Lines.Add(IntToStr(MyRecord.nr));
  memo2.Lines.Add('*'+MyRecord.name+'*');
  memo2.Lines.Add('');
  FillChar (MyRecord,SizeOf (MyRecord),0);
  memo2.Lines.Add(IntToStr(MyRecord.nr));
  memo2.Lines.Add('*'+MyRecord.name+'*');
  memo2.Lines.Add(IntToStr(MyRecord.MyRecord2.nr));
  memo2.Lines.Add('*'+MyRecord.MyRecord2.name+'*');
end;
Ergebnis : Anhang. In diesem Beispiel ist auch das Finalize völlig überflüssig.

Zitat:

Zitat von SubData
Hatten wir nicht gerade, dass bei globalen Variablen mit der Methode ein MemoryLeak auftritt ?!

Dieses Beispiel ist in diesem Thread hier total fehl am Platz. Dadurch, dass Hansa jetzt in seinem Record Shortstrings benutzt hat, gibts das Problem natürlich nicht. ShortStrings sind eben keine Pointer. Von daher ist ein Finalize tatsächlich nicht nötig. Was Hansa jetzt damit sagen/verdeutlichen will, weiß ich allerdings nicht. Mir scheint, als hätte er nicht verstanden, worum es hier in dieser Diskussion geht. :roll:

Hawkeye219 14. Sep 2008 15:32

Re: Record zurücksetzen (löschen)
 
Hallo,

noch einmal zur Klarstellung:

Bei referenzgezählten Daten (dynamische Strings und Arrays, Interfaces) sollte ein Aufruf von Finalize vorgeschaltet werden, damit die internen Verwaltungsinformationen aufgeräumt werden können. Der Compiler erzeugt dabei einen Aufuf der zugehörigen RTL-Routine, die selbst feststellen kann, welche Felder des Records finalisiert werden müssen. Dies sollte mit beliebig geschachtelten Datentypen funktionieren. "Einfache" Zeiger werden von Finalize nicht zerstört.

Bei Referenzen auf Speicherbereiche oder Objekte ist der Programmierer selbst für die Freigabe der referenzierten Objekte verantwortlich. Hierzu wird die komplementäre Routine (GetMem/FreeMem, Create/Free,...) aufgerufen, um den Speicher wieder freizugeben.

Einfache Datentypen (Ordinaltypen, Fließkommatypen, kurze Strings(!),...) benötigen keine Aufräumarbeiten.

Ein Aufruf von FillChar darf erst erfolgen, nachdem die Verwaltungsdaten ordnungsgemäß aufgeräumt wurden. Beachtet man dies nicht, entstehen Memory Leaks.

Gruß Hawkeye

Hansa 14. Sep 2008 15:39

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

Zitat von Neutral General
..als hätte er nicht verstanden, worum es hier in dieser Diskussion geht. :roll:

Es steht doch in #1, dass es hierum geht :

Delphi-Quellcode:
type
  TMyRecord = record
    Test_1:          string;
    Test_2:          string;
    Test_3:          string;
    Integer_1:       integer;
    Integer_2:       integer;
  end;

...

MyRecord: TMyRecord;
Und das Ding soll leergemacht werden. Wozu dann soviel Klimbim machen ? Von der Compiler-Direktive $H+ ist nichts zu sehen. Insofern ist das finalize überflüssig und wird sogar vom Linker entfernt.

DeddyH 14. Sep 2008 15:43

Re: Record zurücksetzen (löschen)
 
String ist nicht gleich String[10], das ist der Unterschied.

Christian Seehase 14. Sep 2008 18:35

Re: Record zurücksetzen (löschen)
 
Moin Hansa,

Zitat:

Zitat von Hansa
Von der Compiler-Direktive $H+ ist nichts zu sehen.

wozu auch, schliesslich stellt man dies, üblicher Weise, in den Projektoptionen ein.
Ausserdem sind Huge-Strings auch die Standardeinstellung.
Hast Du es bei Dir umgestellt? ;-)

Hansa 14. Sep 2008 18:49

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

Zitat von Christian Seehase
Ausserdem sind Huge-Strings auch die Standardeinstellung.
Hast Du es bei Dir umgestellt? ;-)

Ne, nichts umgestellt. Warum auch ? Die Screenshots wurden produziert mit Projektoptionen-Checkbox "Huge-Strings" angehakt. Mache ich aus dem string [10] nur string, dann gehts genauso. @DeddyH


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:29 Uhr.
Seite 5 von 9   « Erste     345 67     Letzte »    

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