Delphi [TStream]

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Flame of Soul, 15 Mar 2009.

  1. Flame of Soul

    Flame of Soul Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    185
    Likes Received:
    146
    Reputations:
    45
    ...# Delphi [TStream] #...

    Требуется:
    Простите за столь глупую просьбу, но приведите пожалуйста пример передачи содержимого компонента через TStream или TMemoryStream, связка клиент - сервер, Winsock, Socket, IdUdp неважно, и вывод его сразу на аналогичный компонент без сохранения на жестком диске даже в виде временных файлов.

    Пояснение:
    Просто, какая-то странность, сохраняю содержимое компонента в поток, проверяю размер потока, все нормально, отправляю поток по запросу клиента на сервер, на сервер ничего не приходит. Если сохранять через TFileStream и отправлять через него то все работает, но только это дополнительная нагрузка на систему: записывать на винт --> отсылать --> удалять с винта.

    Уточнение:
    Пожалуйста приведите пример, компонент может быть любой, но для примера допустим пусть будет содержимое Image.Picture


    За ранее большое спасибо.


    (PS: просьба без лишних фраз, ответы писать по теме, пожалуйста)
     
    1 person likes this.
  2. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Приведи пример кода.
     
  3. Flame of Soul

    Flame of Soul Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    185
    Likes Received:
    146
    Reputations:
    45
    Простите, ночую у родителей, но вот код для примера, который должен на мой взгляд работать.

    Код для сервера:
    PHP:
    ...
        
    RuSrmTStream
    ...

    procedure TForm1.FormCreate(...); 
    begin 
      RuSrm
    := nil
    end

    procedure TForm1.FormDestroy(...); 
    begin 
      
    if Assigned(ComSrmthen 
      begin 
        RuSrm
    .Free
        
    RuSrm:= nil
      
    end
    end

    procedure TForm1.ServerSocket1ClientConnect(...); 
    begin
      RuSrm 
    := TStream.Create;
      
    Image1.Picture.Bitmap.SaveToStream(RuSrm); 
      
    Socket.SendStream(RuSrm); 
    end

    procedure TForm1.btnTestSocketsClick(...); 
    begin 
      ServerSocket1
    .Active := True
    end

    end.
    Код для клиента:
    PHP:
    ...
      private 
        
    ComSrmTStream
    ...

    procedure TForm1.ClientSocket1Read(SenderTObject
      
    SocketTCustomWinSocket); 
    var 
      
    iLenInteger
      
    BfrPointer
    begin 
      iLen 
    := Socket.ReceiveLength
      
    GetMem(BfriLen); 
      try 
        
    Socket.ReceiveBuf(Bfr^, iLen); 
        
    ComSrm.Write(Bfr^, iLen); 
      finally 
        
    FreeMem(Bfr); 
      
    end
    end

    procedure TForm1.FormCreate(...); 
    begin 
      ComSrm 
    := nil
    end

    procedure TForm1.FormDestroy(...); 
    begin 
      
    if Assigned(ComSrmthen 
      begin 
        ComSrm
    .Free
        
    ComSrm := nil
      
    end
    end

    procedure TForm1.ClientSocket1Disconnect(...); 
    begin 
      
    if Assigned(ComSrmthen 
      begin
        Image1
    .Picture.Bitmap.LoadFromStream(ComSrm); 
        
    ComSrm.Free
        
    ComSrm := nil
      
    end
    end

    procedure TForm1.ClientSocket1Connect(...); 
    begin 
      FStream 
    := TStream.Create(ComSrm); 
    end

    procedure TForm1.btn1SocketsClick(...); 
    begin 
      ClientSocket1
    .Active := True
    end;

    end.
     
    #3 Flame of Soul, 15 Mar 2009
    Last edited: 15 Mar 2009
  4. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Вместо
    RuSrm := TStream.Create;
    нужно
    RuSrm := TMemoryStream.Create;

    из хелпа:
    TStream is an abstract or, in C++ terminology, pure virtual class. It should not be instantiated; it relies on abstract or pure virtual methods that must be overridden in descendant classes.

    Да, и еще, перед вызовом SendStream
    нужно поставить текущую позицию потока в ноль:

    RuSrm.Seek(0, soFromBeginning);
    Socket.SendStream(RuSrm);
     
    #4 Algol, 16 Mar 2009
    Last edited: 16 Mar 2009
  5. Flame of Soul

    Flame of Soul Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    185
    Likes Received:
    146
    Reputations:
    45
    Это не так собственно важно, потому что я именно с ним и работала изначально, но все равно спасибо, теперь буду знать, что надо только с ним.
    а про установку в ноль , Вы правы она необходима. Что же, приду домой попробую откомпилировать. Спасибо большое, тему пока не закрывайте пожалуйста, на всякий случай.