String in MemoryStream verwandeln!

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

String in MemoryStream verwandeln!

Beitrag von _X_ »

Ich schreibe den Inhalt von einem Memo in einen Stream(SaveToStream). Danach wandle ich den Stream in einen String um. Dieser wird in einer XML-Datei gespeichert.
Zum Zurückschreiben in das Memo nehme ich einfach Memo1.Lines.Add(Stream). Es funktioniert, ist aber nicht optimal, weil am Ende des Memos immer eine Leerzeile dazukommt.
Das würde vermutlich nicht auftreten wenn man LoadFromStream verwenden würde. Deshalb bräuchte ich eine Funktion die einen String in einen Memorystream verwandelt.

Um einen Memorystream in einen string umzuwandeln verwende ich im Moment diesen Code.

Code: Alles auswählen

function MemoryStreamToStr(const MemoryStream: TMemoryStream): string;
var
  StringStream: TStringStream;
begin
  StringStream := TStringStream.Create('');
  try
    StringStream.CopyFrom(MemoryStream, MemoryStream.Size);
    Result := StringStream.DataString;
  finally
    StringStream.Free;
  end;
end;
Um einen String in einen Stream zu verwandeln, habe ich den Code von http://dn.codegear.com/article/26416 ausprobiert, dieser funktioniert jedoch nicht. Der Stream bleibt aus unerfindlichen Gründen immer leer.

Hat jemand einen Codeschnippsel der das macht was ich brauche?

mfg _X_

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: String in MemoryStream verwandeln!

Beitrag von theo »

Ich mach das so:

Code: Alles auswählen

function MemStreamToString(Strm: TMemoryStream): AnsiString;
begin
  if Strm <> nil then
  begin
    Strm.Position := 0;
    SetString(Result, PChar(Strm.Memory), Strm.Size);
  end;
end;  
 
procedure StringToMemStream(AString: AnsiString; Strm: TMemoryStream);
var Len: integer;
begin
  if Strm <> nil then
  begin
    Len := Length(AString);
    Strm.Size := Len;
    Strm.Position := 0;
    Strm.Write(PChar(AString)^, Len);
    Strm.Position := 0;
  end;
end;

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: String in MemoryStream verwandeln!

Beitrag von _X_ »

Danke

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: String in MemoryStream verwandeln!

Beitrag von mse »

Vielleicht etwas schneller:

Code: Alles auswählen

tstringcopystream = class(tmemorystream)
  private
   fdata: string;
  protected
  public
   constructor create(const adata: string);
   destructor destroy; override;
   function write(const Buffer; Count: Longint): Longint; override;
 end;
 
{ tstringcopystream }
 
constructor tstringcopystream.create(const adata: string);
begin
 fdata:= adata;
 inherited create;
 if adata <> '' then begin
  setpointer(pointer(adata),length(adata));
 end;
end;
 
destructor tstringcopystream.destroy;
begin
 setpointer(nil,0);
 inherited;
end;
 
function tstringcopystream.write(const Buffer; Count: Longint): Longint;
begin
 result:= 0;
end;
Hmm, der highlighter scheint meinen indent Stil nicht zu mögen.

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: String in MemoryStream verwandeln!

Beitrag von _X_ »

Geht auch (war klar). Aber bis jetzt habe ich keinen merklichen unterschied festgestellt.

mfg _X_

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: String in MemoryStream verwandeln!

Beitrag von mse »

_X_ hat geschrieben:Geht auch (war klar). Aber bis jetzt habe ich keinen merklichen unterschied festgestellt.
Probier's mal mit 500MB. ;-)

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: String in MemoryStream verwandeln!

Beitrag von _X_ »

Lieber nicht :D

mfg _X_

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: String in MemoryStream verwandeln!

Beitrag von _X_ »

Bei der MemStreamToStr Funktion von theo speichert er nur die ersten 3 Zeilen des Memos. Bei meiner zwar mehr, aber nach ca. 50 Zeilen gibts SIGSEV. Werde mal sehen woran das liegen kann.

mfg _X_

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: String in MemoryStream verwandeln!

Beitrag von _X_ »

Keinen Fehler gefunden. Ich weis nicht woran das liegen könnte.

mfg _X_

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: String in MemoryStream verwandeln!

Beitrag von theo »

Bist du sicher dass du lange Strings / AnsiString {$H+} eingeschaltet hast? Sonst haben deine Strings nur 256 Zeichen.

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: String in MemoryStream verwandeln!

Beitrag von _X_ »

In der Projektdatei ist es da.

Code: Alles auswählen

{$mode objfpc}{$H+}
Muss man doch nicht in jeder unit ,die das braucht einschalten, oder?

mfg _X_

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: String in MemoryStream verwandeln!

Beitrag von theo »

_X_ hat geschrieben:Muss man doch nicht in jeder unit ,die das braucht einschalten, oder?
Eigentlich schon, oder in Projekt -> Compilereinstellungen -> Parse.
Ich würde es aber in jeder Unit machen.

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: String in MemoryStream verwandeln!

Beitrag von _X_ »

Danke werd ich probieren.

mfg _X_

edit:// Gleich wie vorher.
edit2:// Vergessen in meiner XML-Unit {$H+} einzufügen. jetzt geht es. Problem gelöst.

Antworten