Показать сообщение отдельно
  #5  
Старый 21.02.2024, 23:59
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,018
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Если 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.

понятно, что для простоты я все поместил в файл проекта и сделал просто заглушку для процедуры загрузки. по хорошему, все надо вынести в соотв. модули и здесь только вызвать один метод.
Ответить с цитированием