AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Records speichern, (mit nicht festbegrenzten Array's)
Thema durchsuchen
Ansicht
Themen-Optionen

Records speichern, (mit nicht festbegrenzten Array's)

Ein Thema von magicshadow · begonnen am 6. Mai 2003 · letzter Beitrag vom 6. Mai 2003
 
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#3
  Alt 6. Mai 2003, 14:25
Hallo,
Du könntest anstatt PChar auch String nehmen und die Recordfelder einzeln in einen Stream schreiben. Dafür habe ich mir jeweils für TMemoryStream und TFileStream einen Nachfahren gebastelt. Diese beide Stream-Klassen habe jeweils die Methoden WriteStringToStream und ReadStringFromStream.
Delphi-Quellcode:
unit Streaming;

interface

uses Sysutils, Classes;

Type

  TMemoryStreamExt = class(TMemoryStream)
  public
    procedure WriteStringToStream(aStr : String);
    function ReadStringFromStream : String;
  end;

  TFileStreamExt = class(TFilestream)
  public
    procedure WriteStringToStream(aStr : String);
    function ReadStringFromStream : String;
  end;



implementation


{ TFileStreamExt }

procedure TFileStreamExt.WriteStringToStream(aStr : String);
var
   aStrLen : Integer;
begin
  aStrLen:=Length(aStr);
  WriteBuffer(aStrLen,SizeOf(Integer));
  WriteBuffer(Pointer(aStr)^,aStrLen);
end;

function TFileStreamExt.ReadStringFromStream: String;
var
   aStrLen : Integer;
begin
  ReadBuffer(aStrLen,SizeOf(Integer));
  SetLength(Result,aStrLen);
  ReadBuffer(Pointer(Result)^,aStrLen);
end;

{ TMemoryStreamExt }

function TMemoryStreamExt.ReadStringFromStream: String;
var
   aStrLen : Integer;
begin
  ReadBuffer(aStrLen,SizeOf(Integer));
  SetLength(Result,aStrLen);
  ReadBuffer(Pointer(Result)^,aStrLen);
end;

procedure TMemoryStreamExt.WriteStringToStream(aStr: String);
var
   aStrLen : Integer;
begin
  aStrLen:=Length(aStr);
  WriteBuffer(aStrLen,SizeOf(Integer));
  WriteBuffer(Pointer(aStr)^,aStrLen);
end;


end.
Die Reihenfolge mit der Du die einzelnen Recordfelder in den Stream schreibst bestimmt die Reihenfolge mit der Du die einzelnen Recordfelder wieder aus dem Stream liest.

Tip:
Wenn Du die Rcords in einer Liste hälst empfiehlt es sich anstett Records Nachfahren von TCollectionItem zu verwenden. TCollectionItem in Verbindung mit TCollection ist hier extrem leistungsfähig (meine Meinung). Die Recordfelder werden als published properties von TCollectionItem deklariert. Dann rezeugt man eine Dummykomponente. Eine published property der Dummykomponente ist dann TCollection. Zum Speichern schreibt man die Dummykomponente mit TStream.WriteComponent in den Stream. Zum lesen verwendet man dann TStream.ReadComponent.
Der Clou an der Sache ist, dass man dann das delphiinterne Streaming verwendet. D.h. das die TCollection incl. aller TCollectionItem Elemente automatisch gespeichert werden. Besonders sinnvoll wird dieses Verfahren, wenn die properties von TCollectionItem wiederrum Listen sind.
D.h. mit diesem Verfahren kann man sehr bequem Listen in Listen in Listen usw speichern.
Ich hoffe, ich habe mich verständlich ausgedrückt.
Ich habe irgendwo noch ein Beispiel. Ich werde mal auf die Suche gehen.
  Mit Zitat antworten Zitat
 


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 01:02 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