Einzelnen Beitrag anzeigen

Berni68

Registriert seit: 9. Jan 2006
Ort: Villingen
162 Beiträge
 
Delphi XE5 Professional
 
#3

AW: VST Stream.Write mit Delphi2010

  Alt 30. Sep 2010, 18:59
das mit der Länge war schon mein Problem.
Ich hab dann mal bei Lazarus geschaut und da folgendes gefunden:
stream.WriteAnsiString(s)
Fehlt leider in Delphi!

allerdings konnte ich das Problem folgendermaßen lösen
(Miniprogramm: Formular mit 2 Buttons):
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    ButtonSchreiben: TButton;
    ButtonLesen: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ButtonSchreibenClick(Sender: TObject);
    procedure ButtonLesenClick(Sender: TObject);
  private
    s1,s2: string;
    stream: TMemoryStream;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  stream:= TMemoryStream.Create;
  s1:= '1234567890'+#13+'zeile2 äöü';
  s2:= 'x';
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  stream.Free;
end;

procedure TForm1.ButtonSchreibenClick(Sender: TObject);
var
  L: integer;
begin
  //stream.WriteAnsiString(s1); // gibt es in Lazarus und ist folgendermaßen umgesetzt:
{ L:= Length(s1);
  Stream.Write(L, SizeOf(L));
  Stream.Write(Pointer(s1)^, L);}


  L:= Length(s1);
  Stream.Write(L, SizeOf(L));
  Stream.Write(PChar(s1)^, L*SizeOf(Char));
end;

procedure TForm1.ButtonLesenClick(Sender: TObject);
var
  L: integer;
// P: PByte;
begin
  stream.Position:= 0;
// h:= stream.ReadAnsiString; // gibt es in Lazarus und ist folgendermaßen umgesetzt:
{ Stream.Read(L,SizeOf(L));
  SetLength(s2, L);
  if L>0 then begin
    Stream.Read(Pointer(s2)^, L);
    P:= Pointer(s2) + L;  // <- geht nicht in Delphi (in Lazarus aber schon)
    p^:=0;
  end; }


  Stream.Read(L, SizeOf(L));
  SetLength(s2, L);
  Stream.Read(PChar(s2)^, L*SizeOf(Char));

  showmessage('#' +s2 + '#');
end;

end.
Allerdings verstehe ich nicht, daß sich die FreePascal Lösung nicht in Delphi kompilieren läßt. (PByte + integer) In Lazarus geht das ohne Problem.
Allerdings ist es jetzt auch in Delphi so, daß der String den man reinschreibt auch wieder rauskommt.
Vielleicht kann es ja mal jemand brauchen.
Bernhard
  Mit Zitat antworten Zitat