【问题标题】:Passing Arrow and Tab keys to Delphi Form in a DLL在 DLL 中将箭头键和 Tab 键传递给 Delphi 表单
【发布时间】:2011-09-27 05:50:20
【问题描述】:

当在 DLL 中声明和实例化 Delphi 表单并且 DLL 由宿主应用程序加载时,箭头键和 Tab 键不会越过宿主/DLL 边界。这意味着可能在表单上使用的 TEdit 框和 TMemo 控件将不会响应这些击键。有没有办法确保这些击键从主应用程序表单传递到 dll 中的表单?请注意,可能有多个 DLL,每个 DLL 都包含一个表单。 KeyPreview 没有区别。

【问题讨论】:

    标签: delphi


    【解决方案1】:

    看看这个问题和你之前的问题,我想说你的基本问题是你没有使用运行时包。

    如果您使用的是运行时包,那么您将拥有一个 VCL 实例,并且模块边界无关紧要。

    如果没有运行时包,您将拥有单独的 VCL 实例。要使 VCL 表单导航正常工作,您需要将每个控件识别为 VCL 控件。当您有多个 VCL 实例时,这是不可能的。

    【讨论】:

    • 这是我考虑过的,可能会再次考虑。我唯一担心的是,如果我们升级到新的 Delphi 版本,必须重新编译包。
    【解决方案2】:

    DLL 中的表单缺少这种支持,以及对菜单快捷方式(操作)的支持。您可以编写一些代码来模拟这种行为。

    ////////////////////////////////////////////////////////////////
    // If you display a form from inside a DLL/COM server, you will miss
    // the automatic navigation between the controls with the "TAB" key.
    // The "KeyPreview" property of the form has to be set to "True".
    procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
    var
      bShift: Boolean;
    begin
      // Check for tab key and switch focus to next or previous control.
      // Handle this in the KeyPress event, to avoid a messagebeep.
      if (Ord(Key) = VK_TAB) then
      begin
        bShift := Hi(GetKeyState(VK_SHIFT)) <> 0;
        SelectNext(ActiveControl, not(bShift), True);
        Key := #0; // mark as handled
      end;
    end;
    

    【讨论】:

    • 方向键和其他导航键呢?
    • @David Heffernan - 箭头键在控件内部使用时应该可以工作,尽管它们通常不用于控件之间的导航。操作和菜单的快捷方式可以用类似的方式实现,如果有人想要示例,我可以提供链接。
    • 箭头通常用于控件之间的导航。当然单个 VCL 是最好的。
    • 箭头键可用于导航,但您必须自己编写代码(这不是 Windows 标准行为)。您为捕获箭头键而编写的相同代码应该可以在 dll 中使用。
    • 不,箭头非常标准。 VCL 实现方向键导航。
    猜你喜欢
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 2012-04-13
    • 2012-01-27
    • 2012-01-28
    • 1970-01-01
    相关资源
    最近更新 更多