2013-10-26 7 views
0

я использую следующий код:Delphi скрыть форму, не скрыть значок приложения на панели задач

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

Да, form1 получил скрытое и Form2 шоу вверх. Но почему значок приложения на панели задач также скрыт ...

Я использую следующие коды и по-прежнему не могу показать значок на панели задач, а скрыть форму1.

 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.

+0

На панели задач отображаются только видимые окна верхнего уровня. Вы помещаете основную форму на панель задач, и поэтому, когда вы ее скрываете, она удаляется с панели задач. Я должен сказать, что установка MainFormOnTaskbar в False должна быть достаточной. Это будет использовать окно приложения как окно панели задач. –

+0

Это поможет, если вы разместите реальный код. Например, когда вы сказали enable: = False, свойство enable не разрешено. Это также помогло бы, если бы вы дали понять, когда код работает. Только при запуске или в точке, где основная форма уже отображается. –

+0

Внимательно прочитайте мой комментарий. Вы хотите сделать это только при запуске? Или в тот момент, когда основной для уже показывает. Если вы можете просто задать вопрос, вы получите ответ. –

ответ

3

Хорошо, теперь, когда ясно, что вы хотите, первые несколько вещей:

  • Первая форма создается автоматически является 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; 

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; 

Единица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; 

Обратите внимание, что заголовок кнопки на панели задач остается неизменным во время этих изменений. Если вы хотите синхронизировать это с заголовком отображаемой формы, установите Application.Title.

+0

Отлично работает :) ключ находится на Application.MainFormOnTaskbar: = False ... Я ошибся с True ...: P –

+0

в любом случае, как я могу изменить значение .tag для TForm (Владелец) .Show; ? –

+0

Добавить переменную для формы? Этот мой код - это просто быстрый и грязный пример, который, конечно же, вы можете изменить для своих нужд. – NGLN

4

Вы можете переключаться между ручками, показанными на панели задач.
Показать приложение для скрытия и формы при показе.

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; 
+0

Можете ли вы объяснить, почему вам нужна WS_EX_APPWINDOW? –

+0

Могу ли я ссылаться на ваш ответ здесь: http://stackoverflow.com/a/8204574 – bummi

+0

Здесь не нужно * форсировать * здесь. Разве это не окно высокого уровня? Другими словами, это не Params.WndParent равно 0. –

3

Предполагая Form1 будучи основной формой и Form1.Hide делать все, что вы хотите, за исключением того, что кнопка на панели задач должна оставаться видимой, то, что вы действительно хотите сделать, это свести к минимуму применение:

Application.Minimize; 

В противном случае вы, вероятно, ищете Hide the Main Form.

+0

+1 Я согласен с тем, что это действительно так, что действительно необходимо –

+0

Что будет, если я добавлю кнопку, чтобы показать Form2? ваш код работает так, как я хотел, только если я работаю с одной формой. Когда я работаю с более чем одной формой, я минимизирую всю форму ... как свести к минимуму или скрыть другие формы, сохраняя последнюю видимую форму? –

+0

@SidhiCiang Я очень хочу, чтобы вы отредактировали вопрос, как я спросил в своем втором комментарии к вопросу. Я чувствую, что, конечно, мы могли бы дать вам ответ, который вам нужен, если бы вы могли рассказать нам больше о контексте. –

Смежные вопросы