Delphi如何实现基类事件?
我有一个抽象的Delphi XE表单,它作为应用程序中使用的一系列表单的基类。我正在试图找出最好的方法来创建一个帮助函数(在F1键上),为活动表单打开一个wiki页面 我非常希望这个函数在基类级别实现,并在用户按下F1键时调用,但我需要一些关于如何以智能方式执行此操作的建议。目前,我只是在基本窗体上放置了一个KeyDown事件,但如果子窗体接收到自己的KeyDown,则会覆盖该事件,此时我必须手动调用baseKeyDown。显然,这不是最优的。。有没有一种方法可以确保我在基类级别捕捉到F1按键,随机重载无法承受Delphi如何实现基类事件?,delphi,inheritance,keypress,Delphi,Inheritance,Keypress,我有一个抽象的Delphi XE表单,它作为应用程序中使用的一系列表单的基类。我正在试图找出最好的方法来创建一个帮助函数(在F1键上),为活动表单打开一个wiki页面 我非常希望这个函数在基类级别实现,并在用户按下F1键时调用,但我需要一些关于如何以智能方式执行此操作的建议。目前,我只是在基本窗体上放置了一个KeyDown事件,但如果子窗体接收到自己的KeyDown,则会覆盖该事件,此时我必须手动调用baseKeyDown。显然,这不是最优的。。有没有一种方法可以确保我在基类级别捕捉到F1按键,
我正在Windows 7上运行Delphi XE您应该在基本表单类中重写
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;
您应该重写基本表单类中的
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;
您应该重写基本表单类中的
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;
您应该重写基本表单类中的
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;
对您的问题的直接回答是,库编写器不应分配给事件处理程序。这是因为这样做会使库消费者很难同时使用这些事件。当您编写基类时,您将扮演库作者的角色 因此,与其在
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
事件,并将集中逻辑放在那里 对您的问题的直接回答是,库编写器不应分配给事件处理程序。这是因为这样做会使库消费者很难同时使用这些事件。当您编写基类时,您将扮演库作者的角色
因此,与其在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
事件,并将集中逻辑放在那里 对您的问题的直接回答是,库编写器不应分配给事件处理程序。这是因为这样做会使库消费者很难同时使用这些事件。当您编写基类时,您将扮演库作者的角色
因此,与其在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
事件,并将集中逻辑放在那里 对您的问题的直接回答是,库编写器不应分配给事件处理程序。这是因为这样做会使库消费者很难同时使用这些事件。当您编写基类时,您将扮演库作者的角色
因此,与其在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
事件,并将集中逻辑放在那里 我同意大卫的观点。你应该改用内置的帮助系统。无法使子窗体触发onHelp,这就是我首先选择KeyDown的原因。。我发现了什么地方出了问题,所以我回到了应用程序上。。很抱歉发布xy问题:(答案可能对有类似问题的人有用,因此我将保留问题,我同意David的观点。你应该使用内置帮助系统。是的。无法使子窗体触发onHelp,这就是我首先选择KeyDown的原因。。我发现了问题所在,因此我回到了应用程序上。onHelp道路。。很抱歉发布xy问题:(答案可能对有类似问题的人有用,因此我将保留问题,我同意David的观点。你应该使用内置帮助系统。是的。无法使子窗体触发onHelp,这就是我首先选择KeyDown的原因。。我发现了问题所在,因此我回到了应用程序上。onHelp道路。。很抱歉发布xy问题:(答案可能对有类似问题的人有用,因此我将保留问题,我同意David的观点。你应该使用内置帮助系统。是的。无法使子窗体触发onHelp,这就是我首先选择KeyDown的原因。。我发现了问题所在,因此我回到了应用程序上。onHelp道路。。很抱歉发布xy问题:(答案可能对有类似问题的人有用,因此我将保留问题