Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> NetMeeting, Реализация на Delphi 
:(
    Опции темы
Rodman
Дата 11.11.2006, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: нет
Всего: 122



Дароф... 

Вот  на форуме был топик... 

Я решил немного пееделать программу для реализации программы подобной NetMeeting...

Вот есть клиент
Код

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer,
  IdSocketHandle, ExtCtrls;

type
  TForm2 = class(TForm)
    Memo1: TMemo;
    Label1: TLabel;
    IdUDPServer1: TIdUDPServer;
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation
var
  FS: TFileStream;
  FSize: integer;
{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin
IdUDPServer1.Active:=true;
end;

procedure TForm2.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
var
  buffBin, BinBuff: string;
  BuffSize: integer;
  n, m, i: integer;
  SL: TStringList;
begin
  BuffSize:=AData.Size;
  SetLength(buffBin, BuffSize);
  AData.Read(buffBin[1], BuffSize);
  SL:=TStringList.Create;
  if(pos('AAACONNECTION', buffBin)=1)then
  begin
    SL.Delimiter:=':';
    SL.DelimitedText:=buffBin;
    Memo1.Lines.Add('Client connected: '+ SL.Strings[1]);
  end
  else
  begin
    if pos('AAAOPENFILE', buffBin)=1 then
    begin
      SL.Delimiter:=':';
      SL.DelimitedText:=buffBin;
      Memo1.Lines.Add('Recive file: '+ SL.Strings[2]+ ' of size '+SL.Strings[1]);
      FS:=TFileStream.Create('inbox\'+SL.Strings[2], fmCreate);
      FSize:=StrToInt(SL.Strings[1]);
      SL.Free;
    end;
    if pos('AAACLOSEFILE', buffBin)=1 then
    begin
      FS.Size:=FSize;
      FS.Free;
    end;
    if pos('AAADATAFILE', buffBin)=1 then
    begin
      FS.Write(buffBin[12], 1024);
    end;
  end;
end;

end.


и сервер
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer, IdUDPClient,
  StdCtrls, JPEG;

type
  TForm1 = class(TForm)
    Button1: TButton;
    IdUDPClient1: TIdUDPClient;
    OpenDialog1: TOpenDialog;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    Function ReadComputerName:string;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Function TForm1.ReadComputerName:string;
var i:DWORD;
    p:PChar;
begin
  i:=255;
  GetMem(p, i);
  GetComputerName(p, i);
  Result:=String(p);
  FreeMem(p);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  FS: TFileStream;
  FS2:TStream;
  buffBin: string;
  BuffSize: integer;
  n, m, i: integer;
  JpegIm: TJpegImage;
  bm: TBitMap;
begin
//делаем скриншот
bm := TBitMap.Create; 
  bm.Width := Screen.Width; 
  bm.Height := Screen.Height;
  BitBlt(bm.Canvas.Handle, 0, 0,
    bm.Width, bm.Height,
    GetDC(0), 0, 0, SRCCOPY); 
  JpegIm := TJpegImage.Create; 
  JpegIm.Assign(bm);
  JpegIm.CompressionQuality := 75;
  JpegIm.Compress;
//JpegIm.SaveToFile('C:\Screen.jpg'); Лучше чтоб посылалось через СТРИМ без всяких сохранений. НО
//JpegIm.SaveToStream(FS); Это не работает хотя было бы очень просто - скрин в стрим и на клиенты
  bm.Destroy;
  JpegIm.Destroy;
//сделали... Ниже - посылка файла НО ПОСЛАТЬ нужно именно скриншот
    FS:=TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
    buffBin:=Pchar('AAAOPENFILE:'+IntToStr(FS.Size)+':'+ExtractFileName(OpenDialog1.FileName));
    IdUDPClient1.Broadcast(buffBin, IdUDPClient1.Port);
    BuffSize:=1024;
    SetLength(buffBin, BuffSize);
    n:=FS.Size div BuffSize;
    m:=FS.Size mod BuffSize;
    for I := 0 to n-1 do begin
      FS.ReadBuffer(buffBin[1], BuffSize);
      IdUDPClient1.Broadcast('AAADATAFILE'+buffBin, IdUDPClient1.Port);
    end;
    FS.ReadBuffer(buffBin[1], m);
    IdUDPClient1.Broadcast('AAADATAFILE'+buffBin, IdUDPClient1.Port);
    buffBin:=Pchar('AAACLOSEFILE');
    IdUDPClient1.Broadcast(buffBin, IdUDPClient1.Port);
    FS.Free;
  end;

procedure TForm1.Button2Click(Sender: TObject);
var
  FS: TFileStream;
  buffBin: string;
  BuffSize: integer;
  n, m, i: integer;
begin
  //Серверу говорится что клиент приконектился ТОЛЬКО эта процедура должна быть на клиенте :)
  buffBin:=Pchar('AAACONNECTION:'+ReadComputerName);
  IdUDPClient1.Broadcast(buffBin, IdUDPClient1.Port);
  button1.Enabled:=true;
  button2.Visible:=false;
end;

end.


 smile  smile  smile  smile 
в идеале мне необходимо что бы формировался скриншот (он уже формируется), его как нить надо поместить в какую нить стуктуру (я предполгаю что можно с помощью TFileStream, но не получается...).... а клиент должен получать и віводить в Image1.. т.е. без сохранения на жорсткий носитель, пересылка и открытие тоже не используя жорсткий носитель - ЖЕЛАТЕЛЬНО...

Спасибо...
PM MAIL WWW Skype GTalk YIM MSN   Вверх
drkot
Дата 15.11.2006, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 0
Всего: 8



Цитата(Rodman @  11.11.2006,  17:11 Найти цитируемый пост)
TFileStream

Это уже и есть файл на диске. Есть еще TMemoryStream.

Цитата(Rodman @  11.11.2006,  17:11 Найти цитируемый пост)
но не получается...

что конкретно? Пример кода.

Цитата(Rodman @  11.11.2006,  17:11 Найти цитируемый пост)
а клиент должен получать и віводить в Image1..

Низкая скорость прорисовки + мерцание. В инете есть пример называется QDraw (типа быстрая прорисовка).


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Rodman
Дата 15.11.2006, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: нет
Всего: 122



Код

JpegIm.SaveToStream(FS);


вот 66 строка... на этом месте вылетает ошибка... типа не могу сохранить...

PM MAIL WWW Skype GTalk YIM MSN   Вверх
drkot
Дата 15.11.2006, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 0
Всего: 8



А что создавать экземпляр потока уже необязательно?

Добавлено @ 13:59 
Плз. читайте ошибки которые возникают в процессе работу. А то так и получается  smile  smile  smile  smile. Чуть что шишки набивать, а код ошибки посмотреть слабо.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
drkot
Дата 15.11.2006, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 0
Всего: 8



Цитата(Tokagero @  15.11.2006,  14:24 Найти цитируемый пост)
Ааа это что??

примерно вот это:
Код
FS:=TFileStream.Create(OpenDialog1.FileName, fmOpenRead);


Это сообщение отредактировал(а) drkot - 15.11.2006, 14:30


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Tokagero
Дата 15.11.2006, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



Цитата(drkot @  15.11.2006,  14:28 Найти цитируемый пост)
OpenDialog1.FileName

Вот как раз я об этом и говорю, чтоб желательно небыло диалога. Чтоб был автоматом путь прописан сделать можно но мне кажецца что это будет ненадежно
PM MAIL   Вверх
Rodman
Дата 18.11.2006, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: нет
Всего: 122



все самое не понятное записано в коментариях... smile  smile  smile 
Код

unit Unit1;/////////////////попробовать скрин сразу в стрим загонять

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer, IdUDPClient,
  StdCtrls,IdSocketHandle, ExtCtrls, Jpeg;

type
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    IdUDPServer1: TIdUDPServer;
    Memo1: TMemo;
    Timer1: TTimer;
    IdUDPClient1: TIdUDPClient;
    procedure Button1Click(Sender: TObject);
    Function ReadComputerName:string;
    procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
    FS: TFileStream;
  FSize, count: integer;
  num:longint; nm:string;

implementation

{$R *.dfm}

Function TForm1.ReadComputerName:string;
var i:DWORD;
    p:PChar;
begin
  i:=255;
  GetMem(p, i);
  GetComputerName(p, i);
  Result:=String(p);
  FreeMem(p);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
timer1.Enabled:=true;
button1.Visible:=false;
num:=1;
end;



procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
 var
  buffBin, BinBuff: string;
  BuffSize: integer;
  n, m, i: integer;
  SL: TStringList;
begin
  BuffSize:=AData.Size;
  SetLength(buffBin, BuffSize);
  AData.Read(buffBin[1], BuffSize);
  SL:=TStringList.Create;
  if(pos('AAACONNECTION', buffBin)=1)then
  begin
    SL.Delimiter:=':';
    SL.DelimitedText:=buffBin;
    Memo1.Lines.Add('Client connected: '+ SL.Strings[1]);
  end
  else
  begin
    if pos('AAAOPENFILE', buffBin)=1 then
    begin
      SL.Delimiter:=':';
      SL.DelimitedText:=buffBin;
      Memo1.Lines.Add('Recive file: '+ SL.Strings[2]+ ' of size '+SL.Strings[1]);
//      FS:=TFileStream.Create(SL.Strings[2], fmCreate);
      FSize:=StrToInt(SL.Strings[1]);
      SL.Free;
    end;
        if pos('AAACLOSEFILE', buffBin)=1 then
    begin
      FS.Size:=FSize;
      FS.Free;
    end;
    if pos('AAADATAFILE', buffBin)=1 then
    begin
      FS.Write(buffBin[12], 1024);
    end;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  FS: TFileStream;
  buffBin: string;
  BuffSize: integer;
  n, m, i: integer;
  JpegIm: TJpegImage;
  bm: TBitMap;
   CI: TCursorInfo;
  Icon: TIcon;
  II: TIconInfo;
  r: TRect;
begin
//----------------------------------
//Это сделано для того чтоб чередовать названия сохраняемых файлов так как
//При сохранении файла на существовавшее имя вылазит ошибка мол "Файл уже
//занят другим процессом." Если даже предварительно его удалить.
//Но даже это не помогает. Не работает.
  count:=count+1;
  if fileexists('picture1.jpg') then deletefile('picture1.jpg');
  if fileexists('picture2.jpg') then deletefile('picture2.jpg');
  if (count div 2)=0 then nm:='picture1.jpg'
  else nm:=('picture2.jpg');
//----------------------------------
  bm := TBitMap.Create;
  bm.Width := Screen.Width;
  bm.Height := Screen.Height;
  BitBlt(bm.Canvas.Handle, 0, 0,
    bm.Width, bm.Height,
    GetDC(0), 0, 0, SRCCOPY);
    Icon:=TIcon.Create;
r:=Rect(0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));
CI.cbSize:=SizeOf(CI);
if (GetCursorInfo(CI)) and (CI.flags=CURSOR_SHOWING) then
 begin
  Icon.Handle:=CopyIcon(CI.hCursor);
  if GetIconInfo(Icon.Handle,II) then
  bm.Canvas.Draw(ci.ptScreenPos.x - Integer(II.xHotspot) - r.Left, ci.ptScreenPos.y - Integer(II.yHotspot) - r.Top, Icon);
 end;
  JpegIm := TJpegImage.Create;
  JpegIm.Assign(bm);
  JpegIm.CompressionQuality := 80;
  JpegIm.Compress;
  JpegIm.SaveToFile(nm);
  bm.Destroy;
  JpegIm.Destroy;
    FS:=TFileStream.Create(nm, fmOpenRead);
    buffBin:=Pchar('AAAOPENFILE:'+IntToStr(FS.Size)+':'+ExtractFileName(nm));
    IdUDPClient1.Broadcast(buffBin, IdUDPClient1.Port);
    BuffSize:=1024;
    SetLength(buffBin, BuffSize);
    n:=FS.Size div BuffSize;
    m:=FS.Size mod BuffSize;
    Application.ProcessMessages;
    showmessage(inttostr(n)+' '+inttostr(I));
    Application.ProcessMessages;
// Это по идее разрезка файла на кусочки и их посылка. Я так понимаю. Но тут оно частенько зацыкливается.
    {    for I := 0 to n-1 do begin
      FS.ReadBuffer(buffBin[1], BuffSize);
      IdUDPClient1.Broadcast('AAADATAFILE'+buffBin, IdUDPClient1.Port);
    end;                           }
    FS.ReadBuffer(buffBin[1], m);
    IdUDPClient1.Broadcast('AAADATAFILE'+buffBin, IdUDPClient1.Port);
    buffBin:=Pchar('AAACLOSEFILE');
    IdUDPClient1.Broadcast(buffBin, IdUDPClient1.Port);
    FS.Free;
end;

end.

PM MAIL WWW Skype GTalk YIM MSN   Вверх
drkot
Дата 20.11.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 0
Всего: 8



В 143 строке попробуй 
JpegIm.SaveToStream();
насколько я понимаю запись в поток унаследников TGraphic есть.

В своем оригинальном тексте программа глюков не имела. Следовательно глюки были привнесены с новой функциональностью или ввиду изменения структуры программы. smile 


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Tokagero
Дата 25.11.2006, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



drkot, 
Цитата(drkot @  20.11.2006,  13:31 Найти цитируемый пост)
Следовательно глюки были привнесены с новой функциональностью или ввиду изменения структуры программы.
 То есть я повтыкал не туда куда надо?? 

Цитата(drkot @  20.11.2006,  13:31 Найти цитируемый пост)
JpegIm.SaveToStream();

Попробовал. А именно
Код

var
 JpegIm : TJpegImage;
 bm : TBitmap;
 FS : TFileStream;
begin
  bm := TBitmap.Create;

bm.Width := Screen.Width;
  bm.Height := Screen.Height;
  
  BitBlt(bm.Canvas.Handle, 0, 0, bm.Width, bm.Height, GetDC(0), 0, 0, SRCCOPY);

  JpegIm := TJpegImage.Create;
  JpegIm.Assign(bm);
  JpegIm.CompressionQuality := 80;
  JpegIm.Compress;

  FS := TFileStream.Create(ExtractFilePath(application.ExeName)+'1.jpg', fmCreate);
  FS.Position := 0;
  JpegIm.SaveToStream(FS);
...


Потом идет посылка. В ней я до конца не разобрался, знаю что "так надо". Знаю что если файл большой то оно режет его по 1мб и кусками посылает. Но кто разобрался обьясните. Посылка:
Код

... //педидущий код
JpegIm.SaveToStream(FS); //save to stream

//Создание стрима. "application.ExeName+'1.jpg'" скриншот (путь к нему). Можно было просто '1.jpg'
 buffBin:=Pchar('AAAOPENFILE:'+IntToStr(FS.Size)+':'+ExtractFileName((application.ExeName+'1.jpg'));
    
    IdUDPClient1.Broadcast(buffBin, IdUDPClient1.Port);
    BuffSize:=1024;
    SetLength(buffBin, BuffSize);
    n:=FS.Size div BuffSize;
    m:=FS.Size mod BuffSize;

//Это я так понимаю режется на куски по 1мб
   
    for I := 0 to n-1 do begin
      FS.ReadBuffer(buffBin[1], BuffSize);
      IdUDPClient1.Broadcast('AAADATAFILE'+buffBin, IdUDPClient1.Port);
    end;

    FS.ReadBuffer(buffBin[1], m);
    IdUDPClient1.Broadcast('AAADATAFILE'+buffBin, IdUDPClient1.Port);
    buffBin:=Pchar('AAACLOSEFILE');
    IdUDPClient1.Broadcast(buffBin, IdUDPClient1.Port);

    FS.Free;
    JpegIm.Free;
    bm.Free;


Ну короче если тут что-то неправельно то прошу сказать об этом. А вообще оно мне пишет
"Stream read error"
PM MAIL   Вверх
drkot
Дата 27.11.2006, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 0
Всего: 8



попробую по пунктам.
вместо FS : TFileStream; надо FS : TMemoryStream;
(без записи на диск)

после JpegIm.SaveToStream(FS); надо FS.Position:=0;
Установить позицию чтения.

Цитата(Tokagero @  25.11.2006,  14:54 Найти цитируемый пост)
оно режет его по 1мб и кусками посылает

только по 1 килобайту

Цитата(Tokagero @  25.11.2006,  14:54 Найти цитируемый пост)
"Stream read error"

программы две в какой из них?

Цитата

buffBin:=Pchar('AAAOPENFILE:'+IntToStr(FS.Size)+':'+ExtractFileName((application.ExeName+'1.jpg'));

это не входное имя, а выходное (под этим именем файл будет сохранен)


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Rodman
Дата 2.12.2006, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: нет
Всего: 122



Цитата(drkot @  27.11.2006,  19:53 Найти цитируемый пост)
FS : TMemoryStream;

Это обязательно?? Я уже немного приловчился к ФаилСтриму. Могут быть ошибки?? И как с ним работать??

Цитата(drkot @  27.11.2006,  19:53 Найти цитируемый пост)
после JpegIm.SaveToStream(FS); надо FS.Position:=0;
Установить позицию чтения.

Спс! Будет
Цитата(drkot @  27.11.2006,  19:53 Найти цитируемый пост)
только по 1 килобайту

Печально. Это обязательно?? А побольше??
Цитата(drkot @  27.11.2006,  19:53 Найти цитируемый пост)
программы две в какой из них?

Сервер
Цитата(drkot @  27.11.2006,  19:53 Найти цитируемый пост)
это не входное имя, а выходное (под этим именем файл будет сохранен) 

Возможно. В этом не очень разбираюсь. Что там должно быть написано??
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Rodman
Дата 9.12.2006, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: нет
Всего: 122



Вот кое что нарыл, но опять есть вопрос
Сервер
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, ExtCtrls, IdUDPServer, IdBaseComponent,
  IdComponent, IdUDPBase, IdUDPClient, IdSocketHandle;

type
  TForm1 = class(TForm)
    Send: TIdUDPClient;
    Contact: TIdUDPServer;
    Memo1: TMemo;
    procedure ContactUDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Процедура снятия скриншота и копирования его в TBitMap //
procedure GetScreenImage(bmp: TBitmap);
begin
  bmp.Width := Screen.Width;
  bmp.Height := Screen.Height;
  BitBlt(bmp.Canvas.Handle, 0, 0,
    bmp.Width, bmp.Height,
    GetDC(0), 0, 0, SRCCOPY); 

end;

procedure TForm1.ContactUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
  SF: TStringStream;
  T: String;
  W, H, PFor: Integer;
  BM, BMS: TBitMap;
  F: file;
  Buf: Array[1..1600]of Char;
  BufRead: Integer;
begin
  // Получаем команду //
  SF:=TStringStream.Create('');
  SF.CopyFrom(AData, AData.Size);
  T:=SF.DataString;
  Memo1.Lines.Add('Clietn say: '+T);
  // Чистим за собой память //
  SF.Free;
  // Проверяем полученную комманду //
  Caption:=T;
  if(Pos('SNAP=',T)=1)then // Получили комманду копирования рабочего стола //
    begin
      Delete(T,1,Length('SNAP='));
      W:=StrToInt(Copy(T, 1, Pos(',',T)-1));  // Получаем нужную ширину картинки //
      Delete(T, 1, Pos(',', T));
      H:=StrToInt(Copy(T, 1, Pos(',',T)-1));  // Получаем нужную высоту картинки //
      Delete(T, 1, Pos(',', T));
      PFor:=StrToInt(T);  // Получаем нужную гамму картинки //
      // Делаем скриншот и конвертируем для отправки //
      Memo1.Lines.Add('Step 1. Get snap');
      BM:=TBitMap.Create;   BMS:=TBitMap.Create;
      GetScreenImage(BM);
      BMS.Width:=W;
      BMS.Height:=H;
      BMS.PixelFormat:=TPixelFormat(PFor);
      BM.PixelFormat:=TPixelFormat(PFor);
      BMS.Canvas.CopyRect(Rect(0,0,BMS.Width,BMS.Height), BM.Canvas, Rect(0,0,BM.Width,BM.Height));
      // Сохраним файл чтоб читать буффером //
      Memo1.Lines.Add('Step 2. Save snap');
      BMS.SaveToFile('C:\save.bmp');
      BM.Free;
      BMS.Free;
      Memo1.Lines.Add('Step 3. Send snap');
      Send.Host:=ABinding.PeerIP; // Запускаем клиента //
      Send.Active:=True;
      AssignFile(F, 'C:\save.bmp'); // Читаем файл и отсылаем буффером в сеть //
      Reset(F, 1);
      repeat
        BlockRead(F, Buf, SizeOf(Buf), BufRead);  // Читаем буффер //
        Send.SendBuffer(Buf, BufRead);  // Шлем буффер в сеть //
        Sleep(1); // Задержка чтоб не забился поток //
      until(BufRead=0);
      CloseFile(F);
      Send.Send('#FINISH#');  // Оповещаем что закончили //
      Send.Active:=False; // Отрубаемся //
      Memo1.Lines.Add('Step 4. Finish');
    end else
  if(Pos('EXIT',T)=1)then // Получили комманды что надо смысться //
    Close;
end;

end.


Клиент
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdUDPClient, IdBaseComponent, IdComponent, IdUDPBase,
  IdUDPServer, StdCtrls, IdSocketHandle, ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Panel1: TPanel;
    Send: TIdUDPServer;
    Contact: TIdUDPClient;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    ComboBox1: TComboBox;
    procedure Button1Click(Sender: TObject);
    procedure SendUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Contact.Host:='192.168.1.2';  // Коннектимся к компьютеру //
  Send.Active:=True;  // Включим сервер //      
  Contact.Active:=True; // Коннектимся //
  Contact.Send('SNAP='+IntToStr(StrToInt(Edit1.Text))+','+IntToStr(StrToInt(Edit2.Text))+','+IntToStr(ComboBox1.ItemIndex)); // Посылаем команду //
  Contact.Active:=False; // Отрубаемся //
end;

procedure TForm1.SendUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
  SF: TStringStream;
  Buf: Array[1..99999]of Char;
  T: String;
  Count, I: Integer;
  F: File;
  Ended: Boolean;
begin
  // Получаем команду //
  SF:=TStringStream.Create('');
  SF.CopyFrom(AData, AData.Size);
  //SF.ReadBuffer(Buf, );
  T:=SF.DataString;
  if(Pos('#FINISH#', T)=Length(T)-7)then
    begin
      Ended:=True;
      Delete(T, Length(T)-5, 6);
    end else Ended:=False;
  AssignFile(F, 'C:\load.bmp'); // Записываем полученный буффер в файл //
  {$I-}Reset(F, 1);if IoResult<>0 then Rewrite(F, 1);{$I+}
  Seek(F, FileSize(F)); // Переход в конец файла //
  // Пока есть что записывать, обрабатываем и записываем буффер в файл //
  while(Length(T)>0)do
    begin
      Count:=Length(T);
      if(Count>SizeOf(Buf))then Count:=SizeOf(Buf);
      For I:=1 to Count do Buf[I]:=T[I];
      BlockWrite(F, Buf, Count);
      Delete(T, 1, Count);
    end;
  CloseFile(F); // Закроем файл //
  if(Ended)then
    begin
      Image1.Picture.LoadFromFile('C:\load.bmp'); // Загрузим полученный рисунок //
      DeleteFile('C:\load.bmp');
    end;
  // Очистим за собой память //
  SF.Free;
end;
end.


когда создается изображение, получается половина экрана темная, а другая это то что нужно но в битом виде...

Можно ли это исправить????

Но если мжно сделать при помощи *.jpg былоб еще лучше...

Спасибо...
PM MAIL WWW Skype GTalk YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0737 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.