Показать сообщение отдельно
  #11  
Старый 15.04.2017, 19:11
ApxaHGe1 ApxaHGe1 вне форума
Активный
 
Регистрация: 08.04.2008
Адрес: Нижний новгород
Сообщения: 311
Репутация: 38
По умолчанию

Приведу еще раз полный листинг данного юнита, которы работает, делает то что мне нужно... но вот хотелось бы отображение хода процесса загрузки, что бы пользователь е думал что обновление остановилось/не запустилось...
Да же если закрыть форму обновления, то поток то работает как надо, закачивает все файлы обновления......

Помогите сделать прогресс бар ...

Жаль на форуме нет spoiler

Код:
type
   TUpdate = class(TThread)
protected
    procedure Execute; override;
end;

var
Server:string;
FVersion:string;
FSize:string;

HTTP:TIdHTTP;
HTTP2:TIdHTTP;
UpdateForm:TForm;
Update:TUpdate;
UpdateList:TStringList;
TotalSize:integer;
i,n:Integer;
ProgressBar: TProgressBar;
Log:Tmemo;
Stream:TMemoryStream;
FCount:integer;
Timer:TTimer;
//Статус обновления
UpdStatus:integer=0;

procedure Check_Update;


implementation

uses MainForm;


procedure HTTP2Work(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64);
begin
 ProgressBar.Position:= AWorkCount;
end;

procedure HTTP2WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
AWorkCountMax: Int64);
begin
 ProgressBar.Position:= 0;
 ProgressBar.Max:= AWorkcountMax;
end;


procedure TimerTimer(Sender: TObject);
begin
//ShowMessage (IntToStr(Stream.Position));
ProgressBar.Position:=Stream.Position;
end;

//Поток обновления приложения
procedure TUpdate.Execute;
begin
//synchronize(Check_Update);
//Делаем форму видимой из за главной формы
UpdateForm.BringToFront;
//TForm(Sender).BringToFront;
HTTP2:=TIdHTTP.Create(nil);
try
Stream:=TMemoryStream.Create;
//Обрабатываем в цикле информацию о файлах и объем файлов
//для обновления
for FCount:=0 to UpdateList.Count - 1 do
begin
//Выбираем из списка имена файлов обновления
if FCount mod 2 = 0 then
begin
Log.Lines.Add('Загрузка файла: '+UpdateList.Strings[FCount]);
Log.Lines.Add('Размер загружаемого файла: '+UpdateList.Strings[FCount+1]);
HTTP2.Get(Server+UpdateList.Strings[FCount],Stream);
Log.Lines.Add('Stream Pos = '+IntToStr (Stream.Position));
ProgressBar.Max:=StrToInt (UpdateList.Strings[FCount+1]);
Timer.Enabled:=True;
Stream.SaveToFile(ExtractFilePath(ParamStr(0))+'\'+UpdateList.Strings[FCount]+'_');
end;
Stream.Position:=0;
Timer.Enabled:=False;
end;
//Окончание обновления
UpdateForm.Canvas.Create;
Stream.Free;
Log.Lines.Add('Обновление успешно завершено!');
//Теперь нужно перезапустить программу
except
on E: Exception do
      ShowMessage (E.Message);
end;

end;

procedure Check_Update;
begin
try
HTTP:=TIdHTTP.Create(nil);
Server:='http://********.ru/soft/' ;
//получаем версию файла на сервере
FVersion:=HTTP.Get(Server+'ver.txt');
if Form1.Vers = FVersion then
begin
  ShowMEssage ('Вы используете актуальную версию программы!');
  exit;
end;

if Form1.Vers < FVersion then
begin
//Получаем список файлов для обновления
UpdateList:=TStringList.Create;
UpdateList.Text:=HTTP.Get(Server+'FileList.txt');
//Подсчитаем общий объем файлов для скачивания
for I := 0 to UpdateList.Count-1  do
begin
if i mod 2 = 1 then
begin
TotalSize:=TotalSize + StrToInt (UpdateList.Strings[i]) ;
end;

end;
//Закончили расчет общего объема файлов
//Создаем форму и настраиваем ее
UpdateForm:=TForm.Create(nil);
UpdateForm.Position:=poDesktopCenter;
UpdateForm.Caption:='Обновление ...';
UpdateForm.Height:=275;
UpdateForm.Width:=300;
UpdateForm.BorderStyle:=bsToolWindow;
ProgressBar:=TProgressBar.Create(nil);
ProgressBar.Parent:=UpdateForm;
ProgressBar.Height:=30;
ProgressBar.Width:=295;
ProgressBar.Visible:=True;
Log:=TMemo.Create(nil);
Log.Parent:=UpdateForm;
log.Top:=40;
Log.Width:=295;
Log.Height:=200;
Log.ScrollBars:=ssVertical;
Log.ReadOnly:=True;
Log.TabOrder:=4;
//Выведем краткую информацию по обновлению
Log.Lines.Add('========Доступно оновление '+FVersion+'========');
Log.Lines.Add('Количество файлов для обновления: '+IntToStr (UpdateList.Count-2));
Log.Lines.Add('Общий объем обновления: '+IntToStr(TotalSize));
Log.Lines.Add('____________________________________________');
Timer:=TTImer.Create(nil);
Timer.Interval:=500;
Timer.Enabled:=True;
UpdateForm.Show;
//Создадим поток
Update:= TUpdate.Create(false);
Update.Priority:= tpNormal;
Update.FreeOnTerminate:= true;
end;
UpdStatus:=1;
except
on E: Exception do ShowMessage (E.Message);
end;

end;

end.

Вот, сам проект, скомпилированный ... не знаю зачем он тут .. но может просто хотите взглянуть

Клик

Отчет
виртотал
SHA256: b278e03e26dde74ec2b262f25e06c2aead3d99b5a1299d1242 0f2157159c6d7f
Ответить с цитированием