在父窗体和子控件之间分配按键

时间:2010-03-09 17:02:55

标签: delphi keyboard-shortcuts vcl

有时,表单上的按键可以有不同的配方,具体取决于应用程序的状态。请参阅以下示例:

unit Unit1;

interface

uses
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  ComCtrls,
  Buttons;

type
  TForm1 = class(TForm)
  private
    ListView1: TListView;
    ButtonOK: TBitBtn;
    ButtonCancel: TBitBtn;
    procedure ButtonClick(Sender: TObject);
  public
    constructor Create(AOwner: TComponent); override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TForm1.Create(AOwner: TComponent);
begin
  inherited CreateNew(AOwner);
  ClientWidth := 300;
  ClientHeight := 240;

  ListView1 := TListView.Create(Self);
  ListView1.Name := 'ListView1';
  ListView1.Parent := Self;
  ListView1.Height := 200;
  ListView1.Align := alTop;
  ListView1.AddItem('aaaaa', nil);
  ListView1.AddItem('bbbbb', nil);
  ListView1.AddItem('ccccc', nil);

  ButtonOK := TBitBtn.Create(Self);
  ButtonOK.Parent := Self;
  ButtonOK.Left := 8;
  ButtonOK.Top := 208;
  ButtonOK.Kind := bkOK;
  ButtonOK.OnClick := ButtonClick;

  ButtonCancel := TBitBtn.Create(Self);
  ButtonCancel.Parent := Self;
  ButtonCancel.Left := 90;
  ButtonCancel.Top := 208;
  ButtonCancel.Kind := bkCancel;
  ButtonCancel.OnClick := ButtonClick;
end;

procedure TForm1.ButtonClick(Sender: TObject);
begin
  ShowMessage((Sender as TBitBtn).Caption);
  Application.Terminate;
end;

end.

(要运行此操作,请创建一个标准的VCL应用程序,并将Unit1.pas的内容替换为上述内容。)

如果有人启动应用程序并按 Enter Esc ,则会“点击”相应的按钮。但是当一个人开始编辑列表视图时(通过点击一个项目的一半时间)输入并且 Esc 应该接受或取消他们没有的编辑 - 他们仍然“点击”按钮。

如果在包含cxGrid的表单上具有快捷键 F2 F4 的操作,则存在类似的情况,默认情况下使用这些快捷键启动编辑模式或下拉组合框编辑器。

您是否知道如何继续使用TButton.Default / Cancel和操作的舒适度,而必须重新实现我使用的所有组件的密钥处理?

1 个答案:

答案 0 :(得分:2)

我猜你使用的控件运气不好。 TMemo正确处理它,但实际上可编辑的TListView没有。 problem seems to originate from win32而不是VCL包装器。因此,如果你不喜欢它当前的行为,你必须重新实现TListView上的键处理。

procedure WMGetDlgCode(var Message: TMessage); message WM_GETDLGCODE;

procedure TMyListView.WMGetDlgCode(var Message: TMessage);
begin
  inherited;

  if IsEditing then
    Message.Result := Message.Result or DLGC_WANTALLKEYS;
end;

由于所有控件的行为都不同,控件本身决定了他们感兴趣的键,我无法看到如何修复它而不必更改不需要的行为。