我自己做了一个DBGrid组件叫MyDBGrid,然后我想将我的代码加入到OnDrawDataCell事件中,这样我一用这个组件时就能达到我的目标。但我发现当我重载OnDrawDataCell函数,虽然能达到我的目标,但是组件在窗体中如果再次使用OnDrawDataCell却发现窗体中的事件不能执行了。请问一下,如果我想将的的代理加入我的自定义MyDBGrid组件中,应该怎样做呢

解决方案 »

  1.   

    我的代码
      TMyDBGrid = class(TDBGrid)
      protected
        { Protected declarations }
        procedure DrawDataCell(const Rect: TRect; Field: TField; State: TGridDrawState);override;//这个事件
      end;
    procedure TMyDBGrid.DrawDataCell(const Rect: TRect; Field: TField; State: TGridDrawState);
    begin
       ...
    end;
    上面的代码实现组件后,放入Form中就能实现我的目标。
    但如果在Form中MyDBGrid的OnDrawDataCell事件却不执行了
      

  2.   

    显然
    应该override消息事件吧,而不是这个
      

  3.   

    能不能说详细些,是override那个消息事件,叫什么名
      

  4.   

    override该事件就可以了,别忘记inherited;执行父类的代码
      

  5.   

    你先inherited,然后再执行自己的代码,否则,你要处理它原来的消息.
      

  6.   

    终于明白了,就是没执行inherited,多谢几位。
      

  7.   

    没看到你的代码,不好说,不过应该没有大问题,可能是对一些机制还不熟悉的原因,简单给你写了一个例子,是TPANEL的MouseDown。unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids, ExtCtrls;type
      tmypanel=class(tpanel)
         public
          procedure MouseDown( Button: TMouseButton;Shift: TShiftState; X, Y: Integer);override;
      end;
      TForm1 = class(TForm)
        Edit1: TEdit;
        Edit2: TEdit;
        Button1: TButton;
        ADOQuery1: TADOQuery;
        Panel1: TPanel;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        procedure Mymousedown( Sender: TObject;Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      p : tmypanel;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);//测试代码
    begin  p := tmypanel.Create(nil);
      p.OnMouseDown := Mymousedown;
      p.Parent := Form1;
      p.Left := 400;
      p.Top := 300;end;{ tmypanel }procedure tmypanel.MouseDown( Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin  Self.Caption := Format('x:%d;y:%d',[x,y]) ;//你把inherited放到前面和后面,你看看效果
      inherited;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
       p.Free;
    end;procedure TForm1.Mymousedown(Sender: TObject;Button: TMouseButton; Shift: TShiftState; X,
      Y: Integer);
    begin
      (sender as TPanel).Caption := 'fuck you';
     // ShowMessage(Format('x:%d;y:%d',[x,y]));//当inherited放在前面的时候,你把我屏蔽的这一句去掉试试效果。
    end;end.