Показать сообщение отдельно
  #18  
Старый 29.01.2010, 08:17
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Цитата:
Сообщение от Chuwis720
А нельзя сие реализовать так, как начал я (через While ... do... position:=position+random(a); ), только с использованием потоков?
Смотри код в сообщении № 13
Inc(FPos, random(15)); это аналог FPos := FPos + random(15);
И т.к. работу с визуальными компонентами из потока надо синхронизировать выделен метод
Код:
procedure TNewThead.SetPos;
begin
  Form1.ProgressBar1.Position := FPos;
  FPos := Form1.ProgressBar1.Position;
end;
Да и в сообщении №16
метод TMainTestForm.InThreadProc выполняется в потоке в цикле и ATerminate := (NextPos > 100); можно считать аналогом While

Вообще прикрепленный к сообщению №16 проект сделан универсальным.
Достаточно в любой проект скопировать модули UProgressForm и UProgressThread.
Создать в любой форме метод
Код:
procedure InThreadProc(var NextPos: Integer; var ATerminate: Boolean);

и запустить его командой
TProgressForm.ShowInThreadProc('Заголовок', 'Сообщение', InThreadProc, Self)

Он будет циклически выполняться в отдельной нити пока ATerminate не присвоить True.
При этом в модальном окне TProgressForm будет отображаться прогресс выполнения, задаваемый NextPos.

Вид модального окна конечно можно менять.

Нашел еще одну недопечатку - перезалил
Код:
procedure TProgressThread.Execute;
//...
    if needTerminate then
      Terminate
    else
      Synchronize(SetPos);
Ответить с цитированием