[Poradnik] Robimy System Aktualizacji

Reptile ReX

Użytkownik
Dołączył
Maj 15, 2007
Posty
248
Po dłuższej nieobecności poczułem wielką chęć na napisanie poradnika.

A więc dzisiaj przedstawię ciekawy sposób na stworzenie systemu aktualizacji.

Jak to będzie działać?

1.Będziemy łączyć się z serwerem
2.Dzięki PHP sprawdzimy czy istnieje nowsza wersja
3.Dzięki WebBrowser przeniesiemy Wynik do Memo
4.Odczytamy Memo i sprawdzimy czy znajduje się w nim odpowiedni tekst
5.Jeżeli znajduje się (Istnieje nowsza wersja), wtedy aktywujemy przycisk pobierania
6.Plik pobieramy funkcją URLMON + używamy Funkcji do podania lokalizacji

Co będziemy potrzebować:


-WebBrowser - Z zakładki ActiveX (Import Activex Controls >> Microsoft Internet Controls >> Install
-Serwer WWW z obsługą PHP

Zaczynamy:

Tworzymy plik php o treści:

PHP:
<?php
#Zamiast 1 podajemy cyfrę najnowszej wersji programu w moim wypadku to 1.0 więc 1
$AktualnaWersja = 1;

#Warunek sprawdzający czy GET o nazwie ver jest równy Aktualnej Wersji (czyt. 1)
if (strip_tags($_GET['ver']) == $AktualnaWersja) {
    Echo ("Aktualna-Wersja");
    }

#Warunek sprawdzajacy czy GET jest mniejszy od Aktualnej Wersji (czyt. 1)
if (strip_tags($_GET['ver']) < $AktualnaWersja) {
    
    Echo("Download");
}

?>
Plik nazywamy np: update.php i wgrywamy na nasz serwer WWW

Przechodzimy do Delphi, tworzymy sobie jakąś ładną formę.

Dodajemy Na formę 2x Buttony, WebBrowser, Memo
Można też dodać tak jak ja jakieś wizualne komponenty typu: XPmanifest, ProgressBar, Ikonki

U mnie wygląda do tak:

b64390yqbz5v
b64390yqbz5v_t.jpg


Ustawiamy na formie BorderStyle na bsToolWindow
I zmniejszamy nasze okno aby ukryć Memo oraz Web Browser

Mniej więcej tak:

vje3vh83to9a
8yryf6qhbzr4_t.jpg


Dodajemy do uses:

Kod:
ShlObj, Urlmon
Pod:
Kod:
implementation

{$R *.dfm}
Wklejamy poniższą funkcję:
Kod:
function GetSpecialFolderPath(const Folder: Integer): string;
var
  Path: array[0..MAX_PATH] of Char;
begin
  SHGetSpecialFolderPath(0, Path, Folder , False);
  Result := Path;
end;
Klikamy na Button1 dwukrotnie i wklejamy poniższy kod:

Kod:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Bar.Position := 30;
  Sleep(500);
  WebBrowser1.Navigate('http://adres_twojej_strony.pl/update.php?ver=1');
end;
Teraz w Zdarzeniu OnDocumentComplete w WebBrowser wklejamy:

Kod:
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
    Memo1.Lines.Clear;
    Bar.Position := 60;
    Sleep(500);
    Memo1.Lines.Add(WebBrowser1.OleObject.Document.documentElement.innerText);
    Bar.Position := 100;
    Sleep(500);

if pos('Download',Memo1.Text)<>0 then
begin
  Button1.Enabled := False;
  Button2.Enabled := True;
  MessageBox(0, 'Znaleziono nowszą wersje oprogramowania - Nacisnij "Pobierz"', 'Update', MB_ok + MB_IconInformation);
end
else
  MessageBox(0, 'Posiadasz aktualną wersję oprogramowania', 'Update', MB_ok + MB_IconInformation);
end;
Klikamy dwukrotnie na Button 2 i wklejamy:

Kod:
procedure TForm1.Button2Click(Sender: TObject);
begin
    Bar.Position := 30;
    Sleep(500);
    Bar.Position := 60;
    Sleep(500);
    UrlMon.UrlDownloadToFile(nil,'http://adres_twojej_strony.pl/update.rar',pchar(GetSpecialFolderPath(CSIDL_COMMON_DESKTOPDIRECTORY) + '\update.rar'),0,nil);
    Bar.Position := 100;
    Sleep(500);
    MessageBox(0, pchar('Plik zostal pobrany, scieżka pobranego pliku: "' + GetSpecialFolderPath(CSIDL_COMMON_DESKTOPDIRECTORY) + '\update.rar"'), 'Update', MB_ok + MB_IconInformation);
end;
Kompilujemy i Gotowe !
 

H4jt

Użytkownik
Dołączył
Maj 18, 2010
Posty
19
Build
[Error] Unit1.pas(45): Undeclared identifier: 'Bar'
[Error] Unit1.pas(45): Incompatible types: 'TPosition' and 'Integer'
[Error] Unit1.pas(51): Declaration of 'WebBrowser1DocumentComplete' differs from previous declaration
[Error] Unit1.pas(54): Undeclared identifier: 'Bar'
[Error] Unit1.pas(54): Incompatible types: 'TPosition' and 'Integer'
[Error] Unit1.pas(57): Missing operator or semicolon
[Error] Unit1.pas(57): Incompatible types: 'TPosition' and 'Integer'
[Error] Unit1.pas(72): Undeclared identifier: 'Bar'
[Error] Unit1.pas(72): Incompatible types: 'TPosition' and 'Integer'
[Error] Unit1.pas(74): Missing operator or semicolon
[Error] Unit1.pas(74): Incompatible types: 'TPosition' and 'Integer'
[Error] Unit1.pas(77): Missing operator or semicolon
[Error] Unit1.pas(77): Incompatible types: 'TPosition' and 'Integer'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
i co jest źle?
mam tak

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ImgList, StdCtrls, OleCtrls, SHDocVw_TLB, ShlObj, Urlmon,
ComCtrls, XPMan;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
WebBrowser1: TWebBrowser;
ProgressBar1: TProgressBar;
XPManifest1: TXPManifest;
procedure Button1Click(Sender: TObject);
procedure WebBrowser1DocumentComplete(ASender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
function GetSpecialFolderPath(const Folder: Integer): string;
var
Path: array[0..MAX_PATH] of Char;
begin
SHGetSpecialFolderPath(0, Path, Folder , False);
Result := Path;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
Bar.Position := 30;
Sleep(500);
WebBrowser1.Navigate('http://frag-mexico.cba.pl/update.php?ver=1');
end;

procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
begin
Memo1.Lines.Clear;
Bar.Position := 60;
Sleep(500);
Memo1.Lines.Add(WebBrowser1.OleObject.Document.documentElement.innerText);
Bar.Position := 100;
Sleep(500);

if pos('Download',Memo1.Text)<>0 then
begin
Button1.Enabled := False;
Button2.Enabled := True;
MessageBox(0, 'Znaleziono nowszą wersje oprogramowania - Nacisnij "Pobierz"', 'Update', MB_ok + MB_IconInformation);
end
else
MessageBox(0, 'Posiadasz aktualną wersję oprogramowania', 'Update', MB_ok + MB_IconInformation);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Bar.Position := 30;
Sleep(500);
Bar.Position := 60;
Sleep(500);
UrlMon.UrlDownloadToFile(nil,'http://frag-mexico.cba.pl/update.rar',pchar(GetSpecialFolderPath(CSIDL_COMMON_DESKTOPDIRECTORY) + '\update.rar'),0,nil);
Bar.Position := 100;
Sleep(500);
MessageBox(0, pchar('Plik zostal pobrany, scieżka pobranego pliku: "' + GetSpecialFolderPath(CSIDL_COMMON_DESKTOPDIRECTORY) + '\update.rar"'), 'Update', MB_ok + MB_IconInformation);
end;

end.
tesr.png
 

loganek

Były Moderator
Dołączył
Listopad 11, 2006
Posty
563
nie wiem czy użycie webbrowsera to najoptymalniejszy sposób. nie znam się jakoś super na delphi, ale moge sie założyć że jest tam coś takiego jak sockety. czy nie tego lepiej użyć zamiast webbrowsera?
 
Do góry Bottom