Delphi-PRAXiS
Seite 1 von 9  1 23     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)

Guido Eisenbeis 14. Sep 2008 01:11


Record zurücksetzen (löschen)
 
Delphi-Quellcode:
// Beispiel:

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

 ...

 MyRecord: TMyRecord;
Hi,

da ich bei meiner Suche nichts gefunden habe, ahne ich, dass ich da selbst Hand angelegt muss. Aber dennoch die Frage: Gibt es eine Delphi-Funktion um ein Record zu löschen? Also sowas wie MyRecord := nil? :gruebel:

Guido.


Edit: Ein Demo der Lösung, für die ich mich entschieden habe, befindet sich in Posting #63.

.

mr_emre_d 14. Sep 2008 01:26

Re: Record zurücksetzen (löschen)
 
Die Delphi-Hilfe:
Code:
Records (erweiterte)
Zusätzlich zu den traditionellen Record-Typen lässt die Delphi-Sprache komplexere und “klassenähnliche” Record-Typen zu. Zu den Feldern können Records Eigenschaften und Methoden (einschließlich Konstruktoren), Klasseneigenschaften, Klassenmethoden, Klassenfelder und verschachtelte Typen haben. Weitere Informationen hierzu finden Sie in der Dokumentation zu Klassen und Objekten. Im Folgenden finden Sie eine Beispiel-Record-Typdefinition mit einigen “klassenähnlichen” Merkmalen.
 
Obwohl Records nun einige der Merkmale von Klassen besitzen, gibt es wichtige Unterschiede zwischen Klassen und Records.
 
Records unterstützen keine Vererbung.
Records können variante Teile enthalten; Klassen nicht.
Records sind Wertetypen, daher werden Sie bei der Zuweisung kopiert, per Wert übergeben und dem Stack zugewiesen, wenn sie nicht als global definiert sind oder explizit mit den Funktionen New und Dispose zugewiesen werden. Klassen sind Referenztypen, daher werden Sie bei der Zuweisung nicht kopiert, per Referenz übergeben und dem Heap zugewiesen.
Records ermöglichen das Überladen von Operatoren auf Win32- und .NET-Plattformen; Klassen ermöglichen das Überladen von Operatoren nur bei .NET.
Records werden automatisch mit einem Standardkonstruktor ohne Argumente erzeugt, Klassen dagegen müssen explizit erzeugt werden. Weil Records einen argumentlosen Standardkonstruktor haben, muss jeder benutzerdefinierte Record-Konstruktor ein oder mehr Parameter haben.
Record-Typen können keine Destruktoren haben.
Virtuelle Methoden (die mit den Schlüsselwörtern virtual, dynamic und message angegeben werden) dürfen in Record-Typen nicht verwendet werden.
Im Gegensatz zu Klassen können Record-Typen auf der Win32-Plattform keine Schnittstellen implementieren; auf der .NET-Plattform können Records jedoch Schnittstellen implementieren.
[edit=Luckie]Neu abgschickt. Mfg, Luckie[/edit]

Guido Eisenbeis 14. Sep 2008 01:40

Re: Record zurücksetzen (löschen)
 
Warum schrummpelt den die Forum-Fensterdarstellung bei mir so zusammen?

Zum Thema: Ist da jetzt schon eine Antwort auf meine Frage drin? Dann bitte ein wenig genauer eingrenzen.

Danke,
Guido.

Luckie 14. Sep 2008 02:19

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

Zitat von Guido Eisenbeis
Delphi-Quellcode:
// Beispiel:

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

 ...

 MyRecord: TMyRecord;
Hi,

da ich bei meiner Suche nichts gefunden habe, ahne ich, dass ich da selbst Hand angelegt muss. Aber dennoch die Frage: Gibt es eine Delphi-Funktion um ein Record zu löschen? Also sowas wie MyRecord := nil? :gruebel:

Guido.

Nein gibt es nicht. Warum willst du ihn denn löschen? Oder besser noch, sag uns, was du eigentlich vor hast.
Zitat:

Zitat von Guido Eisenbeis
Warum schrummpelt den die Forum-Fensterdarstellung bei mir so zusammen?

Das Forum hat sich wohl verschluckt. Ich habe den Beitrag neu abgeschickt, jetzt stimmt wieder alles.

toms 14. Sep 2008 07:44

Re: Record zurücksetzen (löschen)
 
Hallo, du könntest Finalize + FillChar verwenden, um deinen Record zu "löschen":

Delphi-Quellcode:
 
 Finalize(MyRecord);
 FillChar(MyRecord, SizeOf(MyRecord), 0);
Oder du verwendest einen "BlankRecord". Vorteil: Du bestimmst selber die Werte, welche die Felder erhalten sollen.

Delphi-Quellcode:
const
  MyBlankRecord : TMyRecord = (Test_1: ''; Test_2: ''; Test_3: ''; Integer_1: 0; Integer_2: 0);
begin
  MyRecord := MyBlankRecord;
end;

sirius 14. Sep 2008 08:04

Re: Record zurücksetzen (löschen)
 
Was heißt den löschen?

MSSSSM 14. Sep 2008 08:19

Re: Record zurücksetzen (löschen)
 
Alle Felder leeren wahrscheinlich.

Hawkeye219 14. Sep 2008 09:20

Re: Record zurücksetzen (löschen)
 
Man könnte den ersten Vorschlag von toms sogar noch etwas erweitern:

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

procedure TMyRecord.Clear;
begin
  Finalize (Self);
  FillChar (Self, SizeOf(Self), 0);
end;

// Anwendung:

var
  MyRecord : TMyRecord;
begin
  MyRecord.Clear;
end;
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 manuell freigeben.

Gruß Hawkeye

Luckie 14. Sep 2008 11:33

Re: Record zurücksetzen (löschen)
 
Mist an FillChar habe ich nicht gedacht.

SubData 14. Sep 2008 12:21

Re: Record zurücksetzen (löschen)
 
Wenn er mit FillChar das Record löscht, dann werden aber die "Strings" da drin nicht wirklich überschrieben, sondern nur die Pointer, oder seh ich das jetzt falsch?


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:59 Uhr.
Seite 1 von 9  1 23     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