unit ClientFrmMainUnit;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, StdCtrls,
GlobalUnit;const
WM_CLSYNCHRONIZE = WM_USER + 1;type
TClientFrmMain = class(TForm)
CBClientActive: TCheckBox;
IncomingMessages: TMemo;
Label1: TLabel;
Client: TIdTCPClient;
Label2: TLabel;
EditCommand: TComboBox;
Label3: TLabel;
EditMessage: TEdit;
Label4: TLabel;
EditRecipient: TEdit;
ButtonSend: TButton;
procedure CBClientActiveClick(Sender: TObject);
procedure ButtonSendClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FormHandle: THandle;
procedure DoOnWakeMainThread(Sender: TObject);
procedure WMCLSynchronize(var Message: TMessage); message WM_CLSYNCHRONIZE;
public
end;
TClientHandleThread = class(TThread)
private
CB: TCommBlock;
FrmHandle: THandle;
procedure HandleInput;
protected
procedure Execute; override;
end;var
ClientFrmMain: TClientFrmMain;
ClientHandleThread: TClientHandleThread; // variable (type see above)Function ShowForm(FormHandle: THandle):integer; stdcall;
implementation{$R *.DFM}
{Thread}
procedure TClientHandleThread.Execute;
begin
while not Terminated do
begin
if not ClientFrmMain.Client.Connected then
begin
Terminate;
end
else
try
ClientFrmMain.Client.ReadBuffer(CB, SizeOf (CB));
Synchronize(HandleInput);
except
end;
end;
end;procedure TClientHandleThread.HandleInput;
begin
if CB.Command = 'MESSAGE' then
ClientFrmMain.IncomingMessages.Lines.Add (CB.MyUserName + ': ' + CB.Msg)
else
if CB.Command = 'DIALOG' then
MessageDlg ('"'+CB.MyUserName+'" sends you this message:'+#13+CB.Msg, mtInformation, [mbOk], 0)
else // unknown command
MessageDlg('Unknown command "'+CB.Command+'" containing this message:'+#13+CB.Msg, mtError, [mbOk], 0);
end;//---连接服务端
procedure TClientFrmMain.CBClientActiveClick(Sender: TObject);
var
thread: TClientHandleThread;
begin
if CBClientActive.Checked then
begin
try
Client.Connect(10000); // in Indy < 8.1 leave the parameter away
thread := TClientHandleThread.Create(True); thread.FreeOnTerminate := True;
//thread.OnTerminate :=HandleTerminate;
thread.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);
var
CommBlock : TCommBlock;
begin
CommBlock.Command := EditCommand.Text; // assign the data
CommBlock.MyUserName := Client.LocalName;
CommBlock.Msg := EditMessage.Text;
CommBlock.ReceiverName := EditRecipient.Text;
Client.WriteBuffer (CommBlock, SizeOf (CommBlock), true);
end;procedure TClientFrmMain.FormCreate(Sender: TObject);
begin
Classes.WakeMainThread := DoOnWakeMainThread;
end;procedure TClientFrmMain.DoOnWakeMainThread(Sender: TObject);
begin
PostMessage(Self.Handle, WM_CLSYNCHRONIZE, 0, 0);
end;procedure TClientFrmMain.WMCLSynchronize(var Message: TMessage);
begin
Classes.CheckSynchronize();
end;//---显示窗体
Function ShowForm(FormHandle: THandle):integer; stdcall;
var
ClientFrmMain:tClientFrmMain;
begin
ClientFrmMain:=TClientFrmMain.create(application);
try
ClientFrmMain.FormHandle :=FormHandle;
ClientFrmMain.ShowModal;
result:= 1;
except
ClientFrmMain.free;
result:= -1;
end;
end;end.
在form中可以的
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, StdCtrls,
GlobalUnit;const
WM_CLSYNCHRONIZE = WM_USER + 1;type
TClientFrmMain = class(TForm)
CBClientActive: TCheckBox;
IncomingMessages: TMemo;
Label1: TLabel;
Client: TIdTCPClient;
Label2: TLabel;
EditCommand: TComboBox;
Label3: TLabel;
EditMessage: TEdit;
Label4: TLabel;
EditRecipient: TEdit;
ButtonSend: TButton;
procedure CBClientActiveClick(Sender: TObject);
procedure ButtonSendClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FormHandle: THandle;
procedure DoOnWakeMainThread(Sender: TObject);
procedure WMCLSynchronize(var Message: TMessage); message WM_CLSYNCHRONIZE;
public
end;
TClientHandleThread = class(TThread)
private
CB: TCommBlock;
FrmHandle: THandle;
procedure HandleInput;
protected
procedure Execute; override;
end;var
ClientFrmMain: TClientFrmMain;
ClientHandleThread: TClientHandleThread; // variable (type see above)Function ShowForm(FormHandle: THandle):integer; stdcall;
implementation{$R *.DFM}
{Thread}
procedure TClientHandleThread.Execute;
begin
while not Terminated do
begin
if not ClientFrmMain.Client.Connected then
begin
Terminate;
end
else
try
ClientFrmMain.Client.ReadBuffer(CB, SizeOf (CB));
Synchronize(HandleInput);
except
end;
end;
end;procedure TClientHandleThread.HandleInput;
begin
if CB.Command = 'MESSAGE' then
ClientFrmMain.IncomingMessages.Lines.Add (CB.MyUserName + ': ' + CB.Msg)
else
if CB.Command = 'DIALOG' then
MessageDlg ('"'+CB.MyUserName+'" sends you this message:'+#13+CB.Msg, mtInformation, [mbOk], 0)
else // unknown command
MessageDlg('Unknown command "'+CB.Command+'" containing this message:'+#13+CB.Msg, mtError, [mbOk], 0);
end;//---连接服务端
procedure TClientFrmMain.CBClientActiveClick(Sender: TObject);
var
thread: TClientHandleThread;
begin
if CBClientActive.Checked then
begin
try
Client.Connect(10000); // in Indy < 8.1 leave the parameter away
thread := TClientHandleThread.Create(True); thread.FreeOnTerminate := True;
//thread.OnTerminate :=HandleTerminate;
thread.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);
var
CommBlock : TCommBlock;
begin
CommBlock.Command := EditCommand.Text; // assign the data
CommBlock.MyUserName := Client.LocalName;
CommBlock.Msg := EditMessage.Text;
CommBlock.ReceiverName := EditRecipient.Text;
Client.WriteBuffer (CommBlock, SizeOf (CommBlock), true);
end;procedure TClientFrmMain.FormCreate(Sender: TObject);
begin
Classes.WakeMainThread := DoOnWakeMainThread;
end;procedure TClientFrmMain.DoOnWakeMainThread(Sender: TObject);
begin
PostMessage(Self.Handle, WM_CLSYNCHRONIZE, 0, 0);
end;procedure TClientFrmMain.WMCLSynchronize(var Message: TMessage);
begin
Classes.CheckSynchronize();
end;//---显示窗体
Function ShowForm(FormHandle: THandle):integer; stdcall;
var
ClientFrmMain:tClientFrmMain;
begin
ClientFrmMain:=TClientFrmMain.create(application);
try
ClientFrmMain.FormHandle :=FormHandle;
ClientFrmMain.ShowModal;
result:= 1;
except
ClientFrmMain.free;
result:= -1;
end;
end;end.
在form中可以的
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货