人
人生如路
Unregistered / Unconfirmed
GUEST, unregistred user!
(QQ号不给看)( 人生老路) 17:08:42
哪位对VCL组件开发比较熟悉?
请问,TControl类没有公布其OnClick、OnDblClick事件(放在受保护域中),我要想在我的一个自定义控件中,对一个TControl的OnClick赋事件句柄,怎么办?
(QQ号不给看)(wolf你从TControl继承,你是可以直接对OnClick赋事件句柄?
(QQ号不给看)( 人生老路) 17:14:23
==
(QQ号不给看)( 人生老路) 17:31:34
(QQ号不给看)( 人生如路) 17:10:20
这样吧,从头开始。
(QQ号不给看)( 人生如路) 17:15:33
思路与目标:我想写一个像ACDSee那样的视图控件,不过,我的视图控件中每一个Item不只是可以显示图像,而是可以放任何类型的控件,如Memo,Image。。。或是其它的,都可以。因此我称它为“CtrlViewer”。它有网格,每一个网格中是一个从TCustomControl继承而来的自定义控件,作为控件视图中要放的子控件的Parent。
(QQ号不给看)(Luyear曰:哦,就和XP系统的资源管理器一样
(QQ号不给看)( 人生如路) 17:19:02
实现方法:
CtrlViewer有一个Items属性,这是从TColltion类继承而来,管理我的控件容器组件列表;
然后,我再从TColltionItem继承一个类,在它的Create方法里面,我实例化一个从TCustomControl继承而来的组件(称为TCtrlPanelItem),这个TCtrlPanelItem有Canvas,可以画自己的边框。
(QQ号不给看)( 人生如路) 17:19:16
(QQ号不给看)(Luyear曰:哦,就和XP系统的资源管理器一样
====有点像。
(QQ号不给看)( 人生如路) 17:20:16
TCustomControl继承而来的组件,我公布了OnClick、OnDblClick、OnMouseDown等事件。
(QQ号不给看)( 人生如路) 17:21:38
因此,在TColltionItem内部,我可以很容易的定制TCustomControl继承而来的组件的OnClick、OnDblClick等事件,以实现一个视图项目的选中、多选、单击一个项目、双击一个项目等功能。
(QQ号不给看)( 人生如路) 17:22:23
到此,大的框架就出来了,它可以工作,只不过,看起来没有任何的意义 - 只是有一个网格。
(QQ号不给看)( 人生如路) 17:23:31
然后,我想,要实现在它里面的每一个Item中放任何类型的控件,我需要对每一个视图项目(TColltionItem) Bound一个Control。
(QQ号不给看)( 人生如路) 17:23:50
这样,它的每一个Item才可以放任何类型的Control。
(QQ号不给看)( 人生如路) 17:25:16
我就在TColltionItem里面公布了一个BoundControl属性,代码如下:
property BoundControl : TControl read FBoundCotrol write SetBoundControl;
(QQ号不给看)( 人生如路) 17:26:19
BoundControl的写方法SetBoundControl的代码很简单:
if Assigned(Value) then
begin
FBoundControl := Value;
FBoundContro.SetBounds(.....);
end;
(QQ号不给看)( 人生如路) 17:27:10
这样,我在客户端代码中,我在调用了Items.Add方法之后,再实例化一个Memo,设置为Item.BoundControl。
(QQ号不给看)( 人生如路) 17:27:52
运行程序,工作正常,Memo真的显示在我的控件视图的网格中。
(QQ号不给看)( 人生如路) 17:28:42
不过,问题来了,在没有Bound Memo以前,单选、多选,Item的单击、双击事件都正常,加了以后却不行了。
(QQ号不给看)( 人生如路) 17:28:57
为什么?因为被它上面的Memo给挡住了。
(QQ号不给看)( 人生如路) 17:30:58
因此,我又想,我应该给BoundContrl定制OnClick、OnDblClick的事件句柄。
等我在刚才那个BoundControl的写方法SetBoundControl中,想去定制OnClick、OnDblClick的事件句柄的时候,才发现,TControl的OnClick等事件不是Public的,而是Protected的。
(QQ号不给看)( 人生如路) 17:31:08
好了,讲完了,大家帮我想一想,有没有好的办法。
(QQ号不给看)(wolf你写一个中间TControl就可以了.(他把他们的protected的public出来)
(QQ号不给看)( 人生老路) 17:37:15
如果这样的话,那么,现有的VCL类就不能放在上面了。
(QQ号不给看)(诸葛白痴) 17:35:26
将BoundItem hook相关的鼠标、键盘事件
(QQ号不给看)( 人生老路) 17:39:27
BoundControl是客户程序赋的,我没有办法改它。
(QQ号不给看)(诸葛白痴) 17:37:27
boundcontrol不是你自己的控件吗?
(QQ号不给看)( 人生老路) 17:40:20
BoundControl只是一个属性而已。
(QQ号不给看)( 人生老路) 17:40:57
意思很简单,我提供了一个大的容器,作为控件视图所有的Item的容器。
(QQ号不给看)(诸葛白痴) 17:38:46
明白,等会,想想
(QQ号不给看)( 人生老路) 17:41:54
然后,每一个Item,又是一个小容器,它可以放任何Control在上面的。
(QQ号不给看)(诸葛白痴) 17:39:24
在SetBound时可以先接管下层控件的Onclick嘛
(QQ号不给看)( 人生老路) 17:42:23
怎么实现?就是我的那个BoundControl的写方法中。调用TControl.SetBound方法。
(QQ号不给看)( 人生老路) 17:42:36
(QQ号不给看)(诸葛白痴) 17:39:24
在SetBound时可以先接管下层控件的Onclick嘛
===讲详细一些??
(QQ号不给看)(诸葛白痴) 17:40:28
SetBound(NextControl: TWinControl);
begin
if NextControl has onclick事件 then
nextcontrol.onclick := nextonclick;
...
end;
(QQ号不给看)(诸葛白痴) 17:40:57
然后在
nextonclick中:
Self.onClick;
NextControl.onclick
(QQ号不给看)(诸葛白痴) 17:41:51
各个Item肯定都有一个NextControl嘛,对不? 调用这样不就行了
(QQ号不给看)( 人生老路) 17:44:40
没有NextControl。
(QQ号不给看)( 人生老路) 17:44:52
而且,TWinControl也没有公布OnClick的。
(QQ号不给看)( 人生老路) 17:44:54
不成。
(QQ号不给看)(诸葛白痴) 17:42:43
你不是把control放在Item上吗? 那肯定Item知道放在它上面的control的操作句柄吧
(QQ号不给看)( 人生老路) 17:46:14
是,就是那个BoundControl属性,可以防问到Item所Bound的Control。
(QQ号不给看)( 人生老路) 17:46:26
不过,它是TControl类型。。。
(QQ号不给看)(诸葛白痴) 17:44:18
那就可以嘛,可以强行转换成twincontrol嘛,看看它是否支持click事件嘛,等会
(QQ号不给看)(诸葛白痴) 17:45:51
我看TButton是有公布Click事件的,等会看看其他控件
(QQ号不给看)(诸葛白痴) 17:48:12
是没有发布出来
(QQ号不给看)( 人生老路) 17:54:36
怎么办??
(QQ号不给看)(诸葛白痴) 17:52:11
你上层的onclick应该不在有用了吧?
(QQ号不给看)(诸葛白痴) 17:52:24
就是memo的onclick事件要写代码吗? 不用吧
(QQ号不给看)(诸葛白痴) 17:52:39
那你就完全接管它,然后执行一下item的onclick嘛
(QQ号不给看)( 人生老路) 17:55:45
我从TCustomControl继承而来的那个是接管了。
(QQ号不给看)( 人生老路) 17:56:10
现在的问题,是怎么接管那个BoundControl属性所指的控件。
(QQ号不给看)(诸葛白痴) 17:56:05
接管? 晕,判断BoundControl是否是TWinControl啊,如果是TWinControl那一定支持OnClick嘛,然后将OnClick指向Item的一个过程就行了,然后在这个过程里执行Item的OnClick不就行了
(QQ号不给看)( 人生老路) 17:59:19
OnClick是由TControl定义的,不是由TWinControl。
(QQ号不给看)( 人生老路) 17:59:44
不过,TWinControl从TControl继承而来,也没有公布OnClick。
(QQ号不给看)( 人生老路) 17:59:48
不信你看代码。
(QQ号不给看)(诸葛白痴) 17:57:49
那我问你BoundControl.OnClick := myprocedure这句行不行?
(QQ号不给看)( 人生老路) 18:00:46
不行。如果行的话,我就不会烦了。
(QQ号不给看)( 人生老路) 18:01:24
var
BoundControl : TControl;
begin
BoundControl.OnClick := Aprocdure;
(QQ号不给看)( 人生老路) 18:01:27
你试,肯定不行。
(QQ号不给看)( 人生老路) 18:02:13
我去开贴了。
(QQ号不给看)( 人生老路) 18:02:18
大家去抢分去。。
(QQ号不给看)(诸葛白痴) 18:00:28
晕,TControl没有OnClick事件
(QQ号不给看)( 人生老路) 18:03:47
不是没有。
(QQ号不给看)( 人生老路) 18:03:53
是没有公布而已。
(QQ号不给看)( 人生老路) 18:04:08
不在PUblic和Published部分,在Protected 。
哪位对VCL组件开发比较熟悉?
请问,TControl类没有公布其OnClick、OnDblClick事件(放在受保护域中),我要想在我的一个自定义控件中,对一个TControl的OnClick赋事件句柄,怎么办?
(QQ号不给看)(wolf你从TControl继承,你是可以直接对OnClick赋事件句柄?
(QQ号不给看)( 人生老路) 17:14:23
==
(QQ号不给看)( 人生老路) 17:31:34
(QQ号不给看)( 人生如路) 17:10:20
这样吧,从头开始。
(QQ号不给看)( 人生如路) 17:15:33
思路与目标:我想写一个像ACDSee那样的视图控件,不过,我的视图控件中每一个Item不只是可以显示图像,而是可以放任何类型的控件,如Memo,Image。。。或是其它的,都可以。因此我称它为“CtrlViewer”。它有网格,每一个网格中是一个从TCustomControl继承而来的自定义控件,作为控件视图中要放的子控件的Parent。
(QQ号不给看)(Luyear曰:哦,就和XP系统的资源管理器一样
(QQ号不给看)( 人生如路) 17:19:02
实现方法:
CtrlViewer有一个Items属性,这是从TColltion类继承而来,管理我的控件容器组件列表;
然后,我再从TColltionItem继承一个类,在它的Create方法里面,我实例化一个从TCustomControl继承而来的组件(称为TCtrlPanelItem),这个TCtrlPanelItem有Canvas,可以画自己的边框。
(QQ号不给看)( 人生如路) 17:19:16
(QQ号不给看)(Luyear曰:哦,就和XP系统的资源管理器一样
====有点像。
(QQ号不给看)( 人生如路) 17:20:16
TCustomControl继承而来的组件,我公布了OnClick、OnDblClick、OnMouseDown等事件。
(QQ号不给看)( 人生如路) 17:21:38
因此,在TColltionItem内部,我可以很容易的定制TCustomControl继承而来的组件的OnClick、OnDblClick等事件,以实现一个视图项目的选中、多选、单击一个项目、双击一个项目等功能。
(QQ号不给看)( 人生如路) 17:22:23
到此,大的框架就出来了,它可以工作,只不过,看起来没有任何的意义 - 只是有一个网格。
(QQ号不给看)( 人生如路) 17:23:31
然后,我想,要实现在它里面的每一个Item中放任何类型的控件,我需要对每一个视图项目(TColltionItem) Bound一个Control。
(QQ号不给看)( 人生如路) 17:23:50
这样,它的每一个Item才可以放任何类型的Control。
(QQ号不给看)( 人生如路) 17:25:16
我就在TColltionItem里面公布了一个BoundControl属性,代码如下:
property BoundControl : TControl read FBoundCotrol write SetBoundControl;
(QQ号不给看)( 人生如路) 17:26:19
BoundControl的写方法SetBoundControl的代码很简单:
if Assigned(Value) then
begin
FBoundControl := Value;
FBoundContro.SetBounds(.....);
end;
(QQ号不给看)( 人生如路) 17:27:10
这样,我在客户端代码中,我在调用了Items.Add方法之后,再实例化一个Memo,设置为Item.BoundControl。
(QQ号不给看)( 人生如路) 17:27:52
运行程序,工作正常,Memo真的显示在我的控件视图的网格中。
(QQ号不给看)( 人生如路) 17:28:42
不过,问题来了,在没有Bound Memo以前,单选、多选,Item的单击、双击事件都正常,加了以后却不行了。
(QQ号不给看)( 人生如路) 17:28:57
为什么?因为被它上面的Memo给挡住了。
(QQ号不给看)( 人生如路) 17:30:58
因此,我又想,我应该给BoundContrl定制OnClick、OnDblClick的事件句柄。
等我在刚才那个BoundControl的写方法SetBoundControl中,想去定制OnClick、OnDblClick的事件句柄的时候,才发现,TControl的OnClick等事件不是Public的,而是Protected的。
(QQ号不给看)( 人生如路) 17:31:08
好了,讲完了,大家帮我想一想,有没有好的办法。
(QQ号不给看)(wolf你写一个中间TControl就可以了.(他把他们的protected的public出来)
(QQ号不给看)( 人生老路) 17:37:15
如果这样的话,那么,现有的VCL类就不能放在上面了。
(QQ号不给看)(诸葛白痴) 17:35:26
将BoundItem hook相关的鼠标、键盘事件
(QQ号不给看)( 人生老路) 17:39:27
BoundControl是客户程序赋的,我没有办法改它。
(QQ号不给看)(诸葛白痴) 17:37:27
boundcontrol不是你自己的控件吗?
(QQ号不给看)( 人生老路) 17:40:20
BoundControl只是一个属性而已。
(QQ号不给看)( 人生老路) 17:40:57
意思很简单,我提供了一个大的容器,作为控件视图所有的Item的容器。
(QQ号不给看)(诸葛白痴) 17:38:46
明白,等会,想想
(QQ号不给看)( 人生老路) 17:41:54
然后,每一个Item,又是一个小容器,它可以放任何Control在上面的。
(QQ号不给看)(诸葛白痴) 17:39:24
在SetBound时可以先接管下层控件的Onclick嘛
(QQ号不给看)( 人生老路) 17:42:23
怎么实现?就是我的那个BoundControl的写方法中。调用TControl.SetBound方法。
(QQ号不给看)( 人生老路) 17:42:36
(QQ号不给看)(诸葛白痴) 17:39:24
在SetBound时可以先接管下层控件的Onclick嘛
===讲详细一些??
(QQ号不给看)(诸葛白痴) 17:40:28
SetBound(NextControl: TWinControl);
begin
if NextControl has onclick事件 then
nextcontrol.onclick := nextonclick;
...
end;
(QQ号不给看)(诸葛白痴) 17:40:57
然后在
nextonclick中:
Self.onClick;
NextControl.onclick
(QQ号不给看)(诸葛白痴) 17:41:51
各个Item肯定都有一个NextControl嘛,对不? 调用这样不就行了
(QQ号不给看)( 人生老路) 17:44:40
没有NextControl。
(QQ号不给看)( 人生老路) 17:44:52
而且,TWinControl也没有公布OnClick的。
(QQ号不给看)( 人生老路) 17:44:54
不成。
(QQ号不给看)(诸葛白痴) 17:42:43
你不是把control放在Item上吗? 那肯定Item知道放在它上面的control的操作句柄吧
(QQ号不给看)( 人生老路) 17:46:14
是,就是那个BoundControl属性,可以防问到Item所Bound的Control。
(QQ号不给看)( 人生老路) 17:46:26
不过,它是TControl类型。。。
(QQ号不给看)(诸葛白痴) 17:44:18
那就可以嘛,可以强行转换成twincontrol嘛,看看它是否支持click事件嘛,等会
(QQ号不给看)(诸葛白痴) 17:45:51
我看TButton是有公布Click事件的,等会看看其他控件
(QQ号不给看)(诸葛白痴) 17:48:12
是没有发布出来
(QQ号不给看)( 人生老路) 17:54:36
怎么办??
(QQ号不给看)(诸葛白痴) 17:52:11
你上层的onclick应该不在有用了吧?
(QQ号不给看)(诸葛白痴) 17:52:24
就是memo的onclick事件要写代码吗? 不用吧
(QQ号不给看)(诸葛白痴) 17:52:39
那你就完全接管它,然后执行一下item的onclick嘛
(QQ号不给看)( 人生老路) 17:55:45
我从TCustomControl继承而来的那个是接管了。
(QQ号不给看)( 人生老路) 17:56:10
现在的问题,是怎么接管那个BoundControl属性所指的控件。
(QQ号不给看)(诸葛白痴) 17:56:05
接管? 晕,判断BoundControl是否是TWinControl啊,如果是TWinControl那一定支持OnClick嘛,然后将OnClick指向Item的一个过程就行了,然后在这个过程里执行Item的OnClick不就行了
(QQ号不给看)( 人生老路) 17:59:19
OnClick是由TControl定义的,不是由TWinControl。
(QQ号不给看)( 人生老路) 17:59:44
不过,TWinControl从TControl继承而来,也没有公布OnClick。
(QQ号不给看)( 人生老路) 17:59:48
不信你看代码。
(QQ号不给看)(诸葛白痴) 17:57:49
那我问你BoundControl.OnClick := myprocedure这句行不行?
(QQ号不给看)( 人生老路) 18:00:46
不行。如果行的话,我就不会烦了。
(QQ号不给看)( 人生老路) 18:01:24
var
BoundControl : TControl;
begin
BoundControl.OnClick := Aprocdure;
(QQ号不给看)( 人生老路) 18:01:27
你试,肯定不行。
(QQ号不给看)( 人生老路) 18:02:13
我去开贴了。
(QQ号不给看)( 人生老路) 18:02:18
大家去抢分去。。
(QQ号不给看)(诸葛白痴) 18:00:28
晕,TControl没有OnClick事件
(QQ号不给看)( 人生老路) 18:03:47
不是没有。
(QQ号不给看)( 人生老路) 18:03:53
是没有公布而已。
(QQ号不给看)( 人生老路) 18:04:08
不在PUblic和Published部分,在Protected 。