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


Автор: Cashey 9.2.2009, 11:01
при загрузке программы главная форма должна сразу свернутся в трей, без показа пользователю. все в целом сделал, но при загрузке главная форма на мгновенье все же мелькает на экране перед тем как сворачивается в трей.
есть лекарство?

Автор: THandle 9.2.2009, 11:13
Поставить в файле проекта(dpr) до создания главной формы(CreateForm) следующую строчку:
Код


  Application.ShowMainForm := False;


Автор: Frees 9.2.2009, 11:14
WindowState поставить в wsMinimized не помогает?

Автор: Cashey 9.2.2009, 11:22
Цитата(Frees @  9.2.2009,  12:14 Найти цитируемый пост)
WindowState поставить в wsMinimized не помогает?

нет, это не помогает.

Цитата(THandle @  9.2.2009,  12:13 Найти цитируемый пост)
Поставить в файле проекта(dpr) до создания главной формы(CreateForm) следующую строчку:код Pascal/Delphi1:  Application.ShowMainForm := False;

а вот это вроде помогло. щас еще поттестю. спасибо.  smile 

Автор: Cashey 9.2.2009, 11:50
Цитата(THandle @  9.2.2009,  12:13 Найти цитируемый пост)
Application.ShowMainForm := False;

теперь значек мелькает на панели задач перед тем как переместится в трей. это уже менее критично, но все равно не красиво

Автор: THandle 9.2.2009, 11:56
Cashey, странно.... Какая версия Delphi? Какие действия выполняются...? 

У меня в 7, 2009 пустой экземп с таким вот dpr'ом:
Код


program Project1;

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

{$R *.res}

begin
  Application.Initialize;
  Application.ShowMainForm := False;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.


Не мелькает.

Можно попробовать еще что то типа:
http://forum.vingrad.ru/faq/topic-183849.html
(хотя не лучший вариант)


Автор: Cashey 9.2.2009, 12:28
Цитата(THandle @  9.2.2009,  12:56 Найти цитируемый пост)
Cashey, странно.... Какая версия Delphi? Какие действия выполняются...? 

у меня D6
Код
begin
  Application.Initialize;
  Application.Title := 'Отправка сообщения';
  Application.ShowMainForm := False;
  Application.CreateForm(TMainForm, MainForm);
  Application.CreateForm(TFSendMail, FSendMail);
  Application.Run;
end.


Цитата(THandle @  9.2.2009,  12:56 Найти цитируемый пост)
Можно попробовать еще что то типа:http://forum.vingrad.ru/faq/topic-183849.html(хотя не лучший вариант)

там предлженно
Цитата
Теперь допиши после "Application.CreateForm(TForm1, Form1);" строчку "Application.ShowMainForm:=false;". У тебя должно получиться:Код

program Project1; 

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

{$R *.RES} 

begin 
Application.Initialize; 
Application.CreateForm(TForm1, Form1); 
Application.ShowMainForm:=false; 
Application.Run; 
end.


попробую так

Автор: THandle 9.2.2009, 13:38
Cashey, скачал Delphi 6... В пустом тестовом проекте с двумя формами ничего не мелькает на Win XP Pro SP2.

Кинь тогда проектик что ли посмотреть. Может быть затрагивается при сворачивании в трей все это дело? 

Автор: Cashey 9.2.2009, 15:09
Цитата(THandle @  9.2.2009,  14:38 Найти цитируемый пост)
Cashey, скачал Delphi 6... В пустом тестовом проекте с двумя формами ничего не мелькает на Win XP Pro SP2.Кинь тогда проектик что ли посмотреть. Может быть затрагивается при сворачивании в трей все это дело? 

сам проект довольно массивный и скидывать его смысла нет, а сворачивание в трей стандартное, тут никакого велосипеда нет
Код
procedure TMainForm.ControlWindow(var Msg: TMessage);
  begin
  inherited;
      if (Msg.WParam = SC_MINIMIZE) then
      begin
        Application.ShowMainForm := false;
        ShowWindow(Handle, SW_HIDE); // Скрываем программу
        ShowWindow(Application.Handle, SW_HIDE);
        Ic(1, Application.Icon); // Добавляем значок в трей
      end
  end;

Procedure TMainForm.Ic(n:Integer;Icon:TIcon);
  Var Nim:TNotifyIconData; 
begin
 With Nim do
Begin
 cbSize:=SizeOf(Nim);
 Wnd:=MainForm.Handle;
 uID:= n;
 uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
 hicon:=Icon.Handle;
 uCallbackMessage:=wm_user+1;
 szTip:='Агент';
End;

 Case n OF  
 1: Shell_NotifyIcon(Nim_Add,@Nim);
 2: Shell_NotifyIcon(Nim_Delete,@Nim);
 3: Shell_NotifyIcon(Nim_Modify,@Nim);
 End;
end;


ну и в FormCreate
Код
PostMessage(Self.Handle,WM_SYSCOMMAND,SC_MINIMIZE,0);

Автор: THandle 9.2.2009, 15:30
Цитата

Application.ShowMainForm := false;


В данном месте это уже ничего не даст, только до создания форм...

    
Код

PostMessage(Self.Handle,WM_SYSCOMMAND,SC_MINIMIZE,0);


Пример у меня работать почему-то не хочет, но могу предположить, что иконка на панели задач вылазит из за того что сообщение посылается. То есть пока там обработка то до него дойдет... Многое успеется. Можно попробовать SendMessage.
Хотя как то странно. ИМХО:

В dpr пишем Application.ShowMainForm := false;
А в OnCreate главной формы только запуздыриваем иконку в трей, без всяких махинаций с сообщениями.

Автор: Cashey 9.2.2009, 15:35
Кажись нашел проблему.
Дело в том, что хотя PostMessage(Self.Handle,WM_SYSCOMMAND,SC_MINIMIZE,0); и была прописана в FormCreate первой строчкой, за ней шел довольно массивный код по созданию нескольких потоков и инициализации устройств. Возможно исполнение кода из-за этого тормозилось. Вставил application.ProcessMessages; после PostMessage и вроде мелькать перестало. Чуть позже проверю еще на более медленной машине.

Добавлено через 5 минут и 32 секунды
Цитата(THandle @  9.2.2009,  16:30 Найти цитируемый пост)
Пример у меня работать почему-то не хочет

это пример из DRKB статья "Как свернуть прогу в tray?"

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