应该是有关RTTI机制的问题!有点难

肥仔胧 2007-07-20 09:00:53
如TDBEdit,TDBComboBox,TDBMemo等都用相同的属性如DataField
我们可以通过
if GetPropInfo(Obj, 'DataField') <> nil then
SetPropValue(TObject, 'DataField', Value) 来给他的DataField赋值
现在问题是:他们都有DbClick事件
如何通过一语句来调用他的DBClick事件,而不是通过类型来判断比如:
if TWinControl(Obj) is TDBEdit then TDBEdit(obj).OnDbClick(nil)
else if TWinControl(Obj) is TDBComboBox then TDBComboBox(obj).OnDbClick(nil)
else if.....
...全文
92 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
肥仔胧 2007-07-20
  • 打赏
  • 举报
回复
通过判断类型来调用事件存在如下问题:
当焦点在窗体的哪里,我是根据ActiveControl属性来判断的,该ActiveControl的类型是不确定的
如果用判断类型来作的话,相当写死掉了
logne 2007-07-20
  • 打赏
  • 举报
回复
支持楼上,但是这样有一点小问题
比如说上面这段代码是写到button2的click事件里的,
然后Proc(obj);调用obj的ondblclick的时候,在ondblclick事件里的self会变为button2
这样在调用窗体里的其他控件的时候会出问题的,
我觉得还是用类型判断好

或者你可以把他们的ondblclick事件定义成一个
比如;你自己写个过程 procedure OndbDbleClick(sender: TObject);
然后在过程里面判断类型在调用相应的dblclick事件,
这样在其他地方调用这几个控件的ondblclick事件的时候,你只要写句OndbDbleClick(obj)就可以了
sdzeng 2007-07-20
  • 打赏
  • 举报
回复
var
m : TMethod;
Proc: TNotifyEvent;
begin
m := GetMethodProp(obj,'OnDblClick');
if m.Code<>nil then
begin
@Proc := m.Code;
Proc(obj);
end;
end;
brightyang 2007-07-20
  • 打赏
  • 举报
回复
焦点在哪就产生哪个事件不就行了?
肥仔胧 2007-07-20
  • 打赏
  • 举报
回复
sdzeng(大头鸟) 的方法好像可以

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧