gpt4 book ai didi

delphi - 控件 'xxx'没有父窗口

转载 作者:行者123 更新时间:2023-12-03 14:42:04 26 4
gpt4 key购买 nike

我正在尝试在 Delphi 中编写一个 dll 库,其中包含一个创建 TFrame 后代实例并返回它的函数。但是当我在应用程序中导入这个函数时,每次调用它时,我都会得到一个异常,例如“'xxx'控件没有父窗口”。我不是 100% 确定,但是当访问任何 GUI 控件时,异常出现在该类的构造函数中。

您能告诉我这种行为的原因是什么吗?我应该只使用 TForm 后代还是有更好的解决方案?

谢谢!

最佳答案

关于错误

该错误消息是从 Controls.pas 单元的 TWinControl.CreateWnd 方法引发的。本质上,该代码用于为您的 TWinControl 后代(TFrame、TButton、TEdit...如果它可以有键盘焦点,那么它就是 TWinControl 后代)创建窗口句柄,这实际上是一个非常明智的错误消息:您不能有没有 WindowParent 的窗口,由于我们在这里讨论的是 VCL,因此尝试从 TWinControl.Parent 获取父窗口句柄是很有意义的;而且这还没有分配。

这不是弹出错误消息的原因。您会看到该错误消息,因为您用于设置框架的某些代码需要窗口句柄来执行某些操作。它可以是任何东西,比如设置某些组件的标题(内部需要窗口句柄来进行某些计算)。我个人真的很讨厌这种情况发生。当我从代码创建GUI时,我尝试尽可能延迟Parent的分配,以试图延迟窗口的创建,所以我被这个问题困扰了很多次。

特定于您的 DLL 使用情况,可能的修复

我要戴上我的心理读心术帽子。由于您需要从 DLL 返回一个 FRAME,并且您无法返回实际的 Frame,因为这是一个特定于 Delphi 的对象,并且不允许您通过 DLL 边界返回特定于 Delphi 的对象,所以我猜测您正在返回一个窗口句柄,就像所有好的 API 所做的那样,使用如下的函数定义:

function GiveMeTheNiceFrame:HWND;

问题是,该例程需要通过调用 TWinControl.CreateWnd 创建实际的窗口句柄,而该调用又需要父窗口句柄来设置对 Windows.CreateWindowEx,并且例程无法获取父窗口句柄,因此会出错。

尝试用以下内容替换您的函数:

function GiveMeTheNiceFrame(OwnerWindow:HWND):HWND;
begin
Result := TMyNiceFrame.CreateParanted(OwnerWindow).Handle;
end;

...即:使用 CreateParented(AParentWindow:HWND) 构造函数,而不是通常的 Create(AOwner:TComponent) 并将所有者 HWND 传递给您的 DLL。

关于delphi - 控件 'xxx'没有父窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3776028/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com