对indyTCPClient的简单VCL化,但是总发觉有点不对。求高手的修改。
以下是客户端的vcl组件源代码,我自己写的,不知道对不对,简单的目的就是接受服务器的消息,希望有高手能帮我看看这段代码的情况,我是第一次写VCL组件。
服务器端开发已经通过了,运行的也非常的好,如果有需要的请提出。
现在就想写个客户端的ACTIVEX了,但是不知道怎么写,所以先用了VCL了,^_^,高手来帮帮忙吧,如果能告诉我怎么转成ACTIVEX就更好了,因为新建ACTIVEX的时候,在VCL列表中怎么都没有我自己的VCL类呢???
=============================================
unit CmdClient;
interface
uses
SysUtils, Classes, Controls, IdTCPClient,Messages;
const CM_HAVEMESSAGE=WM_USER+1;
type
TCommand = record
CommandID : smallint;
Msg: string[255];
end;
THaveMessageEvent=procedure (Sender: TObject; CommandID: smallint; Msg: string) of object;
TClientHandleThread = class(TThread)
private
Client:TIdTCPClient;
CB: TCommand;
CControl: pointer;
procedure HandleInput;
protected
procedure Execute; override;
public
end;
TCmdClient = class(TWinControl)
private
{ Private declarations }
FHost:string;
FPort:integer;
FClient:TIdTCPClient;
FClientHandleThread: TClientHandleThread;
FOnMessage:THaveMessageEvent;
procedure CMMessage(Var Msg:TMessage);message CM_HAVEMESSAGE;
procedure setFHost(const Value: string);
procedure setFPort(const Value: integer);
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(Owner: TComponent);override;
destructor Destroy;override;
procedure Connect();
procedure Disconnect;
published
{ Published declarations }
property OnMessage: THaveMessageEvent read FOnMessage write FOnMessage;
property Host: string read FHost write setFHost;
property Port: integer read FPort write setFPort default 0;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('CmdMessage', [TCmdClient]);
end;
{ TClientHandleThread }
procedure TClientHandleThread.Execute;
begin
while not Terminated do
begin
if not Client.Connected then
Terminate
else
try
Client.ReadBuffer(CB, SizeOf (CB));
Synchronize(HandleInput);
except
end;
end;
end;
procedure TClientHandleThread.HandleInput;
begin
TCmdClient(CControl).Perform(CM_HAVEMESSAGE,0,0);
end;
{ TCmdClient }
procedure TCmdClient.CMMessage(var Msg: TMessage);
begin
inherited;
if Assigned(FOnMessage) then FOnMessage(self,FClientHandleThread.CB.CommandID,FClientHandleThread.CB.Msg);
end;
procedure TCmdClient.Connect;
begin
FClient.Host:=FHost;
FClient.Port:=FPort;
try
FClient.Connect(10000); // in Indy < 8.1 leave the parameter away
FClientHandleThread.Resume;
except
on E: Exception do ;
end;
end;
constructor TCmdClient.Create(Owner: TComponent);
begin
inherited;
FClient:=TIdTCPClient.Create(self);
FClientHandleThread.Create(true);
FClientHandleThread.Client:=FClient;
FClientHandleThread.CControl:=self;
FClientHandleThread.FreeOnTerminate:=false;
end;
destructor TCmdClient.Destroy;
begin
FClientHandleThread.Free;
FClient.Free;
inherited;
end;
procedure TCmdClient.Disconnect;
begin
FClientHandleThread.Terminate;
FClient.Disconnect;
end;
procedure TCmdClient.setFHost(const Value: string);
begin
FHost := Value;
end;
procedure TCmdClient.setFPort(const Value: integer);
begin
FPort := Value;
end;
end.
=================
最近为了这个东西提了300分的问题了,但是好像都没什么人回答,所以只有自己琢磨了。