2013-02-16 87 views
0

是这个错误还是我错过了某些东西?无法在编辑的keydown上显示消息

这是编写的代码在Delphi XE2,但它不能在XE3工作...

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; 
    Shift: TShiftState); 
begin 

    if Key = VK_ESCAPE then //works when I press ESC! 
    ShowMessage('escape'); 

    if Key = VK_RETURN then 
    ShowMessage('enter'); //doesn't work when I press ENTER! 
end; 
+2

上面显示的代码*应该*工作。它在德尔福2009年的作品,我敢打赌,它仍然在德尔福XE3的作品。您的特定项目中还有其他问题,这在上面没有显示。当然,如果你创建一个新的,空的VCL项目,添加一个'TEdit'并插入上面的代码,那么它将工作。 – 2013-02-16 15:06:48

+4

如果窗体上有一个默认属性设置为true的按钮,则回车键将指向该按钮。 – 2013-02-16 15:18:45

+1

@LU RD就是这样,我没有检查表单的默认属性,它现在可以工作,谢谢! – 2013-02-16 15:31:31

回答

6

ENTER键被认为是“关键对话”;它可以,例如,激活窗体上的默认按钮。这不是一个错误,它只是事情的方式。如果您希望TEdit收到ENTER密钥,则需要将其继承以便处理WM_GETDLGCODE并说您想要收到ENTER密钥。你需要做这样的事情:

procedure TYourEditSubclass.WMGetDlgCode(var Message: TWMGetDlgCode); 
begin 
    Message.Result := DLGC_WANTALLKEYS; 
end; 

另外,您可以在表单启用KeyPreview和使用它的键盘事件。当您收到Enter键时,测试Edit是否有焦点。像这样的东西可以工作:

procedure TForm6.FormKeyDown(Sender: TObject; var Key: Word; 
    Shift: TShiftState); 
begin 
    if (Key = VK_RETURN) and (Edit1.Focused) then 
    ShowMessage('enter'); 
end;