![]() |
Probleme mit Streams und Read bzw. Write
Hallo erstmal,
ich habe folgendes Problem. In einer Stringliste habe ich jede Menge Objecte die ich alle als Stream abspeichern will. Also ich will die Stringliste als Stream abspeichern und später wieder laden können (eine kleine Art Datenbank...). Hier der Sourceausschnitt: Im Debugger ist beim Speichern alles ganz gut gelaufen (in den Daten stehen richtige Werte). Nur das Laden funktioniert nicht. In meinem Datensatz steht immer "Mist"... MFG Alex
Delphi-Quellcode:
type
PDatensatz = ^TDatensatz; TDatensatz = record FStr1, FStr2, FStr3, FStr4 : String; end; ... procedure TMainForm.MI_SpeichernClick(Sender: TObject); var TmpStream : TFileStream; i : Integer; Datensatz : PDatensatz; begin SaveDialog1.InitialDir := ExtractFilePath(Application.ExeName); if SaveDialog1.Execute then begin TmpStream := TFileStream.Create(SaveDialog1.FileName, fmCreate); for i := 0 to SL.Count - 1 do begin TObject(Datensatz) := SL.Objects[i]; TmpStream.Write(Datensatz^, SizeOf(TDatensatz)); end; TmpStream.Free; end; end; { ---------------------------------------------------------------------------- } procedure TMainForm.MI_LadenClick(Sender: TObject); var TmpStream : TFileStream; Datensatz : PDatensatz; begin OpenDialog1.InitialDir := ExtractFilePath(Application.ExeName); if OpenDialog1.Execute then begin TmpStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead); New(Datensatz); TmpStream.Read(Datensatz^, SizeOf(TDatensatz)); if Assigned(Datensatz) then begin if Assigned(SL) then SL.AddObject(IntToStr(SL.Count + 1),TObject(Datensatz)); end; TmpStream.Free; end; end; |
Re: Probleme mit Streams und Read bzw. Write
Probiers mal damit
Delphi-Quellcode:
Der Delphi-String-Typ ist was spezielles. In deinem Record wird bei einfacher Angabe von String nur eine Zeiger auf einen Speicherbereich vermerkt, wo dann der String mit Länge und Refernzzählung liegt. D.h. in deiner Datei landet auch nur der Zeicher auf den eigentlichen String.
TDatensatz = record
FStr1, FStr2, FStr3, FStr4 : String[200]; end; Mit String[200] wird wirklich soviel Speicher in deinem Record reserviert und auch entsprechend in deiner Datei gespeichert. |
Re: Probleme mit Streams und Read bzw. Write
achso, verstehe...
würde es dann auch gehen, wenn ich ein
Delphi-Quellcode:
daraus mache?
packed record
MFG Alex |
Re: Probleme mit Streams und Read bzw. Write
wie mache ich das eigentlich, dass ich in einer Art Schleife einlese, denn ich weiß ja nicht wie viele Datensätze ich gespeichert habe vorher...
Danke Bernhard Geyer... Es hat so geklappt!!! |
Re: Probleme mit Streams und Read bzw. Write
Zitat:
|
Re: Probleme mit Streams und Read bzw. Write
okay Danke schön!!!
MFG Alex |
Re: Probleme mit Streams und Read bzw. Write
das würde aber bedeuten das ein einziger datensatz 800 bytes belegt (4*200bytes)
das könnte man auch verkleinern in dem man "string" lässt und lediglich die speicher"routine" abändert um nen string innem stream zu speichern könnte man sich folgender prozedur bedienen
Delphi-Quellcode:
das lesen analog dazu
procedure WriteStringToStream(Stream: TStream; const Value: string);
begin Stream.Write(Length(Value, 4); // 4 = SizeOf(Length(Value)) = SizeOf(Integer) Stream.Write(Value[1], Length(Value)); end;
Delphi-Quellcode:
procedure ReadStringFromStream(Stream: TStream; var Value: string); // wenn nötig kann man das var auch weglassen
var iLength: integer; begin Stream.Read(iLength, 4); SetLength(Value, iLength); Stream.Read(Value[1], iLength); end; |
Re: Probleme mit Streams und Read bzw. Write
okay, dass mit der Datengröße ist ein Argument :-)
Aber wieso meckert der Compiler bei folgender Zeile:
Delphi-Quellcode:
MFG Alex
procedure TMainForm.WriteStringToStream(Stream: TStream; Value: string);
begin Stream.Write(Length(Value), 4); // <----------- VARIABLE Erforderlich... Stream.Write(Value[1], Length(Value)); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 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 by Thomas Breitkreuz