Доброго времени суток, товарищи кодеры! Я тут задумался над задачкой, а именно над обновлением. Программа должна сама себя обновить (не запуская сторонние приложения). В мозгу сразу возникает план:
Проверяем, последняя ли у нас версия
Если последняя - даём выполняться программе
Иначе:
Не открываем главную форму, показываем дочернюю("Вах, старая версия! Я тут обновлюсь, ладно?");
Переименовываем уже запущенную версию (да, это можно)
Скачиваем новую версию, сохраняем по тому же пути(мы же переименовали старую)
Закрываем старую программу и сразу запускаем новую
При запуске проверяем, есть ли переименованный файл, если да - удаляем
Вроде не очень сложно. Написал php код:
PHP код:
<?php $ver = $_POST['version']; $result = '13'; if ($result != $ver) exit('2: Old version'); exit('1: Success');
Обращаюсь к нему при создании главной формы
Код:
procedure TMain.FormCreate(Sender: TObject);
var
newForm:Tform;
get,q:string;
Login:TStringList;
Otvet:TStringStream;
a,b: Extended;
begin
if fileExists(ExtractFilePath(Application.ExeName)+'Launcher~old.file') then
begin
deleteFile(ExtractFilePath(Application.ExeName)+'Launcher~old.file');
end;
idhttp1.Request.UserAgent:=agent;
Login:= TStringList.Create;
Otvet := TStringStream.Create('');
try
Login.Add('version='+version);
idhttp1.post(url+folder+'/update.php',Login,Otvet);
finally
q:=otvet.DataString;
Login.Free;
Otvet.Free;
end;
delete(q,2,length(q));
if q='2' then
begin
//renameFile(ExtractFilePath(Application.ExeName)+'Launcher.exe',ExtractFilePath(Application.ExeName)+'Launcher~old.file');
end;
И вот тут самое интересное: свежая версия может загружаться не одну минуту. Значит, мне нужно заставить неожиданно выскакивать дочернюю форму. Пробовал просто создавать её через application.createForm, однако компилятор жутко кроет матом, когда показываешь дочернюю MDI форму наперёд основной. Есть ли иной способ выказать форму? Или только сделав форму обновления основной?
Добавлено через 18 часов 47 минут
Всё оказалось проще, вот, сделал без лишних форм через FormActivate и FormCreate
Код:
procedure TForm1.FormActivate(Sender: TObject);
var
stream: tmemorystream;
begin
if Edit1.Text = '2' then
begin
renameFile(ExtractFilePath(Application.ExeName) + 'launcher.exe',
ExtractFilePath(Application.ExeName) + 'launcher.exe~old');
stream := tmemorystream.Create();
try
IdHTTP1.Get(url + folder + 'update/Launcher.exe', stream);
stream.savetofile(ExtractFilePath(Application.ExeName) + 'launcher.exe')
finally
stream.Free;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
q: string;
Login: TStringList;
Otvet: TStringStream;
begin
if fileExists(ExtractFilePath(Application.ExeName) + 'launcher.exe~old') then
begin
deleteFile(ExtractFilePath(Application.ExeName) + 'launcher.exe~old');
end;
IdHTTP1.Request.UserAgent := agent;
Login := TStringList.Create;
Otvet := TStringStream.Create('');
try
Login.Add('version=' + version);
IdHTTP1.post(url + folder + 'update.php', Login, Otvet);
finally
q := Otvet.DataString;
delete(q, 2, length(q));
Edit1.Text := q;
Login.Free;
Otvet.Free;
end;
end;
Но тут появилась новая трабла: на моём XE3 Delphi не работают вместе ProgressBar и idHTTP! Подскажите, может кто тоже сталкивался