Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Панель задач


Автор: MacTep 14.5.2006, 14:54
Как сделать, чтобы при запуске, окно моей программы не было видно на экране и на панели задач? После некоторой проверки (например, считывание из файла каких-лабо данных) программа становится видна и на экране и в панели задач, либо вообще закрывается и ее выполнение прекращается. 

Автор: Nickel 14.5.2006, 15:09
Свойство формы Visible установи false, а когда проведёшь свою некоторую проверку ставь true.  Кстати если нужно просто скрыть с панели задач, то используй
Код

ShowWindow(Application.Handle,sw_hide);
 

Автор: Guedda 14.5.2006, 15:11
А лучше так:
Код

ShowWindow(Application.Handle,SW_HIDE);
ShowWindow(Application.Form1.Handle, SW_HIDE);
 

Автор: MacTep 14.5.2006, 16:11
Интересное дело, когда я создаю новый проект, свойство Visible формы Form1 уже установлено по умолчанию в False. И, тем не менее, форма при запуске видна. Это первое, что интересно. Второе: форма исчезает только тогда по команде Form1.Visible:=false, когда я эту строчку загоняю в реакцию на нажатие какой-нибудь кнопки. А как это сделать так, чтобы создалось впечатление, как будто форма и не запускалась, а сразу исчезла. Без лишних миганий или чего-либо еще... 

Автор: Guedda 14.5.2006, 16:17
Мой вариант:
Код

procedure TForm1.FormShow(Sender: TObject);
begin
  Form1.AlphaBlend := true;
  Form1.AlphaBlendValue := 0;
  ShowWindow(Application.Handle, SW_HIDE);
  ShowWindow(Application.MainForm.Handle, SW_HIDE);
end;

Формы не видно. Проверено! 

Автор: MacTep 14.5.2006, 16:36
Ну вот это уже гуд... smile Никто же не говорил об AlphaBlend. smile Теперь все встало на свои места. Спасибо. И кстати, советовали сделать так: 
Цитата(Guedda @  14.5.2006,  15:11 Найти цитируемый пост)
ShowWindow(Application.Form1.Handle, SW_HIDE);
Ни фига. Именно надо писать не Form1, а MainForm. smile))
 

Автор: Albinos_x 14.5.2006, 16:52
у меня хватает :
Код
...
ShowWindow (Application.handle, SW_HIDE);
...
 

Автор: Guedda 14.5.2006, 16:56
Цитата(Albinos_x @  14.5.2006,  17:52 Найти цитируемый пост)
у меня хватает :

И на какое событие ты цепляешь это?
У меня, хоть на какое не цепляй, все равно форма виднеется миллисекунду... 

Автор: Albinos_x 14.5.2006, 17:13
одно в проекте и одно при создании формы (просто вешаю на 4 форму и она у меня динамическая, если не вешать второй раз то будет выскакивать...) 

Автор: MacTep 14.5.2006, 22:36
Цитата(Albinos_x @  14.5.2006,  17:13 Найти цитируемый пост)
одно в проекте и одно при создании формы 

Может как раз очень важно, что она у тебя динамическая? У меня форма не динамическая. Да еще, к тому же, она главная в проекте. Проще, думаю, поступить так, как советовал Guedda. Как думаешь?

Добавлено @ 22:43 
Окей, а как после вот этого
Код

ShowWindow(Application.Handle, SW_HIDE);
ShowWindow(Application.MainForm.Handle, SW_HIDE);
снова показать форму?

Добавлено @ 22:47 
И еще, очень интересно: мне нужно что-либо делать в обработчике OnCreate. А скрываю я форму на обработчие OnShow. Но вот косяк, OnCreate происходит раньше, чем OnShow. В итоге. Даже если и форма каким-то странным образом и стала невидимой, то после того, как проходит обработка OnCreate она снова становится видимой, а после этого вновь скрывается. В итоге, ее не видно. Что делать? smile 

Автор: Yanis 14.5.2006, 22:50
Цитата(MacTep @  14.5.2006,  15:54 Найти цитируемый пост)
Как сделать, чтобы при запуске, окно моей программы не было видно на экране и на панели задач? После некоторой проверки (например, считывание из файла каких-лабо данных) программа становится видна и на экране и в панели задач, либо вообще закрывается и ее выполнение прекращается.  

По моему проще вообще не создавать форму, если это не требуется... И ресурсы экономятся и логика программы выравнивается. Например:
Код
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  if { условие } then
    Application.CreateForm(TForm1, Form1)
  else
    { твои действия };
  Application.Run;
end.
 или, если форма всё таки нужна (например для перхвата горячих клавишь), то всё в том же коде проекта использовать свойство ShowMainForm объекта Application. К примеру:
Код
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.ShowMainForm := { условие };
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.


Добавлено @ 22:52 
Конечно ShowMainForm можно использовать во всех пределах видимости TApplication, а не тольков коде проекта smile  

Автор: MacTep 14.5.2006, 23:02
Да дело немного не в том. smile У меня программа работает с мьютексом. И больше одной копии программы запускать не хочу. Все работает, но форма моргает. Вот код:
Код

// Действия, выполняемые при запуске приложения
procedure TMacTepWMForm.FormCreate(Sender: TObject);
var hMutex: THandle;
begin
  hMutex:=CreateMutex(nil, False, 'MyMutex');
  if GetLastError = ERROR_ALREADY_EXISTS then
    begin
      // если вторая копия программы запущена, то
      Application.Terminate;
    end
  else
    begin
      // какие -либо действия

      if ParamCount>0 then
        begin
             // какие-либо действия
        end;
    end;
end;



Добавлено @ 23:02 
как убрать моргание формы при повторном запуске программы? 

Автор: Yanis 14.5.2006, 23:18
Цитата(MacTep @  15.5.2006,  00:02 Найти цитируемый пост)
как убрать моргание формы при повторном запуске программы?

Так, что Yanis Дата 14.5.2006, 23:50 не подходит? 

Автор: MacTep 14.5.2006, 23:24
Цитата(Yanis @  14.5.2006,  22:50 Найти цитируемый пост)
Application.ShowMainForm := { условие };
Вроде подошло. Не знаю, что у меня получится. Но пока это самый приемлемый результат. Хотя бы не моргает форма. Правда у проги есть попытки залезть в пинель задач, но они моментально прерываются. Но все равно, чуть дергается. Этого никак не избежать? smile
 

Автор: Yanis 14.5.2006, 23:40
Цитата(MacTep @  15.5.2006,  00:24 Найти цитируемый пост)
Но все равно, чуть дергается. Этого никак не избежать?
Цитата(Yanis @  14.5.2006,  23:50 Найти цитируемый пост)
вообще не создавать форму
, т.е. создавать по условию.
Код
  if not { мьютекс существует? }
  then Application.CreateForm(TForm1, Form1)
  else { делаешь, что заблагорассудится :) };
 

Автор: Albinos_x 15.5.2006, 02:53
Цитата(MacTep @  14.5.2006,  22:36 Найти цитируемый пост)
снова показать форму?

ущё вариант
Код

ShowWindow(Application.Handle, SW_normal);    
ShowWindow(Application.MainForm.Handle, SW_normal);

Цитата(MacTep @  14.5.2006,  22:36 Найти цитируемый пост)
Может как раз очень важно, что она у тебя динамическая? У меня форма не динамическая. Да еще, к тому же, она главная в проекте. Проще, думаю, поступить так, как советовал Guedda. Как думаешь?

думаю что у тебя из-за 
Цитата(MacTep @  14.5.2006,  22:36 Найти цитируемый пост)
ShowWindow(Application.Handle, SW_HIDE);    
ShowWindow(Application.MainForm.Handle, SW_HIDE);

этого выскакивает, после него и надо ставить... хотя могу ошибаться... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)