![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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)
| ||