为自定义控件做一个事件,截获标准控件的事件,例如:把MainMenu作为自定义控件的参数,我要截获mmExample(蔡单项)的OnClick事件,这只是一个例子(有可能是TEdit、TActionList、TLabel、TPopMenu等标准控件)。自定义控件事件的原型:
procedure OnMenuItemClick(Sender:TComponent;var RtnTxt:string);说明:Sender指为mmExample,也就是说通过Sender能找到发生Click事件的对象,经过处理,返回RtnTxt:string,供用户使用。请大侠指点!
procedure OnMenuItemClick(Sender:TComponent;var RtnTxt:string);说明:Sender指为mmExample,也就是说通过Sender能找到发生Click事件的对象,经过处理,返回RtnTxt:string,供用户使用。请大侠指点!
解决方案 »
- dephi新手提问,关于mysql
- 关于playsound()的问题,在线等
- 如何通过Indy的idsmtpserver构建邮件服务器,并实现此服务器到其它服务器的邮件发送?
- 一个比较棘手的问题,请大家教教我好吗
- 大家推荐几本DELPHI的入门经典吧,急得很,谢谢大家拉!
- 怎样改变dbgrid 中符合条件的某些字段的颜色。
- ***急,如何将Excel文件导入到SqlServer表中??***
- 如何在 quick report 里将报表内容保存为 txt 文件?
- 编程还能做几年呢?序员是不是老得很快呢?序员之后做什么呢?系统分析?有人说程序员的命运很惨!老了女朋友还没一个,真是有辛苦又前途.
- 窗体背景一问!
- 用ListBox和ComBoBox出现‘List index out of bounds(2)‘的问题
- 函数执行出错
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;
.
.
.
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;
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;
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;
要触发TPack的事件必须能接收TMenuItem的Click事件,接收TMenuItem的Click事件就必须用自己的函数去取代原来的TMenuItem的Click函数
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;还原事件处理程序
txx = class
private
FpackClickEvent: TNotifyEvent;
public
property OnPackClickEvent : read FpackClickEvent write FpackClickEvent;
end; 然后把上面的NewClickEvent(Sender: Tobject);改一下
加入一句if assigned(FpackClickEvent) then FpackClickEvent(Sender);