|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Паттерн запуска логоокна
Здравствуйте, уважаемые любители и профессионалы.
У меня есть задача создать логоокно перед запуском основного окна, в котором бы отображался процесс загрузки основного окна (там длительные по времени процессы). Есть ли у вас какой-то готовый паттерн? Сейчас я делаю вот так (упрощенно) Код:
constructor TForm1.Create(AOwner: TComponent); begin inherited; logoForm:=TLogoForm.Create(Application); TThread.ForceQueue(nil, procedure begin for var I:byte := 0 to 4 do begin sleep(2000); logoform.p.Position:=logoform.p.Position+10; end; end ); logoform.Showmodal; end; |
#2
|
|||
|
|||
Канечна не прорисовывается, ибо прерисовка основана на сообщениях, а до Application.Run обработчик сообщений приложения просто еще не запущен. Тебе надо вручную вызывать Repaint для обновления.
|
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
T232006 (21.02.2024)
|
#3
|
|||
|
|||
Repaint не помог, но если в потоке поставить Application.ProcessMessages, тогда работает. Только обязательно после закрытия этого окна нужно остановить поток, иначе будет происходить хаос.
Еще можно убрать synchronize и тоже будет всё работать Последний раз редактировалось T232006, 21.02.2024 в 11:31. |
#4
|
|||
|
|||
Проблема в том как у вас организован процесс загрузки данных. Добавьте в процедуру загрузки вызовы Application.ProcessMessages.
|
#5
|
|||
|
|||
Если Repaint не помог, значит надо Invalidate вызвать.
Собственно, просто не помню какой из них работает через сообщения, а который делает прямое обновление. Собственно, проблема понятна из описания почему не обновляется. Еще пара замечаний по коду. Форму надо показывать через Show, не через ShowModal. sleep вообще-то блокирует все нафиг, не помню как он работает внутри потока. Лучше использовать System.Classes.TThread.Sleep Вообще, я делал такие формы немного подругому. Во первых, из создание, показ, обновление и удаление делалось в файле проекта. Во вторых, форма показывалась через Show, но была без заголовка и Topmost (что бы пользователь видел ее но не мог закрыть). В третьих, надо вешать курсор ожидания. А в остальном - все то же самое. Вот так все работает: Код:
type TLoadProc = procedure; procedure LoadProc; begin sleep(1500); end; const LoadTasks : Array[1..4] Of TLoadProc = (LoadProc, LoadProc, LoadProc, LoadProc); var I : Integer; begin Application.Initialize; LogoForm := TLogoForm.Create(Nil); LogoForm.ProgressBar1.Min := 0; LogoForm.ProgressBar1.Max := High(LoadTasks); LogoForm.ProgressBar1.Position := 0; Try LogoForm.Show; for I := Low(LoadTasks) to High(LoadTasks) do begin LogoForm.Label1.Caption := 'Running load task ' + IntToStr(I); LogoForm.ProgressBar1.Position := I; LogoForm.Repaint; LoadTasks[i]; end; Finally LogoForm.Free; End; Application.MainFormOnTaskbar := True; Application.CreateForm(TMainForm, MainForm); Application.Run; end. понятно, что для простоты я все поместил в файл проекта и сделал просто заглушку для процедуры загрузки. по хорошему, все надо вынести в соотв. модули и здесь только вызвать один метод. Последний раз редактировалось lmikle, 22.02.2024 в 00:05. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
T232006 (03.03.2024)
|