开发了个组件,部分代码如下:
type
  TSimpleQuery = class(Tpanel)
  .
  .
  .
constructor TSimpleQuery.Create(AOwner: TComponent);
begin
  inherited;
  QueryDataSource                := TDataSource.Create(Self);
  QueryClinetDataSet             := TClientDataSet.Create(self);
  QueryDataSource.DataSet        := QueryClinetDataSet;  QueryDBGrid                    := TDBGrid.Create(self);
  QueryDBGrid.Parent             := Self;
  QueryDBGrid.Align              := alClient;
  QueryDBGrid.Options            := [dgEditing, dgColumnResize, dgColLines, dgRowLines, dgTabs,      dgConfirmDelete, dgCancelOnExit];
  QueryDBGrid.OnDrawDataCell     := DrawDataCell;
  QueryDBGrid.DataSource         := QueryDataSource;
  QueryDBGrid.OnDrawColumnCell   := PlaneGridColumnCel;
  QueryDBGrid.Color              := clInfoBk;
  QueryDBGrid.OnCellClick        := QueryCellClick;  FSQNameColor                   := $00FFEFE1;
  FSQValueColor                  := clWhite;
  FSQBackGroundColor             := clWhite;
  FSQEditColor                   := clWhite;
  FSQDictColor                   := clWhite;
  FSQColumnNum                   := 2;  Self.FSQEditFont               := Tfont.Create;  QPGEdit                        := TtntDBEdit.Create(Self);
  QPGEdit.Parent                 := Self;
  QPGEdit.Visible                := False;
  QPGEdit.AutoSelect             := False;
  QPGEdit.DataSource             := QueryDataSource;
  QPGEdit.Color                  := FSQEditColor;  QPGEdit.OnKeyDown              := QueryEditKeyDown;
  QPGEdit.OnKeyPress             := QueryEditKeyPress;
  QPGEdit.OnKeyUp                := QueryEditKeyUp;
  QPGEdit.OnExit                 := QueryEditExit;
  QPGEdit.OnClick                := QueryEditClick;
  
  QTimer                         := TTimer.Create(self);
  QTimer.Enabled                 := True;
  QTimer.Interval                := 100;
  QTimer.OnTimer                 := TimerTimer;
  FSQPositionOfDict              := PoleftToRight;  QueryXMLDocument               := TXMLDocument.Create(self);
  SetSQColumnNum(2);
  self.OnResize                  := PlaneGridResize;
 end;开发后的组件画面如下:
而该组件的事件如下:
我现在要添加一个keydown事件,请问怎么添加?

解决方案 »

  1.   

    published 里加 property OnKeyDown;// 例如:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TMyPanel = Class(TPanel)
      published
        property OnKeyDown;
      end;
        
      TForm1 = class(TForm)
        procedure PanelKeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
        procedure FormCreate(Sender: TObject);
        procedure FormShow(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
          pnl: TMyPanel;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.PanelKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      (Sender as TPanel).Caption:= (Sender as TPanel).Caption + char(key);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      pnl:= TMyPanel.Create(nil);
      pnl.Parent:= Self;
      pnl.SetBounds(10,10,300,300);
      pnl.OnKeyDown:= PanelKeyDown;
    end;procedure TForm1.FormShow(Sender: TObject);
    begin
      pnl.SetFocus;
    end;end.
      

  2.   

    在你的组件中publishe地方发布一个property OnKeyDown;Panel,没有发布OnKeyDown事件,所以你继承过来后,默认是看不到的
      

  3.   

    需要繼承寫TPanel的property(在Publishe處)寫其OnKeyDown事件,然後在form的create或show事件時再用調用這個keydown事件即可
      

  4.   


    我这没有
    TForm1 = class(TForm)窗体的啊
      

  5.   

    竟然是ecjtuhr?有意思。莫非是我遗漏的马甲?
      

  6.   

    published
    property OnKeyDown;直接上面这样写就可以了  
    因为你已经集成了 Tpanel 
    而Tpanel有这个事件  
    默认是不能显示的  必须这样注册一次
      

  7.   

    代码太多了,我只按照网友的提示,帖了主要部分,主要是声明的部分,可是在我的贴图中事件部分还是看不到新增的方法。这样说吧,我还是把另外一个事件的部分代码贴出来吧,我想在下图的事件中增加一个AfterLastEditBox事件;
    部分代码如下:type
      TNotifyEventAfterLastEditBox = procedure(Sender: TObject) of object;
      type
        TSimpleQuery = class(Tpanel)
        private
         ...
         FAfterEditLastItem: TNotifyEventAfterLastEditBox;
         ...
         procedure SetAfterEditLastItem(
          const Value: TNotifyEventAfterLastEditBox);
         ...
        published
         ...
         property AfterEditLastItem: TNotifyEventAfterLastEditBox read      FAfterEditLastItem write SetAfterEditLastItem;
         ...
     end;下面是方法
    procedure TSimpleQuery.SetAfterEditLastItem(
      const Value: TNotifyEventAfterLastEditBox);
    begin
      FAfterEditLastItem := Value;
    end;请各位指教。谢谢。        published