我有一个抽象的Delphi XE表单,它充当我的应用程序中使用的一系列表单的基类。我试图找出制作帮助功能的最佳方法(在F1按键上),打开活动表格的维基页面。
我非常希望这个函数能够在基类级别实现,并在用户按下F1时调用,但我需要一些关于如何以智能方式执行此操作的建议。目前我只是在基本表单上放置一个KeyDown事件,但如果子表单接收到自己的KeyDown,则会被覆盖,此时我必须手动调用baseKeyDown。显然,这不是最优的。有没有办法确保我在基类级别捕获F1按键,无论是随机过载?
我在Windows 7上运行Delphi XE
答案 0 :(得分:2)
您的问题的直接答案是图书馆作家不应该分配给事件处理程序。这是因为这样做会使图书馆消费者也难以消费这些事件。当您编写基类时,您将担任库作者的角色。
因此,不是在OnKeyDown
事件中实现处理程序,而是覆盖KeyDown
方法。
type
TBaseForm = class(TForm)
protected
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
end;
....
procedure TBaseForm.KeyDown(var Key: Word; Shift: TShiftState);
begin
inherited; // this will fire the OnKeyDown event
// your processing for F1 goes here
end;
但是,我想知道你是否会更好地使用内置的帮助系统。我个人会为OnHelp
对象添加一个Application
事件,并将集中逻辑放在那里。
答案 1 :(得分:1)
您应该在基本表单类中覆盖KeyDown
方法。
type
TBaseForm = class(TForm)
protected
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
end;
procedure TBaseForm.KeyDown(var Key: Word; Shift: TShiftState);
begin
// do your processing here
// ...
inherited; // call inherited method that will call OnKeyDown if assigned
end;
这是调用OnKeyDown
个事件
procedure TWinControl.KeyDown(var Key: Word; Shift: TShiftState);
begin
if Assigned(FOnKeyDown) then FOnKeyDown(Self, Key, Shift);
end;