Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File Delphi XE2:通过在Windows中打开文件最小化应用程序还原_File_Delphi_Restore_Minimize - Fatal编程技术网

File Delphi XE2:通过在Windows中打开文件最小化应用程序还原

File Delphi XE2:通过在Windows中打开文件最小化应用程序还原,file,delphi,restore,minimize,File,Delphi,Restore,Minimize,问题是:当应用程序最小化时,如何隐藏附加窗体,因为在应用程序恢复后,附加窗体无法关闭。附加的代码显示了该行为。首先,我按下按钮打开附加表单。它已设置了表单样式集fsStayOnTop。然后我按下定时器按钮并最小化主窗体。计时器恢复窗体后,无法关闭附加窗体 program MINIBUG; uses Vcl.Forms, MainForm in 'MainForm.pas' {Form7}, AddForm in 'AddForm.pas' {Form8}; {$R *.res}

问题是:当应用程序最小化时,如何隐藏附加窗体,因为在应用程序恢复后,附加窗体无法关闭。附加的代码显示了该行为。首先,我按下按钮打开附加表单。它已设置了表单样式集fsStayOnTop。然后我按下定时器按钮并最小化主窗体。计时器恢复窗体后,无法关闭附加窗体

program MINIBUG;

uses
  Vcl.Forms,
  MainForm in 'MainForm.pas' {Form7},
  AddForm in 'AddForm.pas' {Form8};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm7, Form7);
  Application.CreateForm(TForm8, Form8);
  Application.Run;
end.

unit AddForm;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TForm8 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form8: TForm8;

implementation

{$R *.dfm}

end.

unit MainForm;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, AddForm, Vcl.ExtCtrls;

type
  TForm7 = class(TForm)
    btnAddForm: TButton;
    tmr1: TTimer;
    Button1: TButton;
    procedure btnAddFormClick(Sender: TObject);
    procedure tmr1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form7: TForm7;


implementation

{$R *.dfm}

procedure TForm7.btnAddFormClick(Sender: TObject);
begin
  Form8.Show;
end;

procedure TForm7.Button1Click(Sender: TObject);
begin
  tmr1.Enabled := True;
end;

procedure TForm7.tmr1Timer(Sender: TObject);
begin
  tmr1.Enabled := False;
  form8.Close;
  Application.Restore;
end;

end.

测试用例错误?

我不确定您的测试用例是否正确。如果计时器事件模拟双击关联文件的行为,为什么会导致
Form8.Close
操作?您说过,问题的一部分是当相关文件打开时,附加表单(与主表单一起)变得可见,因此隐藏(
form.Hide
)应该在启动计时器时发生,并且在
OnTimer
时,应该显示表单(`form.Show)

回答

无论如何,对于您的实际问题,当应用程序最小化时如何隐藏附加表单的答案是,您不必做任何特殊的事情。附加表单也将被隐藏,无需任何操作

如果出于某种原因想要或必须主动隐藏附加表单,请通过将
TApplicationEvents
组件添加到主表单中,并使用其
OnMinimize
事件调用
Form8.hide
OnRestore
事件调用
Form8.Show

同时考虑


顺便说一句,如果选择
Form.Close
Form.Hide
,则会有所不同。Close通过一个过程调用
CloseQuery()
,而Hide只是设置
Visible
属性yo
False

,恐怕您没有向我们提供足够的必要信息来帮助您解决问题。您遗漏的最关键的信息是双击应用程序设置为打开的文件后执行的代码。我猜问题实际上可能出在这段代码中。请提供一个示例,我现在可以用给出的代码重现您描述的问题。我知道这只是在模仿真实情况。因此,请解释一下
form8.Close在现实世界中的动作OnTimer
事件中的code>。若那个行被注释掉了,那个就并没有问题。我有和程序关联的文件,所以我可以双击打开文件。当应用程序正常运行时,打开文件不会造成问题。当我最小化带有可见Form8的应用程序,然后双击打开文件时,Form8也会出现,无论其可见标志设置如何。而且它不能关闭。所以我需要一个解决方案,使Form8正常运行,或者在应用程序恢复时隐藏(或关闭)它。我必须提到,应用程序是单例的,所以双击文件不会创建它的新实例。