【问题标题】:Show form from DLL in TScrollBox在 TScrollBox 中显示来自 DLL 的表单
【发布时间】:2013-06-04 07:45:58
【问题描述】:

我在网上发布了这个:ShowTScrollBox 中的 DLL 表单

我想做的是在 Delphi TScrollBox 中调用并显示一个表单。 不像ShowShowModal

示例但不包含任何 DLL:

Form1.Parent:= ScrollBox;
 Form1.Show;

我如何从一个带有表单的 DLL 中使用这个示例

谁能举个例子?

问候,

【问题讨论】:

    标签: delphi dll tscrollbox


    【解决方案1】:

    您不能在 DLL 和主机可执行文件之间传递 Delphi 对象。这是因为对象只能在创建它们的模块中操作。现在,如果您使用运行时包,您就可以摆脱这种限制。

    您可以从您的 DLL 中导出一个创建并显示表单的函数。该函数可能如下所示:

    function ShowMyForm(ParentWindow: HWND): Pointer; stdcall;
    

    请注意,由于与我上面描述的完全相同的原因,您不能将父对象作为 Delphi 对象传递。

    您也不能将表单的父级指定为可执行文件中的控件。所以你必须传递父级的窗口句柄。

    实现是这样的:

    function ShowMyForm(ParentWindow: HWND): Pointer; stdcall;
    var
      Form: TMyForm;
    begin
      Form := TMyForm.CreateParented(ParentWindow);
      Form.Show;
      Result := Pointer(Form);
    end;
    

    你可以这样称呼它:

    Form := ShowMyForm(ScrollBox.Handle);
    

    您还需要提供一个函数来在完成后销毁表单:

    procedure DestroyMyForm(Form: Pointer); stdcall;
    begin
      TMyForm(Form).Free;
    end;
    

    并且您需要注意重新创建窗口。如果宿主窗口被重新创建,那么您需要手动重新创建子窗体。

    简而言之,您正在尝试的东西相当脆弱。如果我是你,我会寻找不同的方法。

    【讨论】:

    • 你们太棒了,我会玩弄代码并发布结果,谢谢
    • 实际上我可以使用过程和/或函数在 dll 表单中创建和显示我想要的所有内容,我要做的就是在我的主表单 ScrollBox 中显示完成的 dll 表单。我可以使用显示过程和/或 ShowModal 作为函数来显示 dll 表单。我无法在我的 EXE 主窗体上的 delphi ScrollBOX 中显示该窗体。
    • 我不明白你的意思
    • @PeterVonča 也许吧。我添加了一个示例调用。
    • 之前已经加了+1,如果可能的话,会再给你一个,只是为了回复这么快,我喜欢刚刚写了评论,就像5秒后你已经编辑了答案并回复了评论,比如wtf快速的手指:D
    【解决方案2】:

    问题解决了,代码如下:

    //This is the DLL
    
    library Project1dll;
    
    uses    
      SysUtils,    
      Windows,    
      Classes,    
      DllForm in 'DllForm.pas' {frmDllForm}; // this is the other form
    
    procedure Create_Form(ph: HWND);    
    begin    
      frmDllForm:= TfrmDllForm.CreateParented(Ph);    
      frmDllForm.Show;    
    end;
    
    Exports    
    Create_Form;
    
    begin    
    end.
    
    //---------------------END--------------------------------------
    
    //This is the project
    
    unit Unit1;
    
    interface
    
    uses    
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls;
    
    type    
      TForm1 = class(TForm)    
        Button1: TButton;    
        ScrollBox: TScrollBox;    
        procedure Button1Click(Sender: TObject);    
      private    
      end;
    
    procedure Create_Form(ph: HWND) ; external 'Project1dll.dll' name 'Create_Form';
    
    var    
      Form1: TForm1;
    
    implementation
    
    {$R *.DFM}
    
    function ScrollBoxDll(ph: HWND): Pointer; stdcall;    
    begin    
      Create_Form(ph);    
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);    
    begin    
      ScrollBoxDll(ScrollBox.Handle);    
    end;
    
    end.
    

    【讨论】:

    • 那段代码真的不可读;你应该花几分钟来很好地格式化它
    【解决方案3】:

    首先是我的想法和构建代码的想法,它旨在用作显示存储在 dll 文件中的表单的简单方法。

    主要的想法是把你想要的东西放在 dll 中,调用它并在 TscrollBox 中显示它,这实际上可以是一个完全正常工作的数据库或其他一些你不想传递参数的程序路径以及从它启动或关闭之后。

    我在网上发布了这个问题,许多人并不真正理解我试图解释或想要做什么,他们似乎认为我想使用滚动框在 dll 中创建一个 from,但我的一个或多个表单已经创建并保存在 dll 文件中,滚动框在我的主项目中的 dll 外部。

    我想做的就是调用表单并在滚动框中显示为它的父级。

    我没有声明此代码的任何路径,因为许多人提出了他们的想法,我感谢他们。

    提供的代码早在我在线发布问题之前就已经构建好了,但由于表单只显示在滚动框之外,所以没有按我的预期工作。

    当一位朋友指出我应该修改一行代码时,我将整个项目发布到了 Board4All 上。

    他只有一个昵称,并说他不确定它是否会起作用,这取决于我使用的 delphi 版本。

    然后我调整了代码行,它工作了,所以他是值得所有功劳的人,然后我决定发布代码,以便其他人能够在他们的项目中使用该代码。

    【讨论】:

    • 您并不真正了解 Stack Overflow 的工作原理以及它的含义。
    • 哦,我们当中的精明人士完全了解这个网站的全部内容,相信我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 2012-02-27
    相关资源
    最近更新 更多