VCL DLL 中如何解决 Tab 键不好使的问题?

Discussion in 'QDAC' started by swish, Jul 29, 2015.

  1. swish

    swish Moderater Staff Member Moderater

    QPlugins 支持 DLL 插件,但是,插件中的窗体如果要嵌入主窗体的某个控件上,往往会发生一些奇怪的事情。那么,如何解决相关的问题呢?

    QPlugins 里提供的 qplugins.vcl.pas 提供了更完美的解决办法,这里提供一种简单但基本完美的解决办法给大家,说它不够完美这是因为:

    • 这里的实现不能跨IDE,必需用同一个编程环境,即 DLL 必需和宿主程序使用同一个版本的 Delphi 编译,当你试图用 XE8 编译的宿主程序来调用 DLL 中的程序时,就可能出现无法预知的问题;
    • DLL 中的 Application 对象相关的属性及方法无效;
    • 其它我还未知的问题;
    但这个方法也是相当简单的了,能够满足一般需要了。具体实现步骤如下:

    1、在你的主程序中加入下面的代码:

    Code (Text):
    1. {本源码来自于 QDAC 项目(项目简介:http://blog.qdac.cc/?p=1543),官方网站:www.qdac.cc,作者:swish,您可以免费使用该代码,但必需保留相关的版权信息,如果做出完善,应将完善后的代码反馈给作者}
    2. type
    3.   TVCLCtrlTestHook = class(TComponent)
    4.   protected
    5.     FMsgId: DWORD;
    6.     function DoTest(AHandle: HWND): Boolean;
    7.   public
    8.     constructor Create(AOwner: TComponent); override;
    9.     destructor Destroy; override;
    10.   end;
    11.  
    12. { TVCLCtrlTestHook }
    13.  
    14. constructor TVCLCtrlTestHook.Create(AOwner: TComponent);
    15. begin
    16.   inherited;
    17.   FMsgId := RegisterWindowMessage(PChar('DelphiRM_GetObjectInstance'));
    18.   IsVCLControlHook := DoTest;
    19. end;
    20.  
    21. destructor TVCLCtrlTestHook.Destroy;
    22. begin
    23.   IsVCLControlHook := nil;
    24.   inherited;
    25. end;
    26.  
    27. function TVCLCtrlTestHook.DoTest(AHandle: HWND): Boolean;
    28. begin
    29.   if AHandle <> 0 then
    30.     Result := SendMessage(AHandle, FMsgId, GetCurrentProcessId, 0) <> 0
    31.   else
    32.     Result := False;
    33. end;
    2、在你程序的主窗体中创建 TVCLCtrlTestHook 的实例。
    Code (Text):
    1. procedure TForm1.FormCreate(Sender: TObject);
    2. begin
    3.   TVCLCtrlTestHook.Create(Self);
    4. end;
    好了,你所要做的就是这些。如果你寻求更完美的解决方案,可以参与 QDAC 众筹,从而获得 qplugins.vcl.pas 的源码。qplugins.vcl.pas 源码只需要在宿主程序 和 DLL 中直接引用就可以了,不需要额外的编码。

    原创文章,转载请注明:“转载自QDAC官网网站,文章发现问题可能随时更新,最新版本请访问:VCL DLL 中如何解决 Tab 键不好使的问题?