Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - String mit WriteBuffer schreiben


Arne - Sa 31.12.05 16:00
Titel: String mit WriteBuffer schreiben
Mahlzeit zusammen,

ich möchte einen String mittels TFileStream.WriteBuffer in eine Datei schreiben, aber das klappt nicht, wie ich es mir vorstelle.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
  myString    : String;

begin
  { hier schreibe ich was in myString rein, was laut Debugger auch funktioniert }
  myStream.WriteBuffer(myString, 32);
end;


Der Prototyp von TFileStream.WriteBuffer lautet:

WriteBuffer(const: Buffer; Count : LongInt);

Wenn ich mit dem Debugger in TFileStream.WriteBuffer reinsteppe, enthält Buffer "kein Wert".
Kann mir jemand erklären, welchen TypeCast ich machen muß, oder wie ich sonst hinbekomme?


Thanx und Guten Rutsch,
Arne


BenBE - Sa 31.12.05 16:08

String speichern mit Streams ist etwas gewhönungsbedürftig:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
    S: TStream;
    L: Integer;
    St: String;

    L := Length(St);
    S.WriteBuffer(L, SizeOf(Integer));
    If L <> 0 Then
        S.WriteBuffer(S[1], L);


Lesen analog dazu ... Beachte, dass Du vor dem Lesen der Daten aus dem Stream den String erst alloziieren musst mit SetLength (d.h. Länge lesen, SetLength aufrufen dann String-Daten lesen).


Opa - Sa 31.12.05 16:23

Ich hatte gerade was für mich gemacht um einen Stream nach string zu lesen *g

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
function _LoadFromStream(Stream: TStream):string;
var//Classes
  Size: integer;
begin
  result := '';
  try
    Size := Stream.Size - Stream.Position;
    SetString(result, nil, Size);
    Stream.Read(Pointer(result)^, Size);
  except
    result := '';
  end;
end;

function _FileLoad(const DateiName: string):string;
var
  Stream : TStream;
begin
  result := '';
  Stream := TFileStream.Create(DateiName, fmOpenRead or fmShareDenyWrite);
  try
  Stream.Position := 0;
  if boolean(Stream.Size) then result := _LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end;


Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt


Arne - Sa 31.12.05 17:57

Danke - klappt jetzt :P


Keldorn - Sa 31.12.05 18:19

Hallo

alternativ die Treader und Twriter klassen anschaun, die haben für jeden Typ ihre eigenen Methoden, die Daten in den stream zu schreiben. Um die Längenangaben beim string brauchst du dich so nicht zu kümmern.

Mfg Frank