4

我在网上发布了这个:Show来自 DLL 的表单TScrollBox

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

示例但不包含任何 DLL:

Form1.Parent:= ScrollBox;
 Form1.Show;

我如何从一个 DLL 中使用这个例子,里面有一个表单

谁能提供一个例子?

问候,

4

3 回答 3

6

您不能在 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;

而且您需要注意重新创建窗口。如果重新创建主窗口,则需要手动重新创建子窗体。

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

于 2013-06-04T08:19:43.883 回答
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.
于 2013-06-11T17:22:27.020 回答
0

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

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

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

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

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

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

然后,当一位朋友指出我应该更改一行代码时,我使用 Board4All 在网上发布了整个项目。

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

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

于 2013-06-12T15:19:04.420 回答