【问题标题】:PopupMenu does not show when in DLLPopupMenu 在 DLL 中时不显示
【发布时间】:2014-07-05 12:27:49
【问题描述】:

我正在为 Lazarus 1.2.4/FreePascal 2.6.4 中的“PL/SQL Developer”IDE(来自 Allround Automations)开发一个插件。该插件是一个 x86 DLL。

到目前为止,一切都运行良好,除了一件事。这是设置:

  • 我有一个TForm,上面有一个TTreeView 和一个TPopupMenu 组件。
  • TPopupMenu 组件分配给TTreeView.PopupMenu 属性。
  • TPopupMenu 组件创建了非零菜单项,并设置了属性AutoPopup := trueTrackButton := tbRightButton

这就是问题所在... 当窗体在运行时显示并右键单击树视图时:

  • 弹出菜单不可见。
  • 然而,弹出菜单的OnPopup 事件被执行。

我尝试以简约的方式执行此操作 - 一个只有一个导出的 DLL,它使用树视图和弹出菜单生成表单,然后运行 ​​proc。通过 Win 的rundll32.exe。相同的结果 - 没有弹出菜单。

如果我在独立的 Win 应用程序中尝试相同的设置(form+treeview+popupmenu),它可以正常工作 - 弹出菜单出现。

有什么帮助吗?

可能与它相关,也可能不相关: PL/SQL Developer 捆绑的“plugin demo 2 / Delphi”分配了Application.Handle := IDE_GetAppHandle;IDE_GetAppHandle 是 PLSQL Developer IDE 的回调函数),这是我在 FPC 中无法做到的,因为TApplication类没有Handle 属性。

这方面也有帮助吗?

【问题讨论】:

    标签: dll freepascal lazarus


    【解决方案1】:

    在 FreePascal+Lazarus 论坛上找到解决方案:http://forum.lazarus.freepascal.org/index.php/topic,24135.msg144938.html#msg144938

    摘录:这是 LCL 中的一个错误。但由于 LCL 源是与 FPC+Lazarus 一起分发的,您可以自己修补 LCL:

    • 编辑${lazarus-install-folder}/lcl/interfaces/win32/win32obj
    • 查找TWin32WidgetSet.AppInit 过程定义。
    • 在过程中找到对CreateAppHandle(注释为// Create parent of all windows, 'button on taskbar')的调用。
    • 将呼叫从if not IsLibrary then 内部向上移动到CreateAppHandle,紧接在if 之前。
    • 保存、编译、构建……完成。

    显然,它Application.Handle 问题有关。

    【讨论】:

    • (小细节是 LCL,不是 FCL。FCL 是像 custapp 这样的单位)
    • 作为 Oracle 开发人员,我不区分其组件/单元库的不同风格;对我来说,这只是一堆帕斯卡单位,对不起。 :-) 感谢您的发现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    相关资源
    最近更新 更多