什么是TApplication.Handle?
德尔福帮助说:
TApplication.Handle
提供对应用程序主窗体(窗口)的窗口句柄的访问.
Run Code Online (Sandbox Code Playgroud)property Handle: HWND;描述
在调用需要父窗口句柄的Windows API函数时使用句柄.例如,显示其自己的顶级弹出窗口的DLL需要父窗口才能在应用程序中显示其窗口.使用Handle属性使这些窗口成为应用程序的一部分,以便使应用程序最小化,恢复,启用和禁用它们.
如果我专注于" 应用程序主窗体的窗口句柄 "这个词,我认为它是指应用程序主窗体的窗口句柄,那么我可以比较:
MainForm的Application但他们不一样:
Application.MainForm.Handle: 11473728
Application.Handle: 11079574
Run Code Online (Sandbox Code Playgroud)
那是什么Application.Handle?
Application的MainForm,那么他们为什么不匹配?Application 's 的窗口句柄MainForm,那么它是什么?我真正要问的是:Application.Handle存在的设计原理是什么?如果我能理解为什么,应该如何变得明显.
通过20个问题的游戏更新理解:
在谈到通过让它的主人在任务栏上出现一个窗口的解决方案时null,Peter Below在2000年说:
这可能会导致从次要形式显示的模态形式出现一些问题.
如果用户在模态表单启动时从应用程序切换,然后返回到显示它的表单,则模式表单可能隐藏在表单下方.可以通过确保模态形式是父级来处理这个问题[原文如此; 他的意思是拥有]到表明它的形式(使用
params.WndParent如上)但是对于
Dialogs单元和异常 …
我试图显示一个启动画面,而不是冻结应用程序,而它连接到数据库.正常连接(通过ADO到MSSQL)大约需要300毫秒,这不会导致主线程在窗口上显示"无响应".
但是,在(a)网络错误或(b)配置错误(无效的SQL服务器主机名/实例)的情况下,超时需要60秒.这不仅使应用程序无响应,而且在它冻结时几乎不可能显示任何错误或消息.我可以在开始连接之前弹出一条消息,但是当主线程阻塞60秒时,确实没有解决方案.
解决方案似乎是将连接移动到后台线程.这导致以下代码:
一个TThread类,它使后台连接,一些SyncObj就像一个TEvent,用于将信号发送回主线程.
使用此代码的主线程中的循环:
BackgroundThread.StartConnecting;
while not BackgroundThread.IsEventSignalled do begin
Application.ProcessMessages; // keep message pump alive.
end;
// continue startup (reports error if db connection failed)
Run Code Online (Sandbox Code Playgroud)这是正确的方法吗?我的犹豫涉及上述解决方案的以下要素:
答:我会调用Application.ProcessMessages,我认为这是极端的代码味道.(这可能是这个规则允许的例外)
B.我在应用程序启动时引入了线程,我担心引入错误.
如果任何人都有一个已知没有竞争条件的参考实现,那可以与ADO建立后台连接,并且已知这是一种安全的方法,这将非常有用.否则一般提示或部分例子都是好的.
我正在尝试编写一个包含类的简单单元,TMainWindow以提高我对本机Windows API的了解.
我想像这样使用这个类:
var
MainWindow: TMainWindow;
begin
MainWindow := TMainWindow.Create;
try
MainWindow.ShowModal;
finally
MainWindow.Free;
end;
end.
Run Code Online (Sandbox Code Playgroud)
我有一个几乎工作的原型,但我找不到问题,这是我到目前为止编写的代码:
unit NT.Window;
interface
uses
Windows, Messages, Classes, SysUtils;
type
PObject = ^TObject;
TMainWindow = class(TObject)
private
FChild : HWND; { Optional child window }
FHandle : HWND;
procedure WMCreate (var Msg: TWMCreate); message WM_CREATE;
procedure WMDestroy (var Msg: TWMDestroy); message WM_DESTROY;
procedure WMNcCreate (var Msg: TWMNCCreate); message WM_NCCREATE;
procedure WMPaint (var Msg: TWMPaint); message WM_PAINT;
procedure WMPrintClient (var Msg: TWMPrintClient); message …Run Code Online (Sandbox Code Playgroud)