以下是客户端的vcl组件源代码,我自己写的,不知道对不对,简单的目的就是接受服务器的消息,希望有高手能帮我看看这段代码的情况,我是第一次写VCL组件。 服务器端开发已经通过了,运行的也非常的好,如果有需要的请提出。现在就想写个客户端的ACTIVEX了,但是不知道怎么写,所以先用了VCL了,^_^,高手来帮帮忙吧,如果能告诉我怎么转成ACTIVEX就更好了,因为新建ACTIVEX的时候,在VCL列表中怎么都没有我自己的VCL类呢???
=============================================unit CmdClient;interfaceuses
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;implementationprocedure 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分的问题了,但是好像都没什么人回答,所以只有自己琢磨了。
=============================================unit CmdClient;interfaceuses
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;implementationprocedure 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分的问题了,但是好像都没什么人回答,所以只有自己琢磨了。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货