2011-02-13 106 views
4

我正要用一个TButtonedEdit控件替换TEdit + TButton组合,但是当我尝试测试它时,我发现无法“按下”(右)按钮键盘。使用键盘“按下”TButtonedEdit按钮使用键盘

我尝试了Alt + Enter,Alt + Down,Alt + Right,与Ctrl和其他几个组合键相同的按键,但都没有工作。 VCL的资料也没有说明这个问题(但嘿,“专业程序员不会看VCL资源”)

我错过了什么吗?

这是在Windows XP的Delphi 2010上,TButtonedEdit组件在Delphi 2009 IIRC中引入的。

注意:我接受了Andreas Rejbrand的回答,因为它回答了问题。但我也为自己实际上可能感兴趣的人的利益添加了自己的答案。

+3

专业程序员广泛研究RTL/VCL源代码。 – 2011-02-13 11:32:02

+1

@安德里亚斯:是的,我知道,我当然可以。这仅仅是指英巴卡迪诺评论不包括新入门级德尔福版本的RTL/VCL源代码。 – dummzeuch 2011-02-13 12:48:00

回答

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可能是最好的快捷方式,或者根本没有快捷方式(然后没有默认快捷方式是件好事)。

事实上,适当的捷径取决于情况也表明,应该没有默认的捷径,我想。

顺便说一下,不要忘记使TButtonedEditDoubleBuffered,否则它会闪烁太多。

+0

当然,使用`DoubleBuffered`可能导致某些主题(如Windows Basic)中的绘画损坏。而闪烁来自哪里,我没有看到它。 – 2011-02-13 11:46:57

+1

@大卫:快速移动鼠标穿过控件(这样鼠标有时在控件之上,而在其他时间在控件之外)。位图将闪烁。 – 2011-02-13 11:48:08

0

鉴于没有办法将输入焦点传递给这些嵌入式按钮,并且假设它们显示字形,怎么会有键盘访问?用户如何发现它?

在模式对话框中,您可以按回车键,只要焦点控件不是按钮,则默认按钮被按下,表单关闭。这是平台UI标准的一部分。同样用于转义和取消。许多其他控件具有标准键盘访问(列表,下拉列表,编辑等)

这不是一个标准控件,因此将某些默认键盘访问强加到编辑控件所期望的范围之外是错误的。设计师可以添加访问权限,因为他们知道他们的表单上有什么合理的内容,但是VCL设计人员通过不包括适用于此控件的每个实例的默认行为来解决问题。

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; 

形式的类声明之前。

如果我可以被打扰,我会让它成为一个完整的自定义组件。

btw:为什么Embarcadero使TEditButton.TGlyph严格私密?这很不方便,因为 通常我会调用RightButton.Glyph.Click而不是OnRightButtonClick。