4

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

我尝试了 Alt+Enter、Alt+Down、Alt+Right、Ctrl 和其他几个组合键,但它们都不起作用。VCL 源代码也没有说明这个问题(但是,嘿,“专业程序员不看 VCL 源代码”)

我错过了什么吗?

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

注意:我接受了 Andreas Rejbrand 的回答,因为它回答了这个问题。但我也添加了我自己的答案,以帮助那些可能对我实际实现的内容感兴趣的人。

4

3 回答 3

4

不,没有这样的键盘快捷键,部分(可能)是因为键盘快捷键应该执行的按钮(左键或右键)不明确。

我总是这样做:

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,否则它会闪烁太多。

于 2011-02-13T11:15:51.180 回答
3

我现在创建了一个如下所示的插入器类

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。

于 2011-02-13T13:35:33.690 回答
0

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

在模态对话框中,只要焦点控件不是按钮,您就可以按回车键,然后按下默认按钮并关闭表单。这是平台 UI 标准的一部分。对于转义和取消也是如此。许多其他控件具有标准键盘访问权限(列表、下拉列表、编辑等)

这不是标准控件,因此在编辑控件中强加某些默认键盘访问权限是错误的。设计人员可以添加访问权限,因为他们知道他们的表单上什么是合理的,但是 VCL 设计人员通过不包括适用于该控件的每个实例的默认行为来做到这一点。

于 2011-02-13T11:45:57.883 回答