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

时间:2013-10-26 00:36:08

标签: delphi

我使用以下代码:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form1.visible := false;
  Form2.show;
end;

是的,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);
}

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

我想在单元文件中进行,而不是在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

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

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

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:3)

假设Form1是主要表单而Form1.Hide做了你想做的一切,除了任务栏按钮应该保持可见,那么你真正想做的是最小化应用程序:

Application.Minimize;

否则,您可能正在寻找Hide the Main Form

答案 2 :(得分:3)

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

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

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

此外,以下方法组合似乎可以按您的方式工作:

<强> 1单元/ Form1中/ MainForm的:

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

procedure TForm1.OpenForm2ButtonClick(Sender: TObject);
begin
  TForm2.Create(Self).Show;
  Hide;
end;

<强> UNIT2 /窗体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;

<强> UNIT3 / Form3:

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

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

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