ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Delphi [TStream]
  #1  
Старый 15.03.2009, 15:47
Flame of Soul
Участник форума
Регистрация: 25.05.2007
Сообщений: 290
Провел на форуме:
1740746

Репутация: 435
Отправить сообщение для Flame of Soul с помощью MSN
По умолчанию Delphi [TStream]

...# Delphi [TStream] #...

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

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

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


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


(PS: просьба без лишних фраз, ответы писать по теме, пожалуйста)
 
Ответить с цитированием

  #2  
Старый 15.03.2009, 21:42
Algol
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме:
2050916

Репутация: 0


По умолчанию

Приведи пример кода.
 
Ответить с цитированием

  #3  
Старый 15.03.2009, 23:46
Flame of Soul
Участник форума
Регистрация: 25.05.2007
Сообщений: 290
Провел на форуме:
1740746

Репутация: 435
Отправить сообщение для Flame of Soul с помощью MSN
По умолчанию

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

Код для сервера:
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

Последний раз редактировалось Flame of Soul; 15.03.2009 в 23:48..
 
Ответить с цитированием

  #4  
Старый 16.03.2009, 01:50
Algol
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме:
2050916

Репутация: 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);

Последний раз редактировалось Algol; 16.03.2009 в 02:16..
 
Ответить с цитированием

  #5  
Старый 16.03.2009, 09:48
Flame of Soul
Участник форума
Регистрация: 25.05.2007
Сообщений: 290
Провел на форуме:
1740746

Репутация: 435
Отправить сообщение для Flame of Soul с помощью MSN
По умолчанию

Цитата:
нужно
RuSrm := TMemoryStream.Create;
Это не так собственно важно, потому что я именно с ним и работала изначально, но все равно спасибо, теперь буду знать, что надо только с ним.
Цитата:
RuSrm.Seek(0, soFromBeginning);
а про установку в ноль , Вы правы она необходима. Что же, приду домой попробую откомпилировать. Спасибо большое, тему пока не закрывайте пожалуйста, на всякий случай.
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Стоит ли писать это в Delphi? Ch@RM0nt Болталка 20 01.12.2008 20:43
Простая антиотладка на Delphi TaNkist Авторские статьи 13 03.11.2006 17:00
Delphi 2006 SNK Soft - Windows 5 15.09.2006 22:53
.:Join-им 2 exe-шника ручками (using Delphi):. xShreKx Авторские статьи 6 12.06.2006 16:22
Азы Delphi Morph Авторские статьи 1 13.03.2005 01:22



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ