我自己开发了一个VCL组件,在Delphi内运行正常也能抛出事件,于是我建立了ActiveX组件,事件就不抛出了。通过分析,估计应该是线程引起的,但是不知道问题在哪里,为什么,以及怎么解决。希望高手能帮个忙看看。==================================
unit CmdMessageClient;interfaceuses
  SysUtils, Classes, Controls, Messages, IdTCPClient;const
  CM_MESSAGE=WM_USER+101;type
{========Block of Data========}
  TCommand=record
            CommandID: smallint;
            Msg: string[255];
  end;{===========Thread===========}
  TClientHandleThread=class(TThread)
  private
    FClient: TIdTCPClient;
    FControl:Pointer;
    FCB:TCommand;
    procedure HandleInput;
  protected
    procedure Execute; override;
  end;{=========VCL Compnent========}
  TCmdMessageClient = class(TWinControl)
  private
    FClient:TIdTCPClient;
    FClientHandleThread:TClientHandleThread;
    FOnMessage:TNotifyEvent;
    procedure CMMessage(var Msg: TMessage);message CM_MESSAGE;
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
    function Connect:boolean;
    property OnMessage: TNotifyEvent read FOnMessage write FOnMessage;
  end;
procedure Register;implementationprocedure Register;
begin
  RegisterComponents('MessageClient', [TCmdMessageClient]);
end;{ TCmdMessageClient }procedure TCmdMessageClient.CMMessage(var Msg: TMessage);
begin
  inherited;
  if Assigned(FOnMessage) then FOnMessage(self);
end;function TCmdMessageClient.Connect: boolean;
begin
  if (FClient=nil) then FClient:=TIdTCPClient.Create(self);
  if (FClient.Connected) then
  begin
    Result:=false;
  end
  else
    begin
    FClient.Host:='192.168.60.216';
    FClient.Port:=5772;
    FClient.Connect(5000);
    FClientHandleThread:=TClientHandleThread.Create(true);
    FClientHandleThread.FClient:=FClient;
    FClientHandleThread.FControl:=self;
    FClientHandleThread.FreeOnTerminate:=true;
    FClientHandleThread.Resume;
    Result:=true;    
  end;
end;{ TClientHandleThread }procedure TClientHandleThread.Execute;
begin
  while not Terminated do
  begin    
    if not FClient.Connected then
      begin
      Freeandnil(FClient);
      Terminate;
      end
    else
    try
      FClient.ReadBuffer(FCB, SizeOf (FCB));
      Synchronize(HandleInput);
    except
    end;
  end;
end;procedure TClientHandleThread.HandleInput;
begin
  TCmdMessageClient(FControl).FOnMessage(self);
end;end.

解决方案 »

  1.   

    參考<<Delphi深度探索>>看有沒有用
    第一篇     COM部分1.1  ActiveX部分1.1.1  ActiveX控件之消失的事件
      

  2.   

    http://hubdog.csdn.net/Hubdog/Catelog.htm
      

  3.   

    请看看这篇文章:http://www.clevercomponents.com/articles/article019/delphi6sync.asp
      

  4.   

    看了书了,不是aiirii(ari-爱的眼睛)所描述的问题,应该是ActiveX内线程的问题。myy给的帮助不错,但是是ActiveXForm的事例,与我的ActiveX不一样,所以希望有高手能改一下我的程序就好了
      

  5.   

    对于 delphi6 的线程问题,ActiveXForm,ActiveX,dll 都一样,因为他们本质上都是dll.你应该仔细看看那篇文章,下面还有解决方案下载,就是
    http://www.clevercomponents.com/articles/article019/DelphiSync.zip你的线程从它给的线程类继承就 OK 啦,我一直这样用,没有问题。