Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2007, 13:54   #1
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
Печаль Приём изображений

Помогите пожалуста решить проблему. Как написать код, что бы через ClientSocket он принимал полученный скриншот и выводил его в Image?

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Active:=true;
ClientSocket1.Socket.SendText('R');
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
....
begin
....
end;
------------------------------------------------------------------

Вот код получения скриншота и отправки его на ClientSocket:

procedure TForm1.ServerSocket1ClientRead(Send er: TObject;
Socket: TCustomWinSocket);
var
s: string;
ms: TMemoryStream;
bmp: Graphics.TBitmap;
DC: HDC;
begin
if Socket.ReceiveText = 'R' then
begin
ms := TMemoryStream.Create;
bmp := TBitmap.Create;
bmp.Height := Screen.Height;
bmp.Width := Screen.Width;
DC := GetDC(0);
BitBlt(bmp.Canvas.Handle, 0, 0, bmp.Width,
bmp.Height, DC, 0, 0, SRCCopy);
try
bmp.SaveToStream(ms);
ms.Position := 0;
Socket.SendText(IntToStr(ms.Size) + #0);
Socket.SendStream(ms);
except
ms.Free;
end;
bmp.Destroy;
ReleaseDC(0, DC);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Active:=true;
end;

Заранее благодарен!
Всегда рад помочь!

Последний раз редактировалось Terran; 15.12.2007 в 13:56.
Terran вне форума Ответить с цитированием
Старый 15.12.2007, 13:59   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

У меня сколько не пробывал не получилось отправлять потоки SendStream. Потом были мелкие проблемы с использованием данных компонентов. А на самом деле все делается так

Код:
uses
  WinSock;

...

function SendBuffer(Socket: TSocket; Buffer: Pointer; Len: Integer): Integer;
var
  i: Integer;
  n: Integer;
begin
  i := 0;
  if Socket <> INVALID_SOCKET then
  repeat
    n := send(Socket, Pointer(Integer(Buffer) + i)^, (Len - i), 0);
    if (n = SOCKET_ERROR) or (n = 0) then
      Break;
    i := i + n;   
  until
    (i = Len);
  Result := i;
end;

...

Bmp: TBitmap;
{
Я не помню точно но вроде в TMemoryStream есть параметр Data - указывает на область в памяти, 
ну вот и пишим битмап в него, а потом
}
Str: TMemoryStream;

...

Len: Integer;

Len := Str.Size;
Send(Socket.Handle, Len, SizeOf(Len), 0); // посылаем размер
SendBuffer(Socket.Handle{вроде хендл}, Str.Data, Str.Size); // отправка

// на счет получения

{
есть очень интересные вещи в винсок, и честно говоря для меня легче
на апи писать чем отходить и думать с компонентами ( сокетами ).
Реализовал на апи в потоке может и подойдет к Вам
}

var
  FDSet: TFDSet;
  TimeVal: TTimeVal;
  Len: Integer;
  LenBmp: Integer; // Размер нашего битмапа
  Str: TMemoryStream; // Ваш поток потом из него в битмап.
  Buf: Pointer;
begin
  while true{Ваше условие, для потока вне вашего приложения 
это нормально} do 
  begin
    FD_ZERO(FDSet);
    FD_SET(Socket.Handle, FDSet);
    TimeVal.tv_sec := 0;
    TimeVal.tv_usec := 500;
    if (select(0, @FDSet, NIL, NIL, @TimeVal) > 0) and true{Ваше условие 
как и вверху} then
    begin
      ioctlsocket(Socket.Handle, FIONREAD, Len);
      if Len = 0 then Break else
      begin
        if (Str = NIL) and (LenBmp = 0) then // значит еше битмап не грузится
        begin
          // можете проверить даже, т.е. SizeOf(LenBmp) = Len ?
          Str := TMemoryStream.Create;
          recv(Socket.Handle, LenBmp, SizeOf(LenBmp), 0);
        end else // иначе дописуем поток
        begin
          GetMem(Buf, Len);
        
          // а тут Вы получаете буфер - пакет, размер его = Len
          recv(Socket.Handle, Buf^, Len, 0);
         
          Str.Write(Buf^, Len);

          FreeMem(Buf);

           if Str.Size = LenBmp then // все докачали
           begin
             Bmp.LoadFromStream(Str);
             Str.Free;
             LenBmp := 0;
           end;
         end;
      end;
    end;
  end;
Я извиняюсь если где ошибся в синтаксисе, пишу в броузере сразу .
Честно говоря в раздел сети надо данную тему, а на счет функции отправки я долго с ней возился... исходя из результатов своих проектов подобрал самую, для меня, подходящую.

Последний раз редактировалось BOBAH13; 15.12.2007 в 14:17.
BOBAH13 вне форума Ответить с цитированием
Старый 15.12.2007, 15:03   #3
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Огромное спасибо за помощь!!!
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Приём данных с com порта kyc0k Помощь студентам 3 28.03.2008 15:04
карты изображений )Игнат( HTML и CSS 1 07.02.2008 19:17
Как разрешить Форме1 приём данных? Rahim1993 Общие вопросы Delphi 12 19.01.2008 09:57
Фильтрация изображений varvara16 Мультимедиа в Delphi 2 16.12.2007 10:20
просмотр изображений gulfiyush Общие вопросы Delphi 9 10.12.2007 04:47