按照你所列出的代码,似乎看不出有什么错,只有一点,即你继承的祖先类可能太低了,
把TComponent该成TWinControl或TCustomControl试试, 如果不行,我们在讨论。

解决方案 »

  1.   

    没用啊,我都试过了!
    而且也没道理呀,TTimer本身就是继承自TComponent,它就可以吗!而且所有的类都是用同一个编译系统怎么可能有“偏好”?!#多指教啊,朋友……我可是个初学者……帮帮忙……
      

  2.   

    把FOnTimer :TOnTimeEvent;改为FOnTimer :TTimeEvent试一试!
      

  3.   

    忘了说:
      TTimeEvent=procedure(Sender: TObject; TheTime:TDateTime) of object;
    就从TComponent继承
      

  4.   

    哈哈!还是没用,难道就没人能帮我吗?
    没理由FOnTimer中的数据不能保存啊!大家帮帮忙,再想想
      

  5.   

    还有个小问题:property定义属性时,用default和用stored有何区别?
      

  6.   

    unit TimePulser;interfaceuses
      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.
      

  7.   

    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;
      

  8.   

    写个测试程序 动态创建TTIMERPULSER 再将某个方法指针设置给对象方法ONTIMER 设个断点看看有没有执行到这一步
      if assigned(FOnTimer) then
        FOnTimer(...);
    我估计在上面的语句之前别的代码已经将FOnTimer又变成了nil
    dynamic跟VIRTUAL差不多是重载用的
      

  9.   

    1、绝对不可能是我更改FOnTimer为nil值,因为:在整个程序中FOnTimer只出现了四次(包括定义)!
    2、我已经试过对FOnTimser手工赋值,没用!
    3、if 语句一定执行了,因为我用了以下代码来测试:
       if assigned(FOnTimer) then
          begin
             ShowMessage('true');
             FOnTimer(...);
          end
       else
          ShowMessage('false');
       结果是只会出来'false'!
    4、我在上面还说了一点,FOnTimer现在可以用了!而我只是把一个与OnTrigger调用几乎没有任何关系的过程改为了函数!(但其它事件依然不能被触发??)你难道没碰到过这种怪事吗?
      

  10.   

    如果不介意,请把你的unit寄给我。关注!
    [email protected]
      

  11.   

    我建议用SETTIMER()  API产生的 消息来处理,和TIMER部件无关,程序直接控制消息和消息处理,肯定没问题,并且代码也不会增加很多。
      

  12.   

    非常感谢大家的帮助,现在问题已基本解决了。我没有找到原因,就如前面所说,只是修改了一个毫不相干的地方问题就解决了!因为过几天就要开学了(夜大),所以这几天晚上没有太多时间来找问题的根源,如果大家也碰、解决类似问题时请一定告诉我!
    [email protected]另外还有一个可能对大家来说是很简单的问题:
    能否用下面的代码来调用对象的初始化事件?(我没试成功)
    constructor MyContrl.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      ...
      if assigned(FOnCreate) then     // 这可能工作吗?
         FOnCreate(self);
    end;