以下是客户端的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分的问题了,但是好像都没什么人回答,所以只有自己琢磨了。