我在网上发布了这个:Show
来自 DLL 的表单TScrollBox
我想做的是在 Delphi 中调用并显示一个表格TScrollBox
。不作为Show
或ShowModal
示例但不包含任何 DLL:
Form1.Parent:= ScrollBox;
Form1.Show;
我如何从一个 DLL 中使用这个例子,里面有一个表单
谁能提供一个例子?
问候,
我在网上发布了这个:Show
来自 DLL 的表单TScrollBox
我想做的是在 Delphi 中调用并显示一个表格TScrollBox
。不作为Show
或ShowModal
示例但不包含任何 DLL:
Form1.Parent:= ScrollBox;
Form1.Show;
我如何从一个 DLL 中使用这个例子,里面有一个表单
谁能提供一个例子?
问候,
您不能在 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;
而且您需要注意重新创建窗口。如果重新创建主窗口,则需要手动重新创建子窗体。
简而言之,你正在尝试的是相当脆弱的。如果我是你,我会寻找不同的方法。
问题解决了,代码如下:
//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.
首先,构建代码的想法是我的想法,它旨在用作显示存储在 dll 文件中的表单的简单方法。
主要思想是将你想要的任何东西放在 dll 中,调用并在 TscrollBox 中显示它,这实际上可以是一个完全正常工作的数据库或程序的其他路径,你不想在之后传递参数它已启动或关闭。
我在网上发布了这个问题,许多人并不真正理解我试图解释或想要做什么,他们似乎认为我想使用滚动框在 dll 中创建一个,但我的表单已经创建并保存在dll 文件,滚动框在我的主项目中的 dll 外部。
我想做的就是调用表单并在滚动框中显示为它的父级。
我没有声明此代码的任何路径,因为许多人提出了他们的想法,我感谢他们所有人。
提供的代码早在我将问题发布到网上之前就已经构建好了,但由于表单只显示在滚动框之外,因此没有按我的预期工作。
然后,当一位朋友指出我应该更改一行代码时,我使用 Board4All 在网上发布了整个项目。
他只有一个昵称,并说他不确定它是否会起作用,具体取决于我使用的 delphi 版本。
然后我调整了代码行,它工作了,所以他是值得所有功劳的人,然后我决定发布代码,以便其他人能够在他们的项目中使用代码。