Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi如何实现基类事件?_Delphi_Inheritance_Keypress - Fatal编程技术网

Delphi如何实现基类事件?

Delphi如何实现基类事件?,delphi,inheritance,keypress,Delphi,Inheritance,Keypress,我有一个抽象的Delphi XE表单,它作为应用程序中使用的一系列表单的基类。我正在试图找出最好的方法来创建一个帮助函数(在F1键上),为活动表单打开一个wiki页面 我非常希望这个函数在基类级别实现,并在用户按下F1键时调用,但我需要一些关于如何以智能方式执行此操作的建议。目前,我只是在基本窗体上放置了一个KeyDown事件,但如果子窗体接收到自己的KeyDown,则会覆盖该事件,此时我必须手动调用baseKeyDown。显然,这不是最优的。。有没有一种方法可以确保我在基类级别捕捉到F1按键,

我有一个抽象的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问题:(答案可能对有类似问题的人有用,因此我将保留问题