«нажатие» кнопки TButtonedEdit с помощью клавиатуры - PullRequest
4 голосов
/ 13 февраля 2011

Я как раз собирался заменить комбинацию TEdit + TButton одним элементом управления TButtonedEdit, но когда я попытался протестировать его, я не нашел способа «нажать» (правую) кнопку с помощью клавиатуры.

Iпробовал Alt + Enter, Alt + Down, Alt + Right, те же клавиши с Ctrl и еще несколько комбинаций клавиш, но ни одна из них не работала.Источники VCL также не пролили свет на эту проблему (но, в любом случае, «профессиональные программисты не смотрят на источники VCL»)

Я что-то упустил?

Это с Delphi2010 на Windows XP, компонент TButtonedEdit был представлен в Delphi 2009 IIRC.

Примечание: я принял ответ Андреаса Рейбранда, потому что он отвечает на вопрос.Но я также добавил свой собственный ответ для тех, кому может быть интересно то, что я на самом деле реализовал.

Ответы [ 3 ]

3 голосов
/ 13 февраля 2011

Нет, такого сочетания клавиш нет, отчасти (возможно) из-за неоднозначности, при которой кнопка (левая или правая кнопка) должна запускать комбинацию клавиш.

Я всегда так делаю:

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 очень естественно, если кнопка отображает модальное диалоговое окно (которое помогает пользователю заполнить поле редактирования) или что-то подобное. Если вместо этого он выполняет процедуру, принимающую текст редактирования в качестве аргумента (например, адресную строку или окно поиска), более подходящим является только Enter. Если кнопка является кнопкой очистки (которая очищает поле редактирования), то Escape может быть лучшим ярлыком или, возможно, ярлыком вообще не является (и тогда хорошо, что ярлыка по умолчанию нет).

Тот факт, что подходящий ярлык зависит от ситуации, также указывает на то, что ярлыка по умолчанию не должно быть, я думаю.

Кстати, не забудьте сделать TButtonedEdit DoubleBuffered, иначе он будет слишком сильно мерцать.

2 голосов
/ 13 февраля 2011

Я создал класс interposer , который выглядит следующим образом:

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.

0 голосов
/ 13 февраля 2011

Учитывая, что нет способа передать фокус ввода на эти встроенные кнопки, и учитывая, что они отображают глифы, как может быть доступ к клавиатуре?Как пользователь обнаружит это?

В модальном диалоговом окне вы можете нажать клавишу ввода, и пока элемент управления фокусировкой не является кнопкой, тогда кнопка по умолчанию нажата и форма закрывается.Это часть стандарта пользовательского интерфейса платформы.Аналогично для побега и отмены.Многие другие элементы управления имеют стандартный доступ с клавиатуры (списки, раскрывающиеся списки, изменения и т.Это нормально для дизайнера, чтобы добавить доступ, потому что они знают, что является разумным в их форме, но дизайнеры VCL сделали это правильно, не включив поведение по умолчанию, которое будет применяться к каждому экземпляру этого элемента управления ..

...