如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.....

解决方案 »

  1.   

    var
      m : TMethod;
      Proc: TNotifyEvent;
    begin
      m := GetMethodProp(obj,'OnDblClick');
      if m.Code<>nil then
      begin
        @Proc := m.Code;
        Proc(obj);
      end;
    end;
      

  2.   

    支持楼上,但是这样有一点小问题
    比如说上面这段代码是写到button2的click事件里的,
    然后Proc(obj);调用obj的ondblclick的时候,在ondblclick事件里的self会变为button2
    这样在调用窗体里的其他控件的时候会出问题的,
    我觉得还是用类型判断好或者你可以把他们的ondblclick事件定义成一个
    比如;你自己写个过程 procedure OndbDbleClick(sender: TObject);
    然后在过程里面判断类型在调用相应的dblclick事件,
    这样在其他地方调用这几个控件的ondblclick事件的时候,你只要写句OndbDbleClick(obj)就可以了
      

  3.   

    通过判断类型来调用事件存在如下问题:
    当焦点在窗体的哪里,我是根据ActiveControl属性来判断的,该ActiveControl的类型是不确定的
      如果用判断类型来作的话,相当写死掉了
      

  4.   

    sdzeng(大头鸟) 的方法好像可以