我正在尝试做一个应用程序,可以从键盘上读取按键。当我按下一个键时,程序会将其添加到一个数组中,然后我做我想做的事情。我不是在编辑控件中编写。我直接按键盘上的按钮,因为我希望能够使用其他输入,如阅读器,模拟键盘输入。
现在我添加了一个组合框和单选按钮,我打算在将来添加新的东西。我添加组件后再次尝试应用程序,程序不再读取键,因为它试图在组合框内写入。如果我按组合框外,或选择一个选项,什么也没有发生,它继续尝试在其中写入。
如果我按下单选按钮,程序不再尝试在组合框中写入,但它仍然不从键盘读取键,可能是因为现在的焦点在单选按钮上。
如果我把组合框属性设置为Enabled := false
,并且我没有按单选按钮,那么它又可以工作了。
我认为问题在于程序的“焦点”在组件上。我查看了组件的属性,但我没有看到任何可以帮助的属性。
有没有一种方法可以让组件的代码或属性不成为程序的焦点?我使用TRadioButton
,TComboBox
或TAdvComboBox
。
我使用FormKeyDown
事件来获取密钥信息。
程序
TfrmConfigCheck.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
end;
字符串
2条答案
按热度按时间vmpqdwk31#
您需要将窗体上的
KeyPreview
属性设置为True
。如果
KeyPreview
设置为False
,则当某些组件(如TComboBox
)具有焦点时,不会调用窗体的onKeyDown
事件。但如果将
KeyPreview
属性设置为True
,则无论窗体上关注的组件是什么,每次按下键时都会调用窗体的onKeyDown
事件。关于你在评论中的其他问题,你不能将
TComboBox
设置为readonly
,但你可以将style
属性设置为csDropDownList
,这是一种readonly
模式,因为用户不能输入任何细节。9bfwbjaz2#
在您的应用程序表单事件
TForm.OnShow
下放置Form1.SetFocus
;您可以在任何控件的onClick
,onEnter
等下执行此操作以将焦点返回到表单。