我正准备用一个TButtonedEdit控件替换一个TEdit + TButton组合,但当我尝试测试它时,我发现无法使用键盘“按下”(右)按钮。
我尝试了Alt + Enter,Alt + Down,Alt + Right,使用Ctrl键相同的键以及其他几个键组合,但没有一个能够正常工作。 VCL消息来源也没有对这个问题有所了解(但是嘿嘿“专业程序员不看VCL来源”无论如何)
我错过了什么吗?
这是在Windows XP盒子上的Delphi 2010中,TButtonedEdit组件是在Delphi 2009 IIRC中引入的。
注意:我接受了Andreas Rejbrand的回答,因为它回答了这个问题。但是我也添加了自己的答案,以便那些可能对我实际实施的内容感兴趣的人受益。
答案 0 :(得分:3)
不,部分(可能)没有这样的键盘快捷键,因为键盘快捷键应该执行的按钮(左或右按钮)不明确。
我总是这样做:
procedure TForm1.ButtonedEdit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = VK_RETURN) and (ssCtrl in Shift) then
ButtonedEdit1RightButtonClick(Sender);
end;
如果按钮显示模式对话框(帮助用户填充编辑框)或类似的东西,则Ctrl + Enter快捷键非常自然。如果它改为执行将编辑文本作为参数的过程(例如,地址栏或搜索框),则单独输入更合适。如果按钮是一个清除按钮(清除编辑框),那么Escape可能是最好的快捷方式,或者可能根本没有快捷方式(然后没有默认快捷方式是好事)。
合适的快捷方式取决于具体情况,这也表明我认为应该没有默认的快捷方式。
顺便说一句,不要忘记制作TButtonedEdit
DoubleBuffered
,否则它会闪烁太多。
答案 1 :(得分:2)
我现在创建了一个interposer class,如下所示:
interface
{...}
type
TdzButtonedEdit = class(TButtonedEdit)
protected
procedure KeyDown(var _Key: Word; _Shift: TShiftState); override;
public
procedure Loaded; override;
end;
{...}
implementation
{...}
{ TdzButtonedEdit }
procedure TdzButtonedEdit.KeyDown(var _Key: Word; _Shift: TShiftState);
begin
inherited;
if (_Key = VK_RETURN) and (ssCtrl in _Shift) then
if Assigned(OnRightButtonClick) then
OnRightButtonClick(Self);
end;
procedure TdzButtonedEdit.Loaded;
begin
inherited;
if RightButton.Visible and (RightButton.Hint = '') then begin
RightButton.Hint := _('Ctrl+Return to ''click'' right button.');
ShowHint := true;
end;
end;
我在表单中使用声明:
TButtonedEdit = class(TdzButtonedEdit)
end;
在表单的类声明之前。
如果我感到困扰,我会把它变成一个完整的自定义组件。
顺便说一句:为什么Embarcadero将TEditButton.TGlyph严格私有化?这非常不方便,因为 通常我会调用RightButton.Glyph.Click而不是OnRightButtonClick。答案 2 :(得分:0)
鉴于没有办法将输入焦点传递给这些嵌入式按钮,并且假设它们显示字形,那么怎么会有键盘访问?用户将如何发现它?
在模态对话框中,您可以按Enter键,只要焦点控制不是按钮,则按下默认按钮并关闭表格。这是平台UI标准的一部分。同样适用于逃避和取消。许多其他控件具有标准键盘访问(列表,下拉菜单,编辑等)。
这不是标准控件,因此将某些默认键盘访问强制超出编辑控件中的预期是错误的。设计人员可以添加访问权限,因为他们知道表单上的内容是合理的,但VCL设计人员通过不包含适用于此控件的每个实例的默认行为来做到这一点。