// Wenn man seine Programme im Internet veröffentlicht, möchte man evtl. die
// Nutzer auf neue Versionen aufmerksam machen. Dazu legt man eine INI-Datei
// auf dem Server im gleichen Verzeichnis an, deren Name
(nicht die Extension)
// gleich dem Programm ist. In meinem Beispiel heißt das Programm "Kalender.exe"
// und dementsprechend die INI-Datei "Kalender.ini", wobei die neue Version
// auf dem Server gezippt ist und "Kalender.zip" heißt, aber auch anders heißen
// könnte. Die INI-Datei muss natürlich beim Hochladen einer neuen Version
// auch entsprechend gepflegt und hochgeladen werden. Im Beispiel heißt der
// Inhalt dieser INI

[version]
version=3.4

// was mein leicht entsprechend der neuen Version von Hand eintragen kann.
// Dann fügt man der Anwendung ein neues Formular zu. Im Beispiel habe ich
// Das Formular "UpdateForm" genannt und die Unit als "UnitUpdate"
// gespeichert. Dann wird der Projekt-Quelltext angepasst und drei TLabel
// auf die UpdateForm gesetzt. Im dritten Label wird ein Link zum Herunterladen
// der neuen Version angeboten
(siehe Code) und das OnClick-Ereignis im
// Objektinspektor erzeugt. Natürlich könnte man den Code auch so erweitern,
// dass die Installation automatisch durchgeführt wird. Aber der Aufwand lohnt
// meiner Meinung nach nicht immer.



// Getestet mit D4 unter XP

// ----------- Quelltext (geändert) ---------------

program Kalender; 
 
uses 
  Forms, 
  SysUtils, 
  Unit1 in 'Unit1.pas' {Form1}, 
  UnitUpdate in 'UnitUpdate.pas' {UpdateForm}; 
 
{$R *.RES} 
 
var 
  m: TModalresult = 0; 
  s: string; 
 
begin 
  Application.Initialize; 
//Application.CreateForm(TUpdateForm, UpdateForm); 
  s := changefileext(extractfilename(application.exename), '.ini'); 
  if UpdateForm.updaten(url + s, Version) then begin 
    UpdateForm := TUpdateForm.create(application); 
    UpdateForm.ShowModal; 
    m := UpdateForm.ModalResult; 
    UpdateForm.free; 
  end; 
  if m <> 1 then begin 
    Application.CreateForm(TForm1, Form1); 
    Application.Run; 
  end; 
end.


// ----------- Inhalt der Unit ---------------

unit UnitUpdate; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
  StdCtrls; 
 
type 
  TUpdateForm = class(TForm) 
    Label1: TLabel; 
    Label2: TLabel; 
    Label3: TLabel; 
    procedure FormCreate(Sender: TObject); 
    procedure Label3Click(Sender: TObject); 
  private 
    { Private-Deklarationen } 
  public 
    function version2single(v: string): single; 
    function updaten(url, aktuelleVersion: string): boolean; 
    function laden(Source, Dest: string): Boolean; 
  end; 
 
var 
  UpdateForm: TUpdateForm; 
  neu: string; 
 
  Version: string = '3.2.a'; 
  // siehe dazu auch: http://www.s170867368.online.de/delphi/version.php 
 
const 
  url = 'http://www.s170867368.online.de/kalender/'; 
  downloadFile = 'Kalender.zip'; 
 
implementation 
 
{$R *.DFM} 
 
uses URLMON, INIFILES, SHELLAPI; 
 
function TUpdateForm.version2single(v: string): single; 
var p, i: integer; 
  vor, nach, s: string; 
begin 
  result := 0; 
  if v = '' then exit; 
  i := 1; 
  while i <= length(v) do begin 
    if not (v[i] in ['0'..'9', '.']) then begin 
      s := inttostr(ord(v[i])); 
      delete(v, i, 1); 
      insert(s, v, i); 
    end; 
    inc(i); 
  end; 
  p := pos('.', v); 
  if p = 0 then begin 
    vor := v; 
    nach := '0'; 
  end else begin 
    vor := copy(v, 1, p - 1); 
    if vor = '' then vor := '0'; 
    nach := stringreplace(copy(v, p + 1, maxint), '.', '', [rfReplaceAll]); 
    if nach = '' then nach := '0'; 
  end; 
  result := strtofloat(vor + ',' + nach); 
end; 
 
function TUpdateForm.laden(Source, Dest: string): Boolean; 
begin 
  try 
    Result := UrlDownloadToFile(nil, PChar(source), PChar(Dest), 0, nil) = 0; 
  except 
    Result := False; 
  end; 
end; 
 
function TUpdateForm.updaten(url, aktuelleVersion: string): boolean; 
var 
  pfad: string; 
  versionNeu: TInifile; 
begin 
  result := false; 
  pfad := extractfilepath(application.exename); 
  if ansilastchar(pfad) <> '\' then pfad := pfad + '\'; 
  pfad := pfad + '~tmp~.ini'; 
  if laden(url, pfad) then 
  begin 
    versionNeu := TiniFile.Create(pfad); 
    neu := versionNeu.Readstring('version', 'version', aktuelleVersion); 
    versionNeu.Free; 
    result := version2single(aktuelleVersion) < version2single(neu); 
    deletefile(pfad); 
  end; 
end; 
 
procedure TUpdateForm.FormCreate(Sender: TObject); 
begin 
  caption := 'Neue Programm-Version'; 
  borderStyle := bsSingle; 
  bordericons := [biSystemMenu]; 
  setbounds((screen.width - width) div 2, (screen.height - height) div 2, 
    width, height); 
  Label1.Font.Style := [fsBold]; 
  Label1.caption := 'Es ist eine neue Programm-Version verfügbar.'; 
  Label2.caption := 'aktuell = ' + version + '   |   neu = ' + neu; 
  Label3.Font.Style := [fsUnderline]; 
  Label3.Cursor := crHandPoint; 
  Label3.Font.color := clBlue; 
  Label3.caption := url + downloadFile; 
end; 
 
procedure TUpdateForm.Label3Click(Sender: TObject); 
begin 
  if shellexecute(handle, 'open', PChar(label3.caption), nil, nil, 1) > 32 
    then modalresult := mrOk 
  else begin 
    visible := false; 
    application.processmessages; 
    showmessage('Fehler bei Aufruf des Browsers!'); 
    modalresult := mrCancel; 
  end; 
end; 
 
end.



 

Zugriffe seit 6.9.2001 auf Delphi-Ecke