Delphi 在TScrollBox中显示DLL中的表单
我在网上发布了这条消息:Delphi 在TScrollBox中显示DLL中的表单,delphi,dll,tscrollbox,Delphi,Dll,Tscrollbox,我在网上发布了这条消息:Showformfromthll-inTScrollBox 我试图做的是在DelphiTScrollBox中调用并显示表单。 不作为Show或showmodel 示例,但不包括任何DLL: Form1.Parent:= ScrollBox; Form1.Show; 如何从包含表单的DLL中使用此示例 有人能举个例子吗 关于,您不能在DLL和主机可执行文件之间传递Delphi对象。这是因为对象只能在创建它们的模块中操作。现在,如果您使用的是运行时包,那么您就能够摆脱这种
Show
formfromthll-inTScrollBox
我试图做的是在DelphiTScrollBox
中调用并显示表单。
不作为Show
或showmodel
示例,但不包括任何DLL:
Form1.Parent:= ScrollBox;
Form1.Show;
如何从包含表单的DLL中使用此示例
有人能举个例子吗
关于,您不能在DLL和主机可执行文件之间传递Delphi对象。这是因为对象只能在创建它们的模块中操作。现在,如果您使用的是运行时包,那么您就能够摆脱这种限制 您可以从DLL中导出创建并显示表单的函数。该函数可能如下所示:
function ShowMyForm(ParentWindow: HWND): Pointer; stdcall;
Form := ShowMyForm(ScrollBox.Handle);
注意,您不能将父对象作为Delphi对象传递,原因与我上面描述的完全相同
也不能指定窗体的父级是可执行文件中的控件。因此,必须传递父窗口句柄
执行情况如下:
function ShowMyForm(ParentWindow: HWND): Pointer; stdcall;
var
Form: TMyForm;
begin
Form := TMyForm.CreateParented(ParentWindow);
Form.Show;
Result := Pointer(Form);
end;
你可以这样称呼它:
function ShowMyForm(ParentWindow: HWND): Pointer; stdcall;
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的外部 我所要做的就是调用表单并在scrolbox中显示为它的父对象 我不主张这条代码的任何路径,因为许多人提出了他们的想法,我感谢他们所有人 提交的代码早在我将问题发布到网上之前就已经构建好了,但并没有按照我的预期工作,因为表单只显示在滚动框之外 然后,当一位朋友指出我应该修改一行代码时,我将整个项目发布到了Board4All上 他只有一个昵称,并说他不确定它是否会工作,这取决于我使用的是什么版本的delphi
然后,我调整了代码行,使其正常工作,使他成为值得所有学分的人,然后我决定发布代码,以便其他人能够在他们的项目中使用该代码。你的人是格拉特,我将使用该代码并发布结果,感谢您,实际上我能够使用过程和/或函数在dll表单中创建和显示我想要的所有内容,我只想在我的主表单滚动框中显示完成的dll表单。我可以使用show过程和/或showmodel作为函数来显示dll表单。我无法在我的EXE主窗体上显示delphi滚动框中的窗体。我不明白您的意思mean@PeterVon也许吧。我添加了一个示例调用。之前已经添加了+1,如果可能的话,会给你另一个,因为响应速度太快,我只写了评论,5秒钟后你已经编辑了答案并回复了评论,比如wtf fast fingers:d代码真的不可读;你应该花几分钟的时间把它格式化好。你真的不知道堆栈溢出是如何工作的,它是关于什么的。哦,我们当中的精明人确切地知道这个网站是关于什么的,相信我。