4

TEdit + TButton の組み合わせを 1 つの TButtonedEdit コントロールに置き換えようとしましたが、テストしようとしたときに、キーボードを使用して (右) ボタンを「押す」方法が見つかりませんでした。

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 ショートカットは、ボタンがモーダル ダイアログ (ユーザーが編集ボックスに入力するのに役立ちます) などを表示する場合、非常に自然です。代わりに、編集テキストを引数として受け取る手順 (アドレス バーや検索ボックスなど) を実行する場合は、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 を厳密に非公開にしたのはなぜですか? 通常は OnRightButtonClick ではなく RightButton.Glyph.Click を呼び出すので、これは非常に不便です。

于 2011-02-13T13:35:33.690 に答える
0

これらの埋め込みボタンに入力フォーカスを渡す方法がなく、それらがグリフを表示することを考えると、どのようにキーボード アクセスが可能でしょうか? ユーザーはどのようにそれを発見しますか?

モーダル ダイアログで Enter キーを押すと、フォーカス コントロールがボタンでない限り、デフォルトのボタンが押されてフォームが閉じます。これは、プラットフォーム UI 標準の一部です。エスケープとキャンセルも同様です。他の多くのコントロールには、標準のキーボード アクセスがあります (リスト、ドロップダウン、編集など)。

これは標準のコントロールではないため、エディット コントロールで想定される以上のデフォルトのキーボード アクセスを強制するのは正しくありません。設計者はフォーム上で何が合理的かを知っているため、アクセスを追加することは問題ありませんが、VCL 設計者は、このコントロールのすべてのインスタンスに適用される既定の動作を含めないことでそれを正しく理解しました..

于 2011-02-13T11:45:57.883 に答える