变更控件的事件 ( 积分: 20 )

  • 主题发起人 主题发起人 siaosa
  • 开始时间 开始时间
S

siaosa

Unregistered / Unconfirmed
GUEST, unregistred user!
TComA=Class(TPanel)
在控件的Create方法中
constructor TComA.Create(AOwner: TComponent);
begin
inherited;
Width:=320;
Height:=301;

FTitle:=TPanel.Create(Self);
FTitle.Parent:=Self;
FTitle.Name:='Title';
FTitle.Top:=0;
FTitle.Height:=21;
FTitle.Align:=alTop;
FTitle.FreeNotification(Self);
FTitle.SetSubComponent(True);

FTitle.OnClick:=Self.OnClick; //目的:单击FTitle执行控件的OnClick事件
end;
但单击ComA上的FTitle并不执行ComA的OnClick事件,单击ComA控件能够正确执行ComA的OnClick事件,这是为什么?
 
TComA=Class(TPanel)
在控件的Create方法中
constructor TComA.Create(AOwner: TComponent);
begin
inherited;
Width:=320;
Height:=301;

FTitle:=TPanel.Create(Self);
FTitle.Parent:=Self;
FTitle.Name:='Title';
FTitle.Top:=0;
FTitle.Height:=21;
FTitle.Align:=alTop;
FTitle.FreeNotification(Self);
FTitle.SetSubComponent(True);

FTitle.OnClick:=Self.OnClick; //目的:单击FTitle执行控件的OnClick事件
end;
但单击ComA上的FTitle并不执行ComA的OnClick事件,单击ComA控件能够正确执行ComA的OnClick事件,这是为什么?
 
应该没问题,
要不再贴点
 
FTitle.OnClick:=Form1Click;//OnClick 事件应对应一个Procedure
 
constructor TComA.Create(AOwner: TComponent);
begin
inherited;
Width:=320;
Height:=301;

FTitle:=TPanel.Create(Self);
FTitle.Parent:=Self;
FTitle.Name:='Title';
FTitle.Top:=0;
FTitle.Height:=21;
FTitle.Align:=alTop;
FTitle.FreeNotification(Self);
FTitle.SetSubComponent(True);

FTitle.OnClick:=Self.OnClick;
FTitle.OnDblClick:=Self.OnDblClick;
FTitle.OnEnter:=Self.OnEnter;
FTitle.OnExit:=Self.OnExit;
end;

单击FTitle并不执行ComA的OnClick事件
 
注销这两句试一下
FTitle.FreeNotification(Self);
FTitle.SetSubComponent(True);
 
楼主的控件ComA是什么类?
你的ComA.OnClick事件代码是什么,有没有处理什么操作(要保证ComA.OnClick已有赋值)?
应该没问题,可以自己写个过程试试,如:
procedure ComA.ClickTest(Sender: TObject);
begin
showmessage('Hello');
end;
然后FTitle.OnClick:=Self.ClickTest;
 
self.onClick 的指针是 form 的.也许问题就在这里
 
ComA= class(TPanel)

在应用程序有如下代码
procedure TForm1.ComA1Click(Sender: TObject); //ComA的OnClick事件
begin
showmessage('Hello');
end;
点击ComA上的FTitle控件,并不执行ComA1的Click事件

删除一以下两句也一样
FTitle.FreeNotification(Self);
FTitle.SetSubComponent(True);
 
不知道你的ComA= class(TPanel)下面的代码是怎样的,好像你并没有赋值,你把方法
所属关系弄错了。
你的FTitle.OnClick:=Self.OnClick;实质上等于FTitle.OnClick:=TComA.OnClick;
但TComA.OnClick并没有执行代码,你所谓的
“在应用程序有如下代码
procedure TForm1.ComA1Click(Sender: TObject); //ComA的OnClick事件
begin
showmessage('Hello');
end;”不过是TForm1的ComAClick,你试试在这中间添加代码:
constructor TComA.Create(AOwner: TComponent);
begin
inherited;
Width:=320;
Height:=301;

self.OnClick :=Form1.ComA1Click; //新添代码

FTitle:=TPanel.Create(Self);
FTitle.Parent:=Self;
FTitle.Name:='Title';
.....
end;
 
我是想点击ComA上的FTitle就执行ComA的OnClick事件.ComA是一个自己编写的控件.在编写ComA时还没有Form1
 
FreeNotification(Self); // 的作用是主控件删除时是自动删除自己
SetSubComponent(True); // 的作用是可以在设计时保存设计信息。
就以上要求还是保留的好。

//FTitle.OnClick:=Self.OnClick;
需要注意的是 OnClick是Event指针,而不是一个方法(方法是不能赋值的),所以这句的意思:
FTitle.OnClick不是指向 Self.OnClick,而是指向Self.OnClick指向的方法。当时值为nil那么结果就是 nil了,同样,当Self.OnClick的指向改变时, FTitle.OnClick不会改变。

如果你的意思是想 FTitle.OnClick的时候调用 Self.OnClick的方法,比较简单的方法就是指向的方法里调用 Self.OnClick就可以了。
例:
FTitle.OnClick:= TitleOnClick;

procedure TitleOnClick(Sender: TObject);
begin
if Assigned(Self.OnClick) then Self.OnClick(Self);
end;
 
楼主的问题好像不再是FTitle.OnClick和Self.OnClick之间怎么赋值,而是Self.OnClick
原来就没有赋值。“ComA是一个自己编写的控件”,自己编写的控件在创建时就给OnClick
指派一个事件处理过程OnClick :=ClickTest;(ClickTest是TNotifyEvent型的过程
procedure ClickTest(Sender :TObject);
begin
showmessage('hello');
end;),或者编写时将OnClick再继承:
TComA = class(TPanel)
private
public
constructor Create;
published
property OnClick; //这样在注册控件后编辑器里能方便的找到并编写OnClick代码
end;
首先要保证OnClick方法指针已经挂上有事件处理代码,即已经将一个过程名(记为
TestClick)赋值给了OnClick属性,然后再将OnClick赋值给其他同类型属性就能调用到
TestClick中的代码了,比如FTitle.OnClick :=self.OnClick;(实际调用的是TestClick)
 
TO:Jonson_sunshine
我的目的是想让用户单击ComA上的任何一个控件都执行ComA的OnClick事件.ComA.OnClick在编写ComA控件的时候是没有挂上任何事件的,想让用户在设计其它应用程序期间自定义ComA1.OnClick事件.
 
//类似这样就可以了,自己试试吧。。
TComA=Class(TPanel)
private
...
procedure SelfClick(Sender: TObject);
...
end;

在控件的Create方法中
constructor TComA.Create(AOwner: TComponent);
begin
...
...
FTitle.OnClick := SelfClick;
Fxxxx.OnClick := SelfClick;
end;

procedure SelfClick(Sender: TObject);
begin
if Assigned(Self.OnClick) then Self.OnClick(Self);
end;
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
515
import
I
后退
顶部