Delphi如何实现baseclass事件?

时间:2015-07-23 10:15:40

标签: delphi inheritance keypress

我有一个抽象的Delphi XE表单,它充当我的应用程序中使用的一系列表单的基类。我试图找出制作帮助功能的最佳方法(在F1按键上),打开活动表格的维基页面。

我非常希望这个函数能够在基类级别实现,并在用户按下F1时调用,但我需要一些关于如何以智能方式执行此操作的建议。目前我只是在基本表单上放置一个KeyDown事件,但如果子表单接收到自己的KeyDown,则会被覆盖,此时我必须手动调用baseKeyDown。显然,这不是最优的。有没有办法确保我在基类级别捕获F1按键,无论是随机过载?

我在Windows 7上运行Delphi XE

2 个答案:

答案 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个事件

的KewDown方法的默认实现
procedure TWinControl.KeyDown(var Key: Word; Shift: TShiftState);
begin
  if Assigned(FOnKeyDown) then FOnKeyDown(Self, Key, Shift);
end;