没分了,下次补上,大家来看看也行...比如,我在一个窗体的DBGrid中设定好了标题排序,TAB键左右移,隔行分色,鼠标中键激活等方法...如果想在别的窗体中应用这些方法,难道只有一个一个窗体的加吗?可不可以在公共文件(比如:pub.pas)文件中写成一个函数,然后调用?

解决方案 »

  1.   

    可以啊把DBGrid做为参数就行了
      

  2.   

    楼上,
    怎么搞,比如:一个是:
    procedure TMainForm.DBGrid1KeyPress(Sender: TObject; var Key: Char);
    begin
        .../省略
    end;一个又是:
    procedure TMainForm.DBGrid1DrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumn;
      State: TGridDrawState);
    begin
      ..../省略
    end
      

  3.   

    拿第一个为例在你的公共单元里实现procedure TMainForm.MyKeyPress(Sender: TObject; var Key: Char)
    begin
    end;
    然后procedure SetDBGridFunc(var g:TDBGrid)
    {
      g.KeyPress:=MyKeyPress;
    }
    就是类似这样的一些操作调用的时候SetDBGridFunc(DBGrid1);
    大概就是这个样子啦
      

  4.   

    使用chijingde(AD) 说的方法:
    DBGrid1KeyPress(Sender: TObject; var Key: Char) 这些都是通知函数,您可以在公共单元中定义一些公用的通知函数。接着在您的类实现中就可以加入如下初始化的代码:
    procedure MyClass.InitEventHandler;
    begin
      OnClick:=xxx.myClickEvent;
      ....
    end;但是要注意一下几点:
    1、事件函数赋值的时候,右值必须是“对象方法指针”,也就是说在定义我们自己的xxx.myClickEvent时,也要创建一个类并把对象方法(如myClickEvent)申明在类中。
    2、右值对象方法的参数必须与左值对象方法指针的参数一致,如TNotifyEvent事件只需要Sender,而TMouseEvent则需要更多,您可以先在OI中双击要覆盖的时间,看看需要哪些参数。我的实现方法是:
    1、定义一个TEventHandler类,这个类中声明并实现公用的对象方法/事件,如CommonOnClick、CommonOnCreate等等。
    2、将chijingde(AD)提到的SetDBGridFunc过程放在公共单元文件中(TEventHandler也可以实现在公共单元文件中),然后在SetDBGridFunc中实例化TEventHandler对象,再将eventHandler对象的对象方法(事件函数)赋值给您的DBGrid对象。
    3、在您的各个相似的DBGrid初始化代码中,加入SetDBGridFunc(Self)的调用,可以做到事件共享了。我是这样实现的,如果有不合理的地方请各位指教。^_^
      

  5.   

    重写DBGrid,,让其响应WM_KeyPress等按键消息,并重载DefaultDrawColumnCell,然后当一个控件用就好了