相关疑难解决方法(0)

Delphi:什么是Application.Handle?

什么是TApplication.Handle

  • 它从何而来?
  • 它为什么存在?
  • 最重要的是:为什么所有表单都将它作为父窗口句柄?

德尔福帮助说:

TApplication.Handle

提供对应用程序主窗体(窗口)的窗口句柄的访问.

property Handle: HWND;
Run Code Online (Sandbox Code Playgroud)

描述

在调用需要父窗口句柄的Windows API函数时使用句柄.例如,显示其自己的顶级弹出窗口的DLL需要父窗口才能在应用程序中显示其窗口.使用Handle属性使这些窗口成为应用程序的一部分,以便使应用程序最小化,恢复,启用和禁用它们.

如果我专注于" 应用程序主窗体的窗口句柄 "这个词,我认为它是指应用程序主窗体的窗口句柄,那么我可以比较:

  • "应用程序主窗体的窗口句柄",用
  • 窗户把手MainFormApplication

但他们不一样:

Application.MainForm.Handle: 11473728
Application.Handle: 11079574
Run Code Online (Sandbox Code Playgroud)

那是什么Application.Handle

  • 它从何而来?
  • Windows®窗口处理的是什么?
  • 如果的的的Windows®窗口句柄ApplicationMainForm,那么他们为什么不匹配?
  • 如果它不是Application 's 的窗口句柄MainForm,那么它是什么?
  • 更重要的是:为什么它是每种形式的最终父母所有者?
  • 最重要的是:如果我试图让一个表格无主义(因此我可以出现在TaskBar上),或者尝试使用像IProgressDialog这样的东西,为什么一切都变得混乱

我真正要问的是:Application.Handle存在的设计原理是什么?如果我能理解为什么,应该如何变得明显.


通过20个问题的游戏更新理解:

在谈到通过让它的主人在任务栏上出现一个窗口的解决方案时null,Peter Below在2000年说:

这可能会导致从次要形式显示的模态形式出现一些问题.

如果用户在模态表单启动时从应用程序切换,然后返回到显示它的表单,则模式表单可能隐藏在表单下方.可以通过确保模态形式是父级来处理这个问题[原文如此; 他的意思是拥有]到表明它的形式(使用 params.WndParent如上)

但是对于Dialogs单元和异常 …

delphi delphi-5 design-rationale

48
推荐指数
3
解决办法
3万
查看次数

运行数据库连接(可能需要很长时间)时显示启动画面

我试图显示一个启动画面,而不是冻结应用程序,而它连接到数据库.正常连接(通过ADO到MSSQL)大约需要300毫秒,这不会导致主线程在窗口上显示"无响应".

但是,在(a)网络错误或(b)配置错误(无效的SQL服务器主机名/实例)的情况下,超时需要60秒.这不仅使应用程序无响应,而且在它冻结时几乎不可能显示任何错误或消息.我可以在开始连接之前弹出一条消息,但是当主线程阻塞60秒时,确实没有解决方案.

解决方案似乎是将连接移动到后台线程.这导致以下代码:

  1. 一个TThread类,它使后台连接,一些SyncObj就像一个TEvent,用于将信号发送回主线程.

  2. 使用此代码的主线程中的循环:

    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建立后台连接,并且已知这是一种安全的方法,这将非常有用.否则一般提示或部分例子都是好的.

delphi multithreading ado

5
推荐指数
1
解决办法
1191
查看次数

如何在不使用VCL的情况下使用自定义Delphi类创建窗口?

我正在尝试编写一个包含类的简单单元,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)

delphi winapi delphi-2007

4
推荐指数
1
解决办法
3359
查看次数