Регистрация Главная Сообщество
Сообщения за день Справка Регистрация

Самообновление программы

-

Вопросы и ответы, обсуждения

- Ваши вопросы по Pascal/Delphi только в данном разделе

Ответ
 
Опции темы
Старый 01.05.2013, 22:18   #1
 Разведчик
Аватар для goul
 
goul никому не известный тип
Регистрация: 23.02.2011
Сообщений: 11
Популярность: 10
Сказал(а) спасибо: 3
Поблагодарили 7 раз(а) в 5 сообщениях
Отправить сообщение для goul с помощью ICQ Отправить сообщение для goul с помощью Skype™
 
Wink Самообновление программы

Доброго времени суток, товарищи кодеры! Я тут задумался над задачкой, а именно над обновлением. Программа должна сама себя обновить (не запуская сторонние приложения). В мозгу сразу возникает план:
  • Проверяем, последняя ли у нас версия
  • Если последняя - даём выполняться программе
  • Иначе:
  • Не открываем главную форму, показываем дочернюю("Вах, старая версия! Я тут обновлюсь, ладно?");
  • Переименовываем уже запущенную версию (да, это можно)
  • Скачиваем новую версию, сохраняем по тому же пути(мы же переименовали старую)
  • Закрываем старую программу и сразу запускаем новую
  • При запуске проверяем, есть ли переименованный файл, если да - удаляем

Вроде не очень сложно. Написал 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! Подскажите, может кто тоже сталкивался

Код:
procedure TForm1.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Int64);
begin
  ProgressBar1.Max := AWorkCountMax;
end;

procedure TForm1.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin
  ProgressBar1.Position := AWorkCount;
  ProgressBar1.Repaint;
  ProgressBar1.Update;
end;

procedure TForm1.IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
  ProgressBar1.Position := 0;
end;
________________
[Ссылки могут видеть только зарегистрированные пользователи. ]

Последний раз редактировалось goul; 02.05.2013 в 17:06. Причина: Добавлено сообщение
  Ответить с цитированием
Пользователь сказал cпасибо:
KiRo_Lajt (17.05.2013)
Старый 03.05.2013, 20:28   #2
 Разведчик
Аватар для goul
 
goul никому не известный тип
Регистрация: 23.02.2011
Сообщений: 11
Популярность: 10
Сказал(а) спасибо: 3
Поблагодарили 7 раз(а) в 5 сообщениях
Отправить сообщение для goul с помощью ICQ Отправить сообщение для goul с помощью Skype™
 
По умолчанию Re: Самообновление программы

Проблема решилась, включением на сервере передачи Content-Length
________________
[Ссылки могут видеть только зарегистрированные пользователи. ]
  Ответить с цитированием
Ответ

Метки
delphi, обновление, программирование, помогите


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Помогите!] Ищу программы Midsummer Общение и обсуждение, архив Lineage 2 1 04.05.2012 02:30
[Гайд] Самообновление sPatch Megaxela Фиксы / Патчи / Программы 15 16.05.2011 15:22

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 09:26.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net