【问题标题】:Delphi hide the form, not hide the application icon on taskbarDelphi隐藏表单,不隐藏任务栏上的应用程序图标
【发布时间】:2013-11-05 06:14:13
【问题描述】:

我使用以下代码:

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 环境上运行。

【问题讨论】:

  • 任务栏上只显示可见的顶级窗口。您将主窗体放在任务栏上,因此当您隐藏它时,它会从任务栏中删除。我应该说将 MainFormOnTaskbar 设置为 False 就足够了。这将使用应用程序窗口作为任务栏窗口。
  • 如果您发布真实代码会有所帮助。例如,当您说 enable := False 时,没有 enable 属性。如果您明确说明代码何时运行,也会有所帮助。仅在启动时,或在主窗体已经显示时。
  • 仔细阅读我的评论。您只想在启动时执行此操作?或者在 main for 已经显示的地方。只要你能把问题说清楚,你就会得到答案。
  • 好的,我添加 rar 文件(源代码)。我想隐藏已经显示的form1,所以当我点击按钮时,它将隐藏form1并显示form2,同时保持任务栏上的应用程序图标可用。
  • 我明天才能看这个,但是你为什么不把表格最小化呢?

标签: delphi


【解决方案1】:

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

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;

【讨论】:

  • 您能解释一下为什么需要 WS_EX_APPWINDOW 吗?
  • 这里应该不需要强制。这不是顶级无主窗口吗?换句话说,Params.WndParent 不等于 0。
  • 好的,想多了。当且仅当应用程序窗口是任务栏窗口时,该窗口才会归应用程序窗口所有。
【解决方案2】:

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

Application.Minimize;

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

【讨论】:

  • 如果我添加按钮来显示 Form2 会怎样?只有当我使用一种表单时,您的代码才能像我想要的那样工作。当我使用多个表单时,我将最小化整个表单...如何最小化或隐藏其他表单,同时保持最新表单可见?
  • @SidhiCiang 我真的希望您能像我在对问题的第二条评论中提出的那样编辑问题。我觉得如果您能告诉我们更多有关上下文的信息,我们肯定可以为您提供所需的答案。
【解决方案3】:

好的,既然你想要什么已经很清楚了,首先要做两件事:

  • 创建的第一个表单自动成为 MainForm,
  • 应用程序不能没有 MainForm;当 MainForm 关闭时,应用程序将关闭,无论显示什么其他表单,
  • 您可以隐藏 MainForm,
  • 默认情况下(无论如何在旧版本的 Delphi 中)应用程序的窗口显示在任务栏上 (Application.MainFormOnTaskbar = False)。只要应用程序处于活动状态,并且至少显示一个表单,此图标/窗口就会显示在任务栏中。
  • Application.MainFormOnTaskbar = True 时,主窗体的图标/窗口显示在任务栏中。当 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;

Unit2/Form2:

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

【讨论】:

  • 很好用 :) 关键是 Application.MainFormOnTaskbar := False ...我误认为 True ... :P
  • 无论如何如何更改 TForm(Owner).Show 的 .tag 值; ?
  • 为表单添加变量?我的代码只是一个快速而肮脏的示例,您当然可以根据需要进行修改。
  • 是的,关闭Form2时更改Form1.tag。我应该使用“TForm(Owner).Tag := 9;”或“Form1.Tag := 9;”或任何其他方法吗?
  • 我不确定你想要什么,但我认为你想在这里提出一个新问题。请提出一个新问题,然后我们都可以回复/帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多