Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

перерисовка формы-заставки


asdf2 ©   (2008-04-08 12:40:00) 

Добрый день всем.
как заставить SplashForm перерисовывать себя, если в процессе загрузки по ней "проехали" окном другого приложения?

 Application.Initialize;
 Application.CreateForm(TfMain, fMain);
 Application.CreateForm(TfSplash, fSplash);
 fSplash.Show;
 fSplash.Refresh;
 Application.ProcessMessages;
 Application.CreateForm(TdmMain, dmMain);
 fSplash.Hide;
 fSplash.Free;
 Application.Run;


asdf2   (2008-04-08 14:37:00) [1]


> Семеныч   (08.04.08 13:59) [16]

Да, Вы правы, че-то я увлекся.
Всем большое спасибо.


Семеныч   (2008-04-08 13:59:00) [2]

> asdf2   (08.04.08 13:52) [15]

А этотвопрос уже в другуюконфу - WinAPI. См. меню вверху страницы.


asdf2   (2008-04-08 13:52:00) [3]


> DVM ©   (08.04.08 13:44) [14]

млин, а как в окне на апи нарисовать картинку(jpeg)?


DVM   (2008-04-08 13:44:00) [4]


> стал быть надо [1]?

Да, доп. поток + цикл сообщений в нем + окно на API.


asdf2   (2008-04-08 13:42:00) [5]


> DVM ©   (08.04.08 13:38) [11]

там запрос долгий. Даж два.
стал быть надо [1]?


Семеныч   (2008-04-08 13:41:00) [6]

> asdf2   (08.04.08 13:34) [8]

Напишите в главной форме обработчик OnCreate секунд на 30 и посмотрите, что будет.


DVM   (2008-04-08 13:38:00) [7]


> мона так.

так все одно не выйдет ибо VCL таймер тоже построен на сообщениях и они не будут приходить если основной поток будет занят чем то. В твоем случае, я полагаю, он будет занят Application.CreateForm(TdmMain, dmMain);


Семеныч   (2008-04-08 13:37:00) [8]

> asdf2

Более-менее желаемого можно добиться "малой кровью", если во время тех самых операций, из-за которых заставка не перерисовывается, периодически вызывать Application.ProcessMessages (что форсирует перерисовку). Это хуже, чем [1], но намного проще и в конкретном случае может оказаться более-менее приемлемо (а может, и нет - тогда остается только сопсоб [1]).


asdf2   (2008-04-08 13:35:00) [9]

т.е.
fMain.tmrMainTimer(sender: tobject);


asdf2   (2008-04-08 13:34:00) [10]


> Семеныч   (08.04.08 13:25) [7]

Application.Initialize;
Application.CreateForm(TfMain, fMain);
fMain.tmrMain.Enabled := True;
Application.CreateForm(TfSplash, fSplash);
fSplash.Show;
fSplash.Refresh;
Application.ProcessMessages;
Application.CreateForm(TdmMain, dmMain);
fMain.tmrMain.Enabled := False;
fSplash.Hide;
fSplash.Free;
Application.Run;

fMain.tmrMain.OnTimer(sender: tobject);
begin
Application.Proc...
end;

мона так.


Семеныч   (2008-04-08 13:25:00) [11]

> DVM ©   (08.04.08 12:58) [5]

> Сколько заставка должна быть видна на экране.

А это сколько? 5 секунд? Или 10? Или пока не загрузится, не проинициализируется и не покажется главная форма? При том, что мощность и загруженность компа самая разная, а программа еще и коннектится к серверной БД и этот самый сервер тоже может быть загружен, и тоже по-разному?

> Правда в этом случае заставка выполняет роль чисто декоративную. Т.е.
> во время ее работы не выполняется никаких фоновых действий по
> подгрузке/созданию чего бы то ни было.

А за каким же тогда она нужна? В сабже явно сказано, что проблема в перерисовке заставки - значит, происходят еще какие-то действия.


asdf2   (2008-04-08 13:03:00) [12]

всем спс


DVM   (2008-04-08 12:58:00) [13]


> А "нужное" - это сколько?

Сколько заставка должна быть видна на экране. Так же можно добавить досрочную остановку таймера при клике мышкой по заставке или при нажатии esc. Правда в этом случае заставка выполняет роль чисто декоративную. Т.е. во время ее работы не выполняется никаких фоновых действий по подгрузке/созданию чего бы то ни было.


Семеныч   (2008-04-08 12:53:00) [14]

> DVM ©   (08.04.08 12:50) [3]

> таймер на всплывающей форме, который отрабатывает нужное время

А "нужное" - это сколько?


DVM   (2008-04-08 12:50:00) [15]

tmrMain - таймер на всплывающей форме, который отрабатывает нужное время и отключает сам себя.


DVM   (2008-04-08 12:49:00) [16]

Application.Initialize;
 SplashForm := TSplashForm.Create(Application);
 try
   SplashForm.Show;
   SplashForm.Update;
   while SplashForm.tmrMain.Enabled do Application.ProcessMessages;
 finally
   FreeAndNil(SplashForm);
 end;


Семеныч   (2008-04-08 12:47:00) [17]

> asdf2   (08.04.08 12:40)

1. Сделать окно SplashForm без использования VCL.
2. Поместить его в отдельный поток.
3. В этом потоке написать цикл выборки сообщений.

ПыСы.
Я бы все это еще и засунул в DLL. Окно SplashForm нужно только при старте и иногда его используют еще для показа About - в любом случае нет смысла постоянно держать его код и ресурсы в памяти.


Наверх

Титульная страница Поиск, карта сайта Написать письмо