Delphi隐藏表格,不隐藏任务栏上的应用程序图标

Sid*_*ang 0 delphi

我使用以下代码:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form1.visible := false;
  Form2.show;
end;
Run Code Online (Sandbox Code Playgroud)

是的,form1被隐藏,而form2出现了。但是为什么任务栏中的应用程序图标也被隐藏了。

我使用以下代码,但是在隐藏form1时仍无法在任务栏上显示图标。

      visible := false;
{
      enable := false;
      Application.MainFormOnTaskbar := True;
      ShowWindow(Application.Handle, SW_SHOW);
      SetWindowLong(Application.Handle, GWL_EXSTYLE, GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
}
Run Code Online (Sandbox Code Playgroud)

我要隐藏表单时如何在任务栏上保留应用程序图标?

我想在单位文件而不是DPR文件中执行此操作。

我要保留系统任务栏的文件位于:http : //sidhiciang.com/myfiles/ShowHideForms.rar

Unit1.pas
  If Form1.btShowForm2Click() , then 
    Hide Form1 and Show Form2 ( actHideForm1execute(self)).
  If Form1.btCloseForm1Click(), then 
    Close the application

Unit2.pas
  If  Form2.btShowForm3Click(), then 
    Hide Form2 and Show Form3 ( actHideForm2execute(self)).
  If Form2.btCloseForm2Click(), then 
    Show the Form1 and Form2.close (actShowForm1execute(self))

Unit3.pas
  If btCloseFrom3Click(), then
    Show Form2 and Close Form3
Run Code Online (Sandbox Code Playgroud)

在所有Unit1 / Unit2 / Unit3中,使任务栏上的应用程序图标可用。因为如果我使用.visible:= false,则系统任务栏也会被隐藏。

PS:我使用Delphi 2010,并在Windows XP和7 Enviorment上运行。

NGL*_*GLN 7

好的,现在很清楚你想要什么,首先有几件事:

  • 创建的第一个 Form 自动是 MainForm,
  • 一个应用程序不能没有 MainForm;当 MainForm 关闭时,应用程序关闭,无论显示什么其他表单,
  • 您可以隐藏 MainForm,
  • 默认情况下(无论如何在旧的 Delphi 版本中)应用程序的窗口显示在任务栏 ( Application.MainFormOnTaskbar = False) 上。只要应用程序处于活动状态,并且只要显示至少一个表单,此图标/窗口就会显示在任务栏中。
  • 当 时Application.MainFormOnTaskbar = True,则 MainForm 的图标/窗口显示在任务栏中。当 MainForm 隐藏时,图标消失。显示另一个表单不会导致另一个任务栏图标/窗口,因此根本没有图标。

因此,很明显您需要Application.MainFormOnTaskbar := False在项目文件中进行设置。

此外,以下方法组合似乎可以如您所愿:

Unit1/Form1/MainForm:

procedure TForm1.CloseButtonClick(Sender: TObject);
begin
  Close;
end;

procedure TForm1.OpenForm2ButtonClick(Sender: TObject);
begin
  TForm2.Create(Self).Show;
  Hide;
end;
Run Code Online (Sandbox Code Playgroud)

单元 2/表格 2:

procedure TForm2.CloseButtonClick(Sender: TObject);
begin
  Close;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  TForm(Owner).Show;
  Action := caFree;
end;

procedure TForm2.OpenForm3ButtonClick(Sender: TObject);
begin
  TForm3.Create(Self).Show;
  Hide;
end;
Run Code Online (Sandbox Code Playgroud)

单元 3/表格 3:

procedure TForm3.CloseButtonClick(Sender: TObject);
begin
  Close;
end;

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  TForm(Owner).Show;
  Action := caFree;
end;
Run Code Online (Sandbox Code Playgroud)

请注意,在这些更改期间,任务栏按钮的标题保持不变。如果要将其与显示的表单的标题同步,请设置Application.Title.


bum*_*mmi 5

您可以在任务栏上显示的手柄之间切换。
隐藏时显示应用程序,显示时显示表单。

procedure TForm1.HideIt;
begin
  Visible := false;
  Application.MainFormOnTaskbar := false;
  ShowWindow(Application.Handle, SW_SHOW);
end;

procedure TForm1.ShowIt;
begin
  Visible := true;
  Application.MainFormOnTaskbar := true;
  ShowWindow(Application.Handle, SW_Hide);
end;

// overrride CreateParams:  procedure CreateParams(var Params: TCreateParams); override;
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.MainFormOnTaskbar := true;
end;
Run Code Online (Sandbox Code Playgroud)