为自定义控件做一个事件,截获标准控件的事件,例如:把MainMenu作为自定义控件的参数,我要截获mmExample(蔡单项)的OnClick事件,这只是一个例子(有可能是TEdit、TActionList、TLabel、TPopMenu等标准控件)。自定义控件事件的原型:
procedure OnMenuItemClick(Sender:TComponent;var RtnTxt:string);说明:Sender指为mmExample,也就是说通过Sender能找到发生Click事件的对象,经过处理,返回RtnTxt:string,供用户使用。请大侠指点!

解决方案 »

  1.   

    先定义该事件,然后在控件的create中建立该事件和标准事件的关系就OK了;(给你个结构例子)我可以赚100分吧。如:type 
       Myclass=Class(TShape)
       private
         procedure OnClick;
         .
         .
       protected
       public
         constructor Create;
         destructor destroy;override;
       end;construtor MyClass.create;
    begin
       OnClick(标准事件)=OnClick(自定义事件);
       .
       .
    end;procedure Myclass.OnClick;
    begin
    .
    .
    end;
    .
    .
    .
      

  2.   

    好像与我说的不太一样,我的自定义控件本身并没有click事件,它是由监测其他标准控件的click事件得到的,并且经过处理得到某参数,我先试试!
      

  3.   

    不太明白,是不是做一个另带参数的click事件?
    type 
       TMyMenuItemclick = procedure (Sender:TComponent;var RtnTxt:string);
       Myclass=Class(TShape)
       private
         fmyclick:TMyMenuItemClick;     
         .
         .
       protected
         procedure MenuClick(Sender: TObject);
       public
         constructor Create;
         destructor destroy;override;
       pulished
         MyClick;
       end;
    construtor TMyClass.create;
    begin
       mmExample.OnClick:=MenuClick;
       .
       .
    end;procedure TMyClass.MenuClick(sender:TObject);
    begin
      if assigned(FMyClick) then
        FMyClick(Sender,'OnMyClick');
    end;
      

  4.   

    //把Myclass=Class(TShape)中Myclass改为TMyClass
      

  5.   

    还是不一样,在详细说明:你知道TDataSet的TField的OnGetText(Sender: TField; var Text: String;
      DisplayText: Boolean);事件吧,我的要求与之类似,我的控件Tpack有个属性TMainMenu,我要在Tpack的事件中做个可以监控TMainMenu的item的OnClick事件的事件。问题简化:自定义控件TPack,属性TMainMenu,在TPack中增加事件:
    procedure OnMenuItemClick(Sender:TComponent;var RtnTxt:string);要求:当TMainMenu的Item发生Click事件时,在TPack.OnMenuItemClick事件中能够得到Item的Name(或Caption、Hint都行啊,只要返回Item的属性就行)值。用户使用TPack的效果:procedure TForm1.Pack1MenuItemClick(Sender: TComponent;
      var RtnTxt: String);
    begin
    showmessage(RtnTxt);//如果mmExample发生Click事件,这里就应该显示'mmExample'
    end;
      

  6.   

    跟我说的差不多嘛。
    type 
       TMyMenuItemclick = procedure (Sender:TComponent;var RtnTxt:string);
       TPack=Class(TObject)
       private
         FOnMyclick:TMyMenuItemClick;     
         .
         .
       protected
         procedure MenuClick(Sender: TObject);
       public
         constructor Create;
         destructor destroy;override;
       pulished
         OnMyClick;
       end;construtor Tpack.create;
    var
      i:integer
    begin
      for i:=0 to mainmenu .count-1 do
        mainmenu.items[i].OnClick:=MenuClick;
       .
       .
    end;procedure tpack.Menuclick(sender:tobject);
    begin
      if assigned(FOnMyClick) then
        FOnMyClick(sender,TMenuItem(sender).caption); //sender就是触发click的对象,转换成menuitem即可获得属性。
    end;
      

  7.   

    出了问题!原来的TMenuItem的Click事件被取代了,不行,我要的是原来事件照样触发,触发后再触发TPack的事件
      

  8.   

    Mission Impossible :-(
    要触发TPack的事件必须能接收TMenuItem的Click事件,接收TMenuItem的Click事件就必须用自己的函数去取代原来的TMenuItem的Click函数
      

  9.   

    不行,我要的是监视MenuItem的Click动作,并获得动作对象的属性值,能不能通过截获消息实现?
      

  10.   

    大概是这样,随手写的:
    type
      txxx = class
      private 
        Fmm: Tmm;
        FOldClickEvent: TNotifyEvent;
        procedure Setmm(Value: Tmm);
      public
        property mm : Tmm read Fmm write Setmm;
        procedure NewClickEvent(Sender: TObject);
      end;procedure txxx.Setmm(Value: Tmm);
    begin
      if Value = Fmm then exit;
      //将现在的fmm事件还原
      if fmm <> nil then 
        fmm.onclick := FoldClickEvent;
      fmm := Value;
      if Fmm <> nil then 
      begin
        FOldClickEvent := Fmm.OnClick;
        fmm.Onclick := NewClickEvent;
      end;
    end;
    procedure txxx.NewClickEvent(Sender: Tobject);
    begin
      //加入自己的处理代码
      if Assigned(FOldClickEvent) then FOldClickEvent(Sender);
      //加入自己的处理代码
    end;注意在txx的Destroy里面加入self.mm := nil;还原事件处理程序
      

  11.   

    如果你要再加上一个事件响应的话这样
      txx = class
      private
        FpackClickEvent: TNotifyEvent;
      public 
        property OnPackClickEvent : read FpackClickEvent write FpackClickEvent;
      end;  然后把上面的NewClickEvent(Sender: Tobject);改一下
     
      加入一句if assigned(FpackClickEvent) then FpackClickEvent(Sender);
      

  12.   

    多谢rustle() 的多次关注,再试试,给分我毫不犹豫的:)*****本人号称100%结帖王*****