Einzelnen Beitrag anzeigen

th_bone

Registriert seit: 16. Jun 2004
172 Beiträge
 
Delphi 2005 Professional
 
#1

Records als Stream versenden

  Alt 9. Dez 2005, 20:14
Hi,

heute sehe ich den Wald vor lauter Bäumen nicht... und irgenwie finde ich auch keine
Demo bei den Indy9 und 10 demos..

ich versuche records in einem Rutsch per Stream mit Indy 10 TCPserver an den TCPclient zu senden
...was soweit auch funktioniert

aber wenn ich den stream auslese... komm ich nicht auf das gewünschte ergebnis

richtig wäre

1 1 2 3 4 5
2 1 2 3 4 5
3 1 2 3 4 5

Ergebnis ist aber

5 0 1 2 3 1082130432
5 0 1 2 3 1082130432
5 0 1 2 3 1082130432

Delphi-Quellcode:
// definition des records bei Client und Server
type
  TDataStream = record
   Sdatetime : integer;
   Sopen : single;
   Shigh : single;
   Slow : single;
   Sclose : single;
   Svolume : integer;
   end;
Delphi-Quellcode:
procedure TForm1.tcpServerExecute(AContext: TIdContext);
var
  Msg, MsgStr : String;
  Datastream : TMemoryStream;
  streamdata : Tdatastream;

begin
 
//...

  Msg := AContext.Connection.iohandler.ReadLn;
  MsgCom :=strtoint(Msg[1]);
  MsgStr:=trim(Msg);
  delete(MsgStr,1,1);

// ...

      case MsgCom of

// ...
       stGetData : begin
 
                        datastream:=Tmemorystream.create;
                         for i:=1 to 1000 do begin
                           streamdata.Sdatetime:=i;
                           streamdata.Sopen :=1;
                           streamdata.shigh :=2;
                           streamdata.Slow :=3;
                           streamdata.Sclose :=4;
                           streamdata.Svolume :=5;
                           datastream.Write(streamdata,sizeof(streamdata));
                         end;

                         datastream.Position:=0;

                         IDS := TidStreamVCL.Create(datastream);

                         with AContext.Connection do begin
                           iohandler.writebufferopen;
                             // Stream versenden

                             iohandler.WriteLn(inttostr(stGetData)); // KommandoProtokol
                             Socket.Write(IDS,0,true);

                           iohandler.writebufferclose;
                         end;
                         datastream.Free;
                       end;
Delphi-Quellcode:
// Client Timer GetMessage
var
  IDS: Tidstreamvcl;
  datastream: Tmemorystream;
  streamdata: Tdatastream;
  I, size: integer;

// ....

    case MsgCom of

// ....

     stGetData : begin
                       timergetmessage.Enabled:=false;

                       datastream:=Tmemorystream.Create;
                       IDS:=Tidstreamvcl.create(datastream);
                       size:=24000; // zum testen fest gesetzt
                       tcpclient.socket.ReadStream(IDS,Size,false);

                       datastream.Position:=0;

                       with streamdata do begin
                         while datastream.Position<datastream.Size do begin

                           datastream.Read(streamdata,sizeof(streamdata));
                           MemoAdd(inttostr(Sdatetime)+' '    +
                                   inttostr(trunc(Sopen))+' '  +
                                   inttostr(trunc(Shigh))+' '   +
                                   inttostr(trunc(Slow))+' '     +
                                   inttostr(trunc(Sclose))+' '    +
                                   inttostr(Svolume));
                         end;
                       end;
   end;
Danke für die Hilfe

Ralf
  Mit Zitat antworten Zitat