我自已做了一个控件,想让其响应键盘事件,可是却不行,我不知道还有哪里没有设置,谁帮帮我,以下是声明部分代码type
  TMyImage = class(TCustomPanel)
  private
    FPicture:TPicture;
    procedure Setpicture(const Value: TPicture);
    procedure WMSize(var Msg: TWMSize); message WM_SIZE;
  protected
    procedure Paint; override;
    { Protected declarations }
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property picture:TPicture read Fpicture write Setpicture;
    property onKeyDown;
    property OnKeyUp;
    property OnClick;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property Visible;
  end;

解决方案 »

  1.   

    type
      TMyImage = class(TCustomPanel)
      private 
      property OnKeyDown: TKeyEvent read FOnKeyDown write FOnKeyDown;
      property OnKeyPress: TKeyPressEvent read FOnKeyPress write FOnKeyPress;
      property OnKeyUp: TKeyEvent read FOnKeyUp write FOnKeyUp;
    。。
      

  2.   

    type
      TMyPanel = class(TCustomPanel)
    ...
      Public
      property OnKeyDown: TKeyEvent read FOnKeyDown write FOnKeyDown;
      property OnKeyPress: TKeyPressEvent read FOnKeyPress write FOnKeyPress;
      property OnKeyUp: TKeyEvent read FOnKeyUp write FOnKeyUp;
    ...
    End;type
      TMyImage = class(TMyPanel)
      private
        FPicture:TPicture;
        procedure Setpicture(const Value: TPicture);
        procedure WMSize(var Msg: TWMSize); message WM_SIZE;
      protected
        procedure Paint; override;
        { Protected declarations }
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      published
        property picture:TPicture read Fpicture write Setpicture;
        property onKeyDown;
        property OnKeyUp;
        property OnClick;
        property OnMouseDown;
        property OnMouseMove;
        property OnMouseUp;
        property Visible;
      end;
      

  3.   

    楼上的,你测试过吗,继承的属性是可以省略read和write的
      

  4.   

    今天又做一些调试,要让键盘事件起作用,必须先获得焦点,但其它键可以,最重要的方向键却没法控件,我把TabStop设为false,也不管用,具体代码如下:
    控件声明部分如下:type
      TMyImage = class(TCustomPanel)
      private
        FPicture:TPicture;
        procedure Setpicture(const Value: TPicture);
        procedure WMSize(var Msg: TWMSize); message WM_SIZE;
      protected
        procedure Paint; override;
        { Protected declarations }
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      published
        property picture:TPicture read Fpicture write Setpicture;
        property OnClick;
        property OnKeyDown;
        property OnKeyUp;
        property OnMouseDown;
        property OnMouseMove;
        property OnMouseUp;
        property Visible;
        property TabStop;//添加了这个属性
      end;测试代码如下:procedure TForm1.MyImage1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    var
      s:string;
    begin
       s:='OnKeyDown:Key='+inttostr(Key);;
       Edit1.Text:=s; //其它键可以,但就是方向键和Tab键不起作用,只要一按下它们就转换焦点到其它控件上了
    end;procedure TForm1.MyImage1Click(Sender: TObject);
    begin
      MyImage1.SetFocus;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      MyImage1.TabStop:=false;  //设为false也没屏幕掉方向键和Tab键
    end;
      

  5.   

    控件响应键盘消息先要有交点.
    另外如果要处理Tab和方向键有两种方法
    A.处理WM_GETDLGCODE消息.
      Inherited;
      Message.Result := Message.Result or DLGC_WANTTAB or DLGC_WANTARROWS;
    B.可以处理CN_KeyDown和CN_KeyUp消息.
      

  6.   

    焦点我是有了,看代码
    procedure TForm1.MyImage1Click(Sender: TObject);
    begin
      MyImage1.SetFocus;
    end;A.处理WM_GETDLGCODE消息.
      Inherited;
      Message.Result := Message.Result or DLGC_WANTTAB or DLGC_WANTARROWS;
    我给我具体点好吗,这个在哪儿用