- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 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/
我目前正在寻找一些关于 jQuery 的建议,因为我认为我做错了,即使我得到了我想要的结果。 我想在更改时将输入的值更改为最接近的具有 .milestone 类的输入的值。我想要更改的输入是保持输入,
我已经阅读有关绑定(bind)、调用、申请的文章近一周了,对我来说仍然很复杂。我想我写的这个 jsfiddle 需要它们。然而,我没能做到,因为我仍然很困惑。 我尽力写了一些我上周从遇到这个问题的开发
我有一个项目生成代码。生成时间真的很长,所以我把它分成了多个项目,每个项目产生了整体的 20%。原始 POM 成为“父 POM”,子项依赖于它,仅包含一个单独的 Artifact ID 和一两个更改的
我正在使用局部 View 来创建父 subview 。我最理想的是父 View 上的提交按钮,用于保存子值。 我有以下模型。 public class Course { public int
我刚刚开始学习Rust,并且在理解所有权如何在我的案例中遇到一些麻烦: use std::ops::IndexMut; // =====================================
我是 JavaScript 新手,想了解更多有关它实例化父/子对象的顺序的信息。更具体地说,我想从编译器/浏览器的 Angular 理解以下代码片段。 var parent = { child:
我正在测试 Azure IaaS,并遇到了一个非常基本的问题。我有一个父 VHD 和子 VHD,已使用 csupload 将其作为页面 blob 上传,并且门户中显示图像和磁盘。然后我尝试将 pare
我的应用程序会定期为我坚持使用的对象请求更新 Core Data到网络服务。然后我需要更新我在主要上下文中拥有的对象(默认情况下 AppDelegate 中提供的对象)。编辑对象的不是用户,所以我需要
texT text text text text text 如何直接获取来自.menu ? 里面的 child 不应该采取。
我一直需要影响与其他元素相关的元素,但我的方法有点业余! 即到 // matched item where script is called from LINK 我使用; $(thi
我有两个表: 父子“类别”: id name parent_id 1 Food NULL 2 Pizza 1 3 Pasta
Linux 上的 Python 2.7.6。 我正在使用从父级继承的测试类。父类保存了许多子类共有的许多字段,我需要调用父类的 setUp 方法来初始化这些字段。调用 ParentClass.setU
我有一个处理图像、相册和相册类别的数据库。 一个专辑可以有多个专辑(子专辑),并且只有 1 级深度。 一张专辑仅属于一个专辑类别。 在这里做了一些研究,我相信最合适的数据库模型是这个 album_ca
我有一个关键字表,其中每个关键字都分配有一个 ID,并且是唯一的。我有第二个表,将父关键字的 ID 链接到子关键字的 ID。一个关键字最多可以有大约 800 个 child 或根本没有。 child
我经常使用这个 CSS 选择器 parent>child。我的设计在 Mozilla 和 Opera 中看起来不错。 但在 IE 中,它很糟糕。我知道 > 在 IE 中无法识别,但在 IE 中有什么替
我一直在用一个父对象构建一个系统,它在其中创建各种子对象,每个子对象都需要一个主对象才能运行。现在,到目前为止,我一直在创建 shared_ptr和 Child* ,所以当 Parent 和 所有 C
我从以下两个类中收到序列化兼容性错误。只有父类CommericalCustomer 实现了序列化。当具有如下所示的父/子关系时,使用可序列化接口(interface)的正确方法是什么? public
我正在开发一个程序并学习父/子进程。目前我的子进程是 exit(variable); 在我的 main() 中我有: signal(SIGCHLD, chldHandler); 在我的 main()
考虑以下两个具体类: public class A { protected void foo() { System.out.println("A foo"); bar
所以,我正在尝试建立这样的父/子类关系: class ParentClass where C : ChildClass { public void AddChild(C child)
我是一名优秀的程序员,十分优秀!