gpt4 book ai didi

delphi - 快捷方式在第一个创建的表单而不是具有焦点的表单上触发 TAction

转载 作者:行者123 更新时间:2023-12-03 18:47:10 25 4
gpt4 key购买 nike

我发现(在 Delphi 2010 中)快捷方式总是以具有该操作的第一个窗体(由主窗体拥有)结束,而不是当前聚焦的窗体。我的 TMainFrm 拥有多个 TViewFrm。每个都有一个 TActionManager 和相同的 TActons

我看到了一些出路,但想知道什么是最好的解决办法..(而且不是一个糟糕的黑客)

  • 表单使用调用其 Hide() 和 Show() 的选项卡集进行导航。我没想到隐藏的表格会收到按键。我做错了什么吗?
  • 似乎操作快捷方式总是从主窗体开始,并使用 TCustomForm.IsShortCut() 分发到拥有的窗体。我看不到尊重隐藏窗口的逻辑,我应该覆盖它并让它首先触发聚焦表单吗?
  • 禁用 TViewFrm.Hide() 中的所有 TActions .. ?
  • TActionToolBar 移动到 TMainFrm 但这是蛇坑和最后的手段。

最佳答案

我找到了一个对我来说足够好的解决方法;我的主窗体现在覆盖 TCustomForm.IsShortcut() 并首先从我的编辑器选项卡列表中检查可见窗口。

我已经有了方便的列表,所以这可能不适合所有人。

// Override TCustomForm and make it check the currently focused tab/window first.
function TFormMain.IsShortCut(var Message: TWMKey): Boolean;
function DispatchShortCut(const Owner: TComponent) : Boolean; // copied function unchanged
var
I: Integer;
Component: TComponent;
begin
Result := False;
{ Dispatch to all children }
for I := 0 to Owner.ComponentCount - 1 do
begin
Component := Owner.Components[I];
if Component is TCustomActionList then
begin
if TCustomActionList(Component).IsShortCut(Message) then
begin
Result := True;
Exit;
end
end
else
begin
Result := DispatchShortCut(Component);
if Result then
Break;
end
end;
end;
var
form : TForm;
begin
Result := False;

// Check my menu
Result := Result or (Menu <> nil) and (Menu.WindowHandle <> 0) and
Menu.IsShortCut(Message);

// Check currently focused form <------------------- (the fix)
for form in FEditorTabs do
if form.Visible then
begin
Result := DispatchShortCut(form);
if Result then Break;
end;
// ^ wont work using GetActiveWindow() because it always returns Self.

// Check all owned components/forms (the normal behaviour)
if not Result then
Result := inherited IsShortCut(Message);
end;

另一种解决方案是更改 DispatchShortCut() 以检查组件是否可见和/或已启用,但这可能会产生比我希望的更大的影响。我想知道最初的代码架构师是否有理由不这样做——是设计使然。最好让它调用两次:第一次优先考虑可见+启用的组件,第二次调用作为正常行为的回退。

关于delphi - 快捷方式在第一个创建的表单而不是具有焦点的表单上触发 TAction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27781237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com