首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在TScrollBox中显示动态链接库的窗体

在TScrollBox中显示动态链接库的窗体
EN

Stack Overflow用户
提问于 2013-06-04 15:45:59
回答 3查看 3.5K关注 0票数 4

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

我正在尝试做的是调用并在Delphi TScrollBox中显示一个表单。不是以ShowShowModal身份

示例,但不使用任何DLL:

代码语言:javascript
复制
Form1.Parent:= ScrollBox;
 Form1.Show;

如何在内部包含窗体的DLL中使用此示例

有人能举个例子吗?

致以敬意,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-12 01:22:27

问题解决了,代码如下:

代码语言:javascript
复制
//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.
票数 2
EN

Stack Overflow用户

发布于 2013-06-04 16:19:44

不能在DLL和主机可执行文件之间传递Delphi对象。这是因为对象只能在创建对象的模块中进行操作。现在,如果您使用的是运行时包,您将能够摆脱这一限制。

您可以从创建并显示表单的DLL中导出函数。该函数可能如下所示:

代码语言:javascript
复制
function ShowMyForm(ParentWindow: HWND): Pointer; stdcall;

请注意,您不能将父对象作为Delphi对象传递,原因与我上面描述的完全相同。

也不能将窗体的父级指定为可执行文件中的控件。所以你必须传递父窗口的句柄。

其实现如下所示:

代码语言:javascript
复制
function ShowMyForm(ParentWindow: HWND): Pointer; stdcall;
var
  Form: TMyForm;
begin
  Form := TMyForm.CreateParented(ParentWindow);
  Form.Show;
  Result := Pointer(Form);
end;

你可以这样称呼它:

代码语言:javascript
复制
Form := ShowMyForm(ScrollBox.Handle);

您还需要提供一个函数来在完成后销毁表单:

代码语言:javascript
复制
procedure DestroyMyForm(Form: Pointer); stdcall;
begin
  TMyForm(Form).Free;
end;

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

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

票数 6
EN

Stack Overflow用户

发布于 2013-06-12 23:19:04

首先,构建代码的想法是我的想法,它的目的是作为一种简单的方式来显示存储在dll文件中的表单。

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

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

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

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

在我将问题发布到网上之前很久,代码就已经构建好了,但并没有像我预期的那样工作,因为表单只显示在滚动框之外。

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

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

然后我调整了代码行,它工作了,所以他是一个值得所有荣誉的人,然后我决定发布代码,这样其他人就可以在他们的项目中使用代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16912393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档