我的KeyDown事件怎么了?(100分)

  • 主题发起人 主题发起人 Zephyr
  • 开始时间 开始时间
Z

Zephyr

Unregistered / Unconfirmed
GUEST, unregistred user!
我需要一个能产生KeyDown、KeyUp等事件的Panel控件,用以下代码:

type
TMyPanel = class(TCustomPanel)
public
property DockManager;
published
property Align;
property Alignment;
property Anchors;
property AutoSize;
property BevelInner;
property BevelOuter;
property BevelWidth;
property BiDiMode;
property BorderWidth;
property BorderStyle;
property Caption;
property Color;
property Constraints;
property Ctl3D;
property UseDockManager default True;
property DockSite;
property DragCursor;
property DragKind;
property DragMode;
property Enabled;
property FullRepaint;
property Font;
property Locked;
property ParentBiDiMode;
property ParentColor;
property ParentCtl3D;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ShowHint;
property TabOrder;
property TabStop;
property Visible;
property OnCanResize;
property OnClick;
property OnConstrainedResize;
property OnDockDrop;
property OnDockOver;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDock;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnGetSiteInfo;
property OnKeyDown; //比TPanel多了这几行
property OnKeyPress; //
property OnKeyUp; //
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnResize;
property OnStartDock;
property OnStartDrag;
property OnUnDock;
end;

Register后放置一个TMyPanel到窗体上,并设TabStop为True,但不知为什
么KeyDown事件就是没有产生,只有KeyUp事件。

哪位大侠能告诉我这是为什么?
谢谢。
 
Panel没是不能获取焦点的控件!焦点不在Panel上,怎么能捕获按键?
 
呵呵,不知道了吧?
 
重载它的消息处理,小心点捣
 
当我的窗体上有且只有一个TMyPanel控件,而没有任何其他控件时,输入焦点
应该是在TMyPanel上才对(因我已将它的TabStop设为True了)。
另外,我试过把窗体的KeyPreview设为True,然后在窗体的OnKeyDown事件中
用以下代码来判断:
procedure TForm1.FormKeyDown(Sender: TObject; ...);
begin
if (Shift = []) and (ActiveControl = MyPanel1) then
begin
...
end;
end;
奇怪的是,这个事件也没有发生,也是只有FormKeyUo事件产生,这好象不太对
嘛?
 

constructor TMyPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
TabStop := True; // This line is what your need.
end;
 
在panel上放一个可以接受keydown事件的控件然后调整一下视觉外观不就行了
 
to Croco: 还是不行。

难道只有重载消息处理才行吗?有没有简单一点的方法呢?
 
绝对没问题:
unit MyPanel;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls;

type
TMyPanel = class(TPanel)
public
constructor Create(AOwner: TComponent); override;
published
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Croco', [TMyPanel]);
end;

constructor TMyPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
TabStop := True; // This line is what your need.
end;

end.

测试通过:
procedure TForm1.MyPanel1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
MyPanel1.Caption := Chr(Key);
end;

请再试一试。
 
把Form的KeyPreview设置成True,接到KeyDown事件后给你的Panel发送消息
 
to Croco:
  不好意思,的确是可以截获大部分按键,但方向键不行,我试按键时
习惯按方向键,所以没动静。
 
接受答案了.
 
后退
顶部