有时,表单上的按键可以有不同的配方,具体取决于应用程序的状态。请参阅以下示例:
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和操作的舒适度,而不必须重新实现我使用的所有组件的密钥处理?
答案 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;
由于所有控件的行为都不同,控件本身决定了他们感兴趣的键,我无法看到如何修复它而不必更改不需要的行为。