Delphi TAction ShortCut不适用于子表单

时间:2014-01-28 15:38:11

标签: delphi delphi-7

我在Form2上有一个动作列表(actlst11),它位于主窗体的页面控件TTabSheet的运行时(如here)。

我为来自子Form2(Num +)的actZoomIn操作添加了一个快捷方式actlst11,但不幸的是它没有触发。操作连接到Form2上的位按钮。

主窗体触发操作的任何快捷方式,放置在标签页(Form2)上的页面控件内的子窗体的任何快捷方式都不会触发。

可能出现什么问题以及如何将快捷方式从主要形式转发到儿童形式或某些工作方式?

1 个答案:

答案 0 :(得分:3)

您描述的场景在现代Delphi中的效果如您所愿。 TCustomForm.IsShortCut的实施发生了变化。较旧的Delphi实现维护了每个表单的操作列表,并在IsShortCut中检查该列表。这意味着只检查与顶级表单关联的操作列表。在现代Delphi中,IsShortCut的实现遍历所有权层次结构。只要子表单最终由顶级表单拥有,那么将会找到子表单的操作列表。

对于您来说,最简单的解决方案可能是为顶级表单的OnShortcut事件实现事件处理程序。它看起来像这样:

procedure TTopLevelForm.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
  Handled := ChildForm.IsShortCut(Msg);
end;

如果您有多个子表单,那么您可能希望遍历所有表单,从而为每个表单提供处理快捷方式的机会。这可能是这样的:

procedure TTopLevelForm.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
var
  i: Integer;
begin
  for i := 0 to FChildForms.Count-1 do
  begin
    Handled := FChildForms[i].IsShortCut(Msg);
    if Handled then
      exit;
  end;
end;

显然,在此代码中,您维护FChildForms

如果您想实施与Embarcadero相同的解决方案,您可以走所有权层次结构。