我在网上发布了这个:来自TScrollBox中的DLL的Show表单
我正在尝试做的是调用并在Delphi TScrollBox中显示一个表单。不是以Show或ShowModal身份
示例,但不使用任何DLL:
Form1.Parent:= ScrollBox;
Form1.Show;如何在内部包含窗体的DLL中使用此示例
有人能举个例子吗?
致以敬意,
发布于 2013-06-12 01:22:27
问题解决了,代码如下:
//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-04 16:19:44
不能在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-12 23:19:04
首先,构建代码的想法是我的想法,它的目的是作为一种简单的方式来显示存储在dll文件中的表单。
主要的想法是把你想要的东西放在dll中,调用并显示在TscrollBox中,这实际上可以是一个完全正常工作的数据库,也可以是某个程序的其他路径,在它启动或关闭后,你不会真的想将参数传递给它。
我在网上发布了这个问题,许多人并不真正理解我试图解释或想要做的事情,他们似乎认为我想要使用滚动框在dll中创建一个form,但我的一个或多个窗体已经创建并保存在dll文件中,滚动框位于我主项目中的dll外部。
我所要做的就是调用表单并在滚动框中显示为它的父级。
我没有声明这段代码的任何路径,因为许多人提出了他们的想法,我感谢他们所有人。
在我将问题发布到网上之前很久,代码就已经构建好了,但并没有像我预期的那样工作,因为表单只显示在滚动框之外。
然后,当一个朋友指出我应该修改一行代码时,我在Board4All上发布了整个项目。
他只有一个昵称,他说他不确定它是否会工作,这取决于我使用的delphi版本。
然后我调整了代码行,它工作了,所以他是一个值得所有荣誉的人,然后我决定发布代码,这样其他人就可以在他们的项目中使用代码。
https://stackoverflow.com/questions/16912393
复制相似问题