⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clientfrmmainunit.pas

📁 wince下实现远程视频监控
💻 PAS
字号:

unit ClientFrmMainUnit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, StdCtrls, ExtCtrls,jpeg;

type
  TClientFrmMain = class(TForm)
    CBClientActive: TCheckBox;
    IncomingMessages: TMemo;
    Label1: TLabel;
    Client: TIdTCPClient;
    Label3: TLabel;
    EditMessage: TEdit;
    ButtonSend: TButton;
    Image: TImage;
    procedure CBClientActiveClick(Sender: TObject);
    procedure ButtonSendClick(Sender: TObject);
    procedure FormShow(Sender: TObject);

    private

    public
      tcp_package_size:integer;//保存服务器所能接受的包大小
    end;

  TClientHandleThread = class(TThread)
    private
    protected
    procedure Execute; override;

end;

var
  ClientFrmMain: TClientFrmMain;
  ClientHandleThread: TClientHandleThread;
  Mem:TmemoryStream;
  JPEGSize:Integer;
implementation


{$R *.DFM}
Function GetJPEGSize(message:string):integer;
var
  substr_begin:integer;
  substr_end:integer;
  size:string;
begin
  substr_begin:=pos('[',message);
  substr_end:=pos(']',message);
  size:=copy(message,substr_begin+1,substr_end-substr_begin-1);
  result:=StrToInt(size);
end;

procedure TClientHandleThread.Execute;
var
  InputBufferSize:Integer;
  str:string;
  Jpg:TJpegImage;
begin
  Mem:=TmemoryStream.Create;
  Mem.Position:=0;

  while not Terminated do
  begin
    if not ClientFrmMain.Client.Connected then
      Terminate
    else
    try
      ClientFrmMain.Client.readfromstack(false,1,false);
      InputBufferSize:= ClientFrmMain.Client.InputBuffer.Size;
      //-----------------------首先定义TCP数据包的大小------------------------//
      if (ClientFrmMain.tcp_package_size=0) and (InputBufferSize >0 ) then begin
         str:=ClientFrmMain.Client.ReadString(InputBufferSize);
         ClientFrmMain.tcp_package_size:=GetJPEGSize(str);
      end
      //------------------------接收过程中------------------------------------//
      else if (InputBufferSize=ClientFrmMain.tcp_package_size) and (InputBufferSize>0) then begin
         ClientFrmMain.Client.ReadStream(mem,ClientFrmMain.tcp_package_size);
      end
      //------------------------接收到最后一个数据,并且画出来-----------------//
      else if (InputBufferSize>0) and (InputBufferSize<ClientFrmMain.tcp_package_size) then begin
         ClientFrmMain.Client.ReadStream(mem,InputBufferSize);
         MEM.Position:=0;
         jpg:=TJpegImage.Create;
         try
           JPG.LoadFromStream(mem);
           MEM.Clear;
           ClientFrmMain.Image.Picture.Assign(JPG);
         except
         end;
         jpg.Free;
         MEM.Clear;
      end;
      ClientFrmMain.Client.InputBuffer.Clear;
    except
    end;
  end;
end;

procedure TClientFrmMain.CBClientActiveClick(Sender: TObject);
begin
  if CBClientActive.Checked then
  begin
    try
      Client.Connect(10000);
      ClientHandleThread := TClientHandleThread.Create(True);
      ClientHandleThread.FreeOnTerminate:=True;
      ClientHandleThread.Resume;
    except
      on E: Exception do MessageDlg ('Error while connecting:'+#13+E.Message, mtError, [mbOk], 0);
    end;
  end
  else
  begin
    ClientHandleThread.Terminate;
    Client.Disconnect;
  end;

  ButtonSend.Enabled := Client.Connected;
  CBClientActive.Checked := Client.Connected;
end;

procedure TClientFrmMain.ButtonSendClick(Sender: TObject);
begin
  // Client.Write(EditMessage.Text);
end;

procedure TClientFrmMain.FormShow(Sender: TObject);
begin
  tcp_package_size:=0;//初始化包的大小为0;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -