Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Application.ProcessMessages & ProgressBar


Автор: csander 24.3.2010, 00:13
Суть проблемы:
Я создаю отчет (набор XML файлов). Количество файлов варьируется от 10 до 30. Чтобы показать процесс создания этих файлов я использую ProgressBar. Но ProgressBar "заполняется" на 100% только по окончании создания файлов. 
Можно ли обойтись без TThread?

Создаем ProgressBar:
Код

procedure TForm1.FormCreate(Sender: TObject);
begin
  ProgressBar := TProgressBar.Create(StatusBar2);
  ProgressBar.Parent := StatusBar2;
  ProgressBar.Position := 0;
  ProgressBar.Visible :=false;
  ProgressBar.Left := StatusBar2.Panels[0].Width+StatusBar2.Panels[1].Width + 1;
  ProgressBar.Height := 17;
  ProgressBar.Width := 150;
  ProgressBar.Top := 2;
end;


Создаем отчет:
Код

procedure TForm1.XMLreportCreate(Sender: TObject);
var
  XML: TStringList;
  error,i,j: integer;
  stream : TStream;
  ext:string;
begin
  {$IOChecks off}
  MkDir('Отчеты');
  error := IOResult;
  ProgressBar.Visible := true;
  ProgressBar.Min := 0;
  ProgressBar.Max := 23;
  ProgressBar.Position :=0;
  StatusBar2.Panels[3].Text := 'Создание отчета...';
  stream := TMemoryStream.Create;
  XML := TStringList. Create;
  XML.Clear;
  XML.Add ('.........');
  .........................
  XML.SaveToFile('Отчеты\Report1.xml');
  ProgressBar.StepBy(1);
  FreeAndNil(stream);
  Application.ProcessMessages();
  stream := TMemoryStream.Create;
  XML.Clear;
  XML.Add ('........');
  ...............................
  XML.SaveToFile('Отчеты\Report2.xml');
  ProgressBar.StepBy(1);
  FreeAndNil(stream);
  Application.ProcessMessages();
  //и т.д.
  FreeAndNil (XML);
  StatusBar2.Panels[3].Text := 'Отчет создан...';
  ProgressBar.Visible := false;
end;

Автор: Данкинг 24.3.2010, 00:28
Ну так а с Application.ProcessMessages что не получается?

Автор: csander 24.3.2010, 08:24
у меня уже стоит Application.ProcessMessages. Во время процесса появляется только первое деление и все. В конце сразу полностью заполняется.

Автор: Dom 24.3.2010, 08:39
Мммм, может поставить перед вызовом Application.ProcessMessages что-то вроде ProgressBar.Refresh?

Автор: former 24.3.2010, 09:04
csander, ты только в двух местах увеличиваешь значение Position. А максимальное значение у тебя 23.
Код

ProgressBar.Max := 23;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)