我自己开发了一个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.
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.
第一篇 COM部分1.1 ActiveX部分1.1.1 ActiveX控件之消失的事件
http://www.clevercomponents.com/articles/article019/DelphiSync.zip你的线程从它给的线程类继承就 OK 啦,我一直这样用,没有问题。