对indyTCPClient的简单VCL化,但是总发觉有点不对。求高手的修改。

holyten 2004-07-12 05:58:13
以下是客户端的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分的问题了,但是好像都没什么人回答,所以只有自己琢磨了。
...全文
162 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
befree 2004-07-13
  • 打赏
  • 举报
回复
没人理?haha
holyten 2004-07-13
  • 打赏
  • 举报
回复
up

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧