在ActiveForm中的TMemo为什么不响应键盘上的方向键,而相同的OCX在VB中可以,怪!(200分)

  • 主题发起人 主题发起人 the3rd
  • 开始时间 开始时间
T

the3rd

Unregistered / Unconfirmed
GUEST, unregistred user!
在Delphi中使用包含TMemo的ActiveForm控件,为什么不响应键盘上的方向键,
而也是用Delphi编写的相同的ActiveForm在VB,IE等非Delphi编写的程序中
可以相应,怪!
是不是delphi封装ActiveX时生成的*_TLB.Pas的代码有问题?

这个问题好像以前有人提过,不过我看了半天没有找到答案,是不是历史遗留问题?
 
了了?

我发现Memo、Edit等控件可以相应方向键的KeyUp事件,但不相应KeyDown事件,
是没有收到KeyDown消息吗?

还是Delphi在使用这类activeForm时就把该消息屏蔽掉了?
 
delphi把ActiveForm当作一个控件来处理,
当ActiveForm里面有Memo等控件的时候,
ActiveForm并不处理CN_KeyDown(VCL control notification IDs)消息,
也就是说过滤掉了内含Vcl内部的KeyDown消息。
所以你的ActiveForm如果有Memo等控件,你需要自己给ActiveForm加上CN_KeyDown消息的处理。
比如说我的ActiveForm上有个Memo.
type
TForm1 = class(TForm)
Button1: TButton;
Actfrm: TActiveFormXdj;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
OldActfrmWndProc: TWndMethod;
procedure ActfrmWndProc(var msg: TMessage);Message CN_KEYDOWN;

end;

var
Form1: TForm1;
implementation

{$R *.DFM}

procedure TForm1.ActfrmWndProc(var msg: TMessage);
begin
if (Msg.wParam =VK_Left)or(Msg.wParam =VK_Return)or(Msg.wParam =VK_Up)or(Msg.wParam =VK_Right)or(Msg.wParam =VK_Down) then
begin

end
else
begin
Inherited;
OldActfrmWndProc(msg);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
OldActfrmWndProc := Actfrm.WindowProc;
Actfrm.windowProc := ActfrmWndProc;
end;
 
接受答案了.
 
后退
顶部