to bloodthirst: 你的代码我没看出有什么大的不同,只是在定义OnTrigger时比我多加了一个dynamic: procedure OnTrigger( Sender: TObject); dynamic; 这有何关系?另说明一下,我把一个与OnTrigger调用几乎没有任何关系的过程改为了函数,现在这个事件竟然可以用了??!! 为什么??我的其它几个事件依然不能正常使用啊!!我干脆把代码贴出来吧: function TTimePulser.Trigge(...):boolean; begin if assigned(TimeV) then begin if TimeV.CallNote(...) then // CallNote原来是过程,改成函数后FOnTimer就能正常使用了? TimeV.Free; result:=true; end else result:=false; end;procedure TTimePulser.OnTrigge(Sender:TObject); var ... begin ... Trigge(...); // 调用前面的函数(放弃返回值),这与FOnTimer没有任何关系吗! if assigned(FOnTimer) then FOnTimer(...); TimeValue.Free; end;
写个测试程序 动态创建TTIMERPULSER 再将某个方法指针设置给对象方法ONTIMER 设个断点看看有没有执行到这一步 if assigned(FOnTimer) then FOnTimer(...); 我估计在上面的语句之前别的代码已经将FOnTimer又变成了nil dynamic跟VIRTUAL差不多是重载用的
1、绝对不可能是我更改FOnTimer为nil值,因为:在整个程序中FOnTimer只出现了四次(包括定义)! 2、我已经试过对FOnTimser手工赋值,没用! 3、if 语句一定执行了,因为我用了以下代码来测试: if assigned(FOnTimer) then begin ShowMessage('true'); FOnTimer(...); end else ShowMessage('false'); 结果是只会出来'false'! 4、我在上面还说了一点,FOnTimer现在可以用了!而我只是把一个与OnTrigger调用几乎没有任何关系的过程改为了函数!(但其它事件依然不能被触发??)你难道没碰到过这种怪事吗?
而且也没道理呀,TTimer本身就是继承自TComponent,它就可以吗!而且所有的类都是用同一个编译系统怎么可能有“偏好”?!#多指教啊,朋友……我可是个初学者……帮帮忙……
TTimeEvent=procedure(Sender: TObject; TheTime:TDateTime) of object;
就从TComponent继承
没理由FOnTimer中的数据不能保存啊!大家帮帮忙,再想想
Windows, Messages, SysUtils,
Classes, Graphics, Controls,
Forms, Dialogs, ExtCtrls;type
TOnTimeEvent = procedure( Sender: TObject; Year, Month, Day, // 事件类型
Hour, Minute, Second, MSec: Word) of Object; TTimePulser = class(TComponent)
private
FTimer: TTimer;
FOnTimer: TOnTimeEvent; // 定义一个事件
public
constructor Create( AOwner: TComponent); override;
destructor Destroy; override;
procedure OnTrigger( Sender: TObject); dynamic;
published
property OnTimer: TOnTimeEvent read FOnTimer write FOnTimer;
end;procedure Register;implementationprocedure Register;
begin
RegisterComponents('XHB', [TTimePulser]);
end;{ TTimePulser }constructor TTimePulser.Create(AOwner: TComponent);
begin
inherited Create( AOwner);
FTimer := TTimer.Create(Self);
FTimer.OnTimer := OnTrigger; // 我用Timer的事件进行控制
end;destructor TTimePulser.Destroy;
begin
FTimer.Free;
inherited Destroy;
end;procedure TTimePulser.OnTrigger( Sender: TObject);
begin
if Assigned( FOnTimer) then
FOnTimer( Self, 0, 0, 0, 0, 0, 0, 0);
end;end.
你的代码我没看出有什么大的不同,只是在定义OnTrigger时比我多加了一个dynamic:
procedure OnTrigger( Sender: TObject); dynamic;
这有何关系?另说明一下,我把一个与OnTrigger调用几乎没有任何关系的过程改为了函数,现在这个事件竟然可以用了??!!
为什么??我的其它几个事件依然不能正常使用啊!!我干脆把代码贴出来吧:
function TTimePulser.Trigge(...):boolean;
begin
if assigned(TimeV) then
begin
if TimeV.CallNote(...) then // CallNote原来是过程,改成函数后FOnTimer就能正常使用了?
TimeV.Free;
result:=true;
end
else
result:=false;
end;procedure TTimePulser.OnTrigge(Sender:TObject);
var
...
begin
...
Trigge(...); // 调用前面的函数(放弃返回值),这与FOnTimer没有任何关系吗!
if assigned(FOnTimer) then
FOnTimer(...);
TimeValue.Free;
end;
if assigned(FOnTimer) then
FOnTimer(...);
我估计在上面的语句之前别的代码已经将FOnTimer又变成了nil
dynamic跟VIRTUAL差不多是重载用的
2、我已经试过对FOnTimser手工赋值,没用!
3、if 语句一定执行了,因为我用了以下代码来测试:
if assigned(FOnTimer) then
begin
ShowMessage('true');
FOnTimer(...);
end
else
ShowMessage('false');
结果是只会出来'false'!
4、我在上面还说了一点,FOnTimer现在可以用了!而我只是把一个与OnTrigger调用几乎没有任何关系的过程改为了函数!(但其它事件依然不能被触发??)你难道没碰到过这种怪事吗?
[email protected]
[email protected]另外还有一个可能对大家来说是很简单的问题:
能否用下面的代码来调用对象的初始化事件?(我没试成功)
constructor MyContrl.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
...
if assigned(FOnCreate) then // 这可能工作吗?
FOnCreate(self);
end;