![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
перерисовка формы-заставки
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 - в любом случае нет смысла постоянно держать его код и ресурсы в памяти.