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-in
TScrollBox

我试图做的是在Delphi
TScrollBox
中调用并显示表单。 不作为
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代码真的不可读;你应该花几分钟的时间把它格式化好。你真的不知道堆栈溢出是如何工作的,它是关于什么的。哦,我们当中的精明人确切地知道这个网站是关于什么的,相信我。