关闭辅助delphi表单会导致主窗体失去焦点

时间:2009-12-13 17:54:56

标签: delphi winapi delphi-2009 vcl

当从主窗体和第二个窗体显示第二个窗体显示第三个窗体然后关闭两个窗体时,将导致主窗体失去焦点。

将Delphi 2009与XP SP3一起使用

以下是我重现问题的步骤:

  1. 创建新的VCL表单应用程序
  2. 将按钮拖到创建的表单
  3. 在点击处理程序中创建一个新的TForm1并显示它
  4. 运行程序。单击按钮以显示第二个表单。单击第二个表单上的按钮以创建第三个表单。关闭两个新表单时,主表单将失去焦点。

    这是按钮点击事件处理程序中的代码:

    // Using Self does not change the results
    with TForm1.Create(nil) do
        show;
    

    有没有办法阻止我的主要表格失去焦点?

5 个答案:

答案 0 :(得分:3)

将我的Delphi安装从版本 12.0.3170.16989(无更新)升级到版本 12.0.3420.21218(更新3& 4)后,我再也无法重现此问题

似乎这是一个在更新中修复的错误。

答案 1 :(得分:2)

我看不出你所描述的是如何创建一个“孩子”表格。

但无论如何,我只是尝试了你在步骤中描述的内容并且无法在D2009(更新3& 4)中重现它,无论我是从主表单还是从第一个“孩子”创建第二个“孩子” “,无论我关闭它们的顺序如何。

所以,你必须要有别的东西......

答案 2 :(得分:0)

从纯Win32角度来看,当弹出窗口关闭时,应用程序往往会失去焦点,因为底层框架有一个操作顺序问题。 Windows不会激活禁用的窗口,因此,在销毁模式弹出窗口时,在弹出窗口中调用DestroyWindow之前,(重新启用)父窗口是非常重要的。

我不知道这可能如何适用于delphi或vcl中的开发。代码示例并不意味着您对模态弹出窗口的销毁方式有很多 - 或任何 - 控制。

答案 3 :(得分:0)

尝试以下(并避免使用):

with TForm1.Create(nil) do begin
  show;
  activate;
  bringtofront;
end;

答案 4 :(得分:0)

与François一样,我无法在Windows XP SP3上使用Delphi 2009重现此行为。一旦其他表格关闭,首先打开的表单会立即获得焦点。

可以肯定的是,你的项目代码是:

program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

你的单位代码:

unit Unit1;

interface

uses
  Forms, Classes, Controls, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
  with TForm1.Create(nil) do
    Show;
end;

end.

更正了François的名字,抱歉