代码之家  ›  专栏  ›  技术社区  ›  Yona

关闭二级Delphi窗体会导致主窗体失去焦点

  •  2
  • Yona  · 技术社区  · 15 年前

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

    使用Delphi2009和xp sp3

    以下是我复制问题的步骤:

    1. 创建新的VCL窗体应用程序
    2. 将按钮拖到创建的窗体上
    3. 在单击处理程序中,创建一个新的tform1并显示它

    运行程序。单击按钮以显示第二个窗体。单击第二个窗体上的按钮创建第三个窗体。关闭两个新窗体时,主窗体将失去焦点。

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

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

    有没有办法阻止我的主要形式失去焦点?

    5 回复  |  直到 15 年前
        1
  •  3
  •   Yona    15 年前

    从版本升级Delphi安装后 12.0.3170.16989(无更新) 版本 12.0.3420.21218(更新3和4) 我再也不能复制这个问题了。

    似乎是更新中修复的错误。

        2
  •  2
  •   Francesca    15 年前

    我不明白你所描述的是如何创建一个“孩子”形式的。

    但是,不管我是从主窗体还是从第一个“子窗体”创建第二个“子窗体”,无论我关闭它们的顺序如何,我只是尝试了您在步骤中所描述的内容,并且无法在d2009(更新3&4)中复制它。

    所以,肯定还有别的事情你没有告诉…

        3
  •  0
  •   Chris Becke    15 年前

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

    我不知道这将如何应用于Delphi或VCL中的开发。代码示例并不意味着您对模式弹出窗口的销毁方式有很多或任何控制。

        4
  •  0
  •   Jim McKeeth    15 年前

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

    with TForm1.Create(nil) do begin
      show;
      activate;
      bringtofront;
    end;
    
        5
  •  0
  •   RR-NL    15 年前

    像弗朗索瓦一样,我不能用Delphi2009在Windowsxpsp3上重现这种行为。首先打开的窗体在其他窗体关闭后立即返回焦点。

    当然,您的项目代码是:

    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.
    

    更正了弗朗索瓦的名字,对不起。