AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Einfaches Online Update
Tutorial durchsuchen
Ansicht
Themen-Optionen

Einfaches Online Update

Ein Tutorial von Larsi · begonnen am 29. Jan 2008 · letzter Beitrag vom 28. Feb 2009
Antwort Antwort
Seite 5 von 7   « Erste     345 67      
Larsi
Registriert seit: 10. Feb 2007
Hi,
bitte nicht so hart mit mir sein, denn das ist mein erster Beitrag für die Code-Lib!
Mithilfe dieser Anleitung ist es möglich ein kleines aber feines Online- Update zu realisieren!
Der Grundgedanke ist, dass man eine Textdatei auf einem Server downloadet, diese ausliest und dann prüft ob ein Update notwendig ist und gegebenfalls downloaden!
Dies sollte in gut einer halben Stunde zu schaffen sein. Kein wirklich großer Aufstand, da eine Update- Funktion ja gar nicht so schwer sein muss
Anleitung:
Zuerst downloadet man sich ja die Textdatei:
Delphi-Quellcode:
uses
  URLMon;

procedure TForm1.Button1Click(Sender: TObject);
var
  Datei,Ziel:PChar;
begin
  try
    Datei := 'http://www.DieSeite/DieDatei.txr';
    Ziel := 'C:\Windows\Desktop\DieDatei.txt';
    UrlDownloadToFile(nil, Datei, Ziel, 0, nil);
     
  except
ShowMessage('Ein Fehler ist aufgetreten! Programm wird beendet!');
Form1.Close;
  end;
end;
end;
Dies kann man entweder so wie gerade beschrieben oder halt über die Indys tun!
Bei "Datei" die Textdatei auf deinem Server eintragen, bei "Ziel" das Ziel^^
Ich würde euch empfehlen, die Datei im Ordner deiner Anwendung zu downloaden. Und vergesst nicht, sie am Schluss wieder zu löschen, den sonst entsteht Datenmüll:
DeleteFile('Pfad der Textdatei.txt'); Die Textdatei würde ich wie folgt aufbauen: GANZ WICHTIG: Die Beschrieung darf nur eine Zeile in Anspruch nehmen, da wir ja gleich die einzelnen Zeilen auslesen, aber auch eine Zeile kann ja ziemlich viele Buchstaben enthalten...!
Zur Erklärung:
1. Zeile := Die Version ohne einen Punkt in der Mitte damit man Sie mit < bzw. > dann später vergleichen kann
2. Zeile := Die Version so, wie Sie der User dann sehen wird um dann zu entscheiden ob er ein Update will oder nicht
3. Zeile := Die Datei, die gedownloadet werden soll
4. Zeile := Die Beschreibung warum ein Update gemacht werden soll bzw. die Update- Erneuerungen

Dann noch in eurem Programm die Textdatei öffnen:
Delphi-Quellcode:
var
List: TStrings;
begin
List := TStringList.Create;
try
  List.LoadFromFile('C:\UpdateDatei.txt');
  if List.Count>0 then
    Edit1.Text:=List[0];
finally
  List.Free;
end;
end;
Das Edit1.text := List[0] list die erste Zeile aus wenn ihr da [1] reinschreibst halt die 2. Zeile und immer so weiter.

Wenn ihr das so für alle vier Zeilen gemacht hast, steht im ersten Edit die Version im 2. Edit die Version mi nem Punkt in der Mitte zur Übersicht und so weiter...
Dann könnt ihr ja ein Label auf euer Form ziehen in dem z.B.: 31(für Version 3.1) drinnen steht und das vergleichst du dann mit Edit1.text:
Die Überprüfung ob ein Update von Nöten ist (in diesem Fall nämlich nicht!):
Delphi-Quellcode:
if StrToInt(Edit1.text) > StrToInt(Label1.caption) then
ShowMessage('Es ist ein Update möglich!')
else
ShowMessage('Es ist kein Update nötig! Die Software ist auf dem neusten Stand'!);

Wenn ein Update möglich ist dann macht ihr wieder die Download Procedur mit dem Link aus deiner gedownloadeten Textdatei!
Was ich euch noch empfehlen kann ist ein Vorschau- Fenster wo noch Beschreibung und so drinnen steht:
Gehen wir mal davon aus, das das Vorschau Form den Namen Form2 trägt und sich auf diesem ein paar Labels und ein Memo- Feld befinden, dann müsste man ja nurnoch mit der Textfeld- Laden Procedur die einzelnen Zeilen auslesen und Fertig! Das mit dem Memo würde ich empfehlen für die Beschreibung, da diese in einem einzigen Label wohl kaum Platz finden könnte!
Außerdem sollte die alte Version des Programmes dann selbst gelöscht werden nach Nachfrage!
Auch eine ProgressBar für dein Fortschritt kann man einbauen, ist aber bei kleineren Dateien sinnlos:
Dafür wurde von BullsEye ein Thread aufgemacht, der euch bestimmt weiterhelfen kann.


Solltest ihr noch Fragen haben, stellt sie einfach!
Hoffe ich konnte euch damit helfen!

Falls Ihr euch das Update und so mal angucken wollt, dann downloadet doch einfach meinen Passwort Saver, denn dort ist GENAUS DAS VERFAHREN drinnen!
MFG Lars Wiltfang

[edit=Matze]Dieses Thema reicht nicht ganz aus, um in die Code-Library aufgenommen zu werden. MfG, Matze[/edit]
Ein Tag ohne Delphi ist ein verlorener Tag!

Homepage zu meinem neuen Programm: StreamZ
 
Benutzerbild von Poseidon
Poseidon

 
Delphi 2005 Personal
 
#41
  Alt 11. Jul 2008, 18:23
Ne, beim öffnen der Seite wird die Exe ausgeführt sprich das installationsprogramm startet. Der Anwender drückt auf installieren und das Programm wird insstalirt.
Aber du hast recht, der Anwender erwartet nichts tun zu müssen um das Programm upzudaten.
  Mit Zitat antworten Zitat
gmc616

 
Delphi 10.3 Rio
 
#42
  Alt 11. Jul 2008, 19:38
Zitat von Poseidon:
Ne, beim öffnen der Seite wird die Exe ausgeführt sprich das installationsprogramm startet.
Bei mir nicht. Und ich denke bei den meisten Usern auch nicht. Im Gegenteil.
Es kommt ein Speicherndialog und danach wird die Datei gespeichert. Und wenn ich versuche die Datei zu öffnen, warnt mich sogar der Browser vorher, die Exe zu starten.

Wäre zu krass, wenn mein Rechner einfach eine Datei, die er aus dem Internet lädt, sofort öffnen würde.

So ein Online-Update wäre sehr benutzerunfreundlich und wüsste genau, dass ich diese Software nie wieder verwenden bzw. updaten würde.

Nix für ungut.

So und nun ab in den Urlaub.
  Mit Zitat antworten Zitat
Benutzerbild von Poseidon
Poseidon

 
Delphi 2005 Personal
 
#43
  Alt 12. Jul 2008, 18:32
Ok, Ok, vielleicht hast du ja recht. Aber wie downloadet und installiert man die software (update der software) dann??
Also das fehlt im Toturial noch, obwohl es doch eigendlich darum im Tutorial gehen sollte.
  Mit Zitat antworten Zitat
Larsi

 
Delphi 2007 Professional
 
#44
  Alt 12. Jul 2008, 20:00
Du meinst das die alte Datei gelöscht wird und die neue startet?
  Mit Zitat antworten Zitat
Benutzerbild von Missionar
Missionar
 
#45
  Alt 13. Jul 2008, 10:12
Könnte diesen Thread bitte mal jemand nach Klatsch und Tratsch verschieben. Mit Tutorial hat dies nun wirklich nichts zu tun.
  Mit Zitat antworten Zitat
Benutzerbild von Poseidon
Poseidon

 
Delphi 2005 Personal
 
#46
  Alt 13. Jul 2008, 11:20
@Larsi Genau das! Das fehlt im Titurial und dabei sid das doch einer der wichtigsten Stellen. Oder glaubst du der Anwender freud sich wenn er die Meldung bekommt: Update möglich, er drückt updaten und nichts geschiet?
  Mit Zitat antworten Zitat
Benutzerbild von SaFu
SaFu

 
Delphi 10.3 Rio
 
#47
  Alt 14. Jul 2008, 09:32
So ich habe Poste mal mein Update, ich habe es auf der Basis von Larsi aufgebaut.

Delphi-Quellcode:
  private
  bUpdateNochOffen : Boolean;
  function IsInternetConectet: Boolean; // Internetverbindung überprüfen
  procedure DownloaddateiPruefen;

  public
  INIEinstellungenProgramm,IniProgrammeinstellung :TFileName;
  
  {Constanten für Ini.}
  const DownloadInfo = 'DownloadInfo';
        BtnUpdatInstall = 'Installation steht noch aus';
        BtnUpdateueberp = 'Updateüberprüfung';
        BtnDownload = 'Downloaden';

        ProgrammInfo = 'Programminfo';
        Programmversion = 'Programmversion';

  end;

var
  UpdateForm: TUpdateForm;

implementation


{$R *.dfm}

{ TUpdateForm }

//=====Einstellungen laden=============================
procedure TUpdateForm.FormShow(Sender: TObject);
begin
  Edit5.Text:= Form1.GetFileVersion(ParamStr(0)); // Programversion auslesen

  if not FileExists(ExtractFilePath(ParamStr(0))+ 'Einstellungen\ProgrammSettings.ini') then
   begin
    IniProgrammeinstellung:= (ExtractFilePath(ParamStr(0))+ 'Einstellungen\ProgrammSettings.ini');
     begin
      with TMemIniFile.Create(IniProgrammeinstellung ) do
      try
       begin
        WriteString(Programminfo,Programmversion,'0');
        WriteBool(DownloadInfo,BtnUpdateueberp,True);
        WriteBool(DownloadInfo,BtnDownload,False);
        WriteBool(DownloadInfo,BtnUpdatInstall,False);
        UpdateFile;
       end;
      finally
       Free;
      end;
     end;
   end;
   
  // Lokale Einstellungen für Programm
  IniProgrammeinstellung:= (ExtractFilePath(ParamStr(0))+ 'Einstellungen\ProgrammSettings.ini');
   with TMemIniFile.Create(IniProgrammeinstellung) do
    try
     Label11.Caption:= ReadString(Programminfo,Programmversion,Label11.Caption);
     BtnUpdateUeberpruefung.Enabled:= ReadBool(DownloadInfo,BtnUpdateueberp,BtnUpdateUeberpruefung.Enabled);
     BtnUpdateDownloaden.Enabled:= ReadBool(DownloadInfo,BtnDownload,BtnUpdateDownloaden.Enabled);
     BtnUpdateInstallieren.Enabled:= ReadBool(DownloadInfo,BtnUpdatInstall,BtnUpdateInstallieren.Enabled);
     bUpdateNochOffen:= ReadBool(DownloadInfo,BtnUpdatInstall,bUpdateNochOffen);
    finally
     Free;
    end;


  if bUpdateNochOffen = True then // wenn das Installieren des Updates noch aussteht
   begin
    Label15.Visible:= True;
    Label15.Font.Color:= ClRed;
    Label15.Caption:= ('Update Installation steht noch aus!!!');
   end
  else
  begin
   Label15.Visible:= False;
  end;
end;


//=========Updateüberprüfung starten==================
procedure TUpdateForm.Button2Click(Sender: TObject);
var DownloadDatei,DownloadZiel: PChar;
begin
 try
   if IsInternetConectet = True then // Internet Verbindung da
    begin
     ProgressBar1.Position:= 0;
     Label6.Font.Color:= ClLime;
     Label6.Caption:= 'Überprüfung gestartet';
      try
       DownloadDatei:= 'http://Techniker-werden.de/update/UpdateDatei.txt'; // Von Internetseite Versions Info
       DownloadZiel:= PChar(ExtractFilePath(ParamStr(0))+ 'Einstellungen\System\UpdateDatei.txt'); // Ins Zielverzeichnis
      
       UrlDownloadToFile(nil, DownloadDatei, DownloadZiel, 0, nil); Von --> Nach Downloaden
       
       Label6.Font.Color:= ClLime;
       Label6.Caption:= 'Überprüfung beendet';

      except
       Label6.Font.Color:= ClRed;
       Label6.Caption:= ('Überprüfung abgebrochen');
      end;
     DownloadDateiPruefen;
    end
   else
   begin
    Form1.MessageDlgPos2('Es besteht keine Verbindung zum Internet',mtInformation,[mbOk],self);
    BtnUpdateInstallieren.Enabled:= False;
    Edit5.Text:= Form1.GetFileVersion(ParamStr(0));// versionsnummer anzeigen
   end;
  except
   Form1.MessageDlgPos2('Unbekannter Fehler',mtInformation,[mbOk],self);
 end;
end;

//========exe updaten==========================================================
procedure TUpdateForm.Button3Click(Sender: TObject);
var DownloadEXE,DownloadEXEZiel: PChar;
begin
 TimerLabelBlinken.Enabled:= False; // Blinken von Label wenn Update vorhanden

 Label7.Visible:= true;
 Label7.Font.Color:= ClLime;
 Label7.Caption:= ('Download wird gestartet bitte warten');

 Label12.Font.Color:= ClLime;
 Label12.Caption:= 'Download wird gestartet bitte warten';

  try
    DownloadEXE:= 'http://Techniker-werden.de/update/Programm.exe'; // Programm Downloaden
    DownloadEXEZiel:= PChar(ExtractFilePath(ParamStr(0))+ 'Einstellungen\System\Programm.exe'); //ns Zielverzeichnis
   
    UrlDownloadToFile(nil, DownloadEXE, DownloadEXEZiel, 0, nil); Von --> Nach Downloaden
   
    TimerProgressbar.Enabled:= True;
  except
    Label12.Font.Color:= ClRed;
    Label12.Caption:= ('Download abgebrochen');
  end;

  BtnUpdateDownloaden.Enabled:= False; // Button Downloaden

 IniProgrammeinstellung:= (ExtractFilePath(ParamStr(0))+ 'Einstellungen\ProgrammSettings.ini');
  begin
   with TMemIniFile.Create(IniProgrammeinstellung ) do
    try
      begin
       WriteBool(DownloadInfo,BtnUpdatInstall,True);
       WriteBool(DownloadInfo,BtnUpdateueberp ,False);
       WriteBool(DownloadInfo,BtnDownload,False);
       UpdateFile;
      end;
      finally
     Free;
    end;
  end;
  Label6.Font.Color:= ClBlack;
  Label6.Caption:= 'Nicht aktiv';
end;


//==========Textdatei auslesen mit Versionsinfo auslesen================================
procedure TUpdateForm.DownloaddateiPruefen;
Var List: TStrings;
begin
 List:= TStringList.Create;
 try
  List.LoadFromFile(ExtractFilePath(ParamStr(0))+ 'Einstellungen\System\UpdateDatei.txt');
  if List.Count>0 then
    Edit1.Text:=List[0];
    Edit2.Text:=List[1];
    Edit3.Text:=List[2];
    Edit4.Text:=List[3];
 finally
  List.Free;
 end;

 //Edit1 und Label11 sind Visble:= False dient nur im Hintergrund zur Überprüfung
 if StrToInt(Edit1.text) > StrToInt(Label11.Caption) then
  begin
   TimerProgressbar.Enabled:= True;
   Label7.Font.Color:= ClLime;
   Label7.Caption:= ('Es ist ein neues Update vorhanden!');
   BtnUpbdateDownloaden.Enabled:= True;
  end
 else
  begin
   Label7.Font.Color:= ClRed;
   Label7.Caption:= ('Sie haben das aktuellste Update!');
   BtnUpdateDownloaden.Enabled:= False;
  end;
end;


//=========download Progrssbar=================================================
procedure TUpdateForm.TimerProgressbarTimer(Sender: TObject);
begin
 Label7.Font.Color:= ClLime;
 Label7.Caption:= ('Update Download gestartet');

 Label12.Font.Color:= ClLime;
 Label12.Caption:= 'Update Download gestartet';
  ProgressBar1.Position := ProgressBar1.Position + 33;
  if ProgressBar1.Position = 99 then
    begin
      ProgressBar1.Position := 100;

      Label7.Font.Color:= ClLime;
      Label7.Caption:= ('Download erfolgreich beendet');

      Label12.Font.Color:= ClLime;
      Label12.Caption:= 'Download erfolgreich beendet';
      TimerProgressbar.Enabled := False;
      BtnUpdateInstallieren.Enabled:= True;
    end;

 IniProgrammeinstellung:= (ExtractFilePath(ParamStr(0))+ 'Einstellungen\ProgrammSettings.ini');
  begin
    with TMemIniFile.Create(IniProgrammeinstellung ) do
    try
      begin
       WriteString(ProgrammInfo,Programmversion,Edit1.Text);
       UpdateFile;
      end;
      finally
     Free;
    end;
  end;
end;

//===============Updater aufrufen===============================================
procedure TUpdateForm.Button4Click(Sender: TObject);
begin
 if Form1.MessageDlgPos2('Um das Update zu installieren wird das Programm beendet',mtInformation, [mbNo,mbYes],self) = mrYes then
  begin
    BtnUpdateInstallieren.Enabled:= False; //Button Installieren
    
    // Updater aufrufen
    if ShellExecute(Application.Handle,'open',PChar(ExtractFilePath(ParamStr(0)) +'Updater.exe'),Nil, Nil,SW_NORMAL) >= 32 then

    MainForm.Close; // Programm Schließen

    Label12.Caption:= ('Status');
    Progressbar1.Position:= 0;
  end
 else
  begin

  end;
end;

//===========für Blinken vom Label========================
procedure TUpdateForm.Timer2Timer(Sender: TObject);
begin
 Label7.Visible:= Not Label7.Visible;
 BtnUpdateDownload.Enabled:= true;
end;

//Internetverbindung Überprüfen============================
function TUpdateForm.IsInternetConectet: Boolean;
begin
if InternetGetConnectedState(nil,0) then
 begin
   Result:= True;
 end
else
 begin
   Result:= False;
 end;
end;
so bis hier hin war das die Updateüberprüfung und das Downloaden

Jetzt Kommt das Kopieren und Ersetzen des Programms, dazu wurde vorher das Hauptrogramm geschlossen und ein anderes gestartet das sich im Programmverzeichnis befindet.

Delphi-Quellcode:
private
  IniProgrammeinstellung :TFileName;
  Datei :Textfile;

public
  ServerPfad :String;
 
 Const
   ProgrammInfo = 'Programminfo';
   Programmversion = 'Programmversion';

   DownloadInfo = 'DownloadInfo';
   BtnUpdatInstall = 'Installation steht noch aus';
   BtnUpdateueberp = 'Updateüberprüfung';
   BtnDownload = 'Downloaden'; { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


//====Programm löschen und Timer für Kopie starten========
procedure TForm1.Button1Click(Sender: TObject);
begin
 DeleteFile(ExtractFilePath(ParamStr(0)) + 'Programm.exe');
 TimerUpdaten.Enabled:= True;
end;

//==Progessbar und Kopieren starten========================
procedure TForm1.TimerUpdatenTimer(Sender: TObject);
begin
 TimerKopieren.Enabled:= True; // Kopieren starten

  ProgressBar1.Position:= ProgressBar1.Position + 33;
  if ProgressBar1.Position = 99 then
    begin
      ProgressBar1.Position:= 100;
      TimerUpdaten.Enabled:= False;
    end;
end;

procedure TForm1.TimerKopierenTimer(Sender: TObject);
var NeuesUpdate,AltesUpdate :string;
     List: TStrings;
begin
  NeuesUpdate:= (ExtractFilePath(ParamStr(0)) + 'Einstellungen\System\Programm.exe');
  AltesUpdate:= (ExtractFilePath(ParamStr(0)) + 'Programm.exe');
  begin
   CopyFile(PChar(NeuesUpdate), PChar(AltesUpdate), true);
   begin
    List:= TStringList.Create;
    try
     List.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Einstellungen\System\UpdateDatei.txt');
      if List.Count > 0 then
       Edit1.Text:= List[0];
     finally
     List.Free;
    end;

    IniProgrammeinstellung:= (ExtractFilePath(ParamStr(0)) + 'Einstellungen\ProgrammSettings.ini');
     begin
      with TMemIniFile.Create(IniProgrammeinstellung) do
      try
        begin
         WriteString(ProgrammInfo,Programmversion,Edit1.Text);
         WriteBool(DownloadInfo,BtnUpdatInstall,False);
         WriteBool(DownloadInfo,BtnUpdateueberp ,True);
         WriteBool(DownloadInfo,BtnDownload,False);
         UpdateFile;
        end;
        finally
       Free;
      end;
     end;
    TimerUpdaten.Enabled:= False;
    MessageDlg('Update erfolgreich durchgeführt, Sie können das Programm jetzt wieder starten', mtInformation, [mbOK], 0);
   Close;
   end;
  end;
end;
So das war das ganze Updaten hoffe man sieht das es sehr einfach ist.
Im Anhang noch mal die Oberfläsche der Updateüberpüfung

Ich weis das mit der Progressbar könnte man noch schöner machen.

Gruß sascha
Miniaturansicht angehängter Grafiken
update_berp_fung_171.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Poseidon
Poseidon

 
Delphi 2005 Personal
 
#48
  Alt 14. Jul 2008, 09:53
Klasse, du hast mir sehr geholfen
  Mit Zitat antworten Zitat
Benutzerbild von SaFu
SaFu

 
Delphi 10.3 Rio
 
#49
  Alt 14. Jul 2008, 10:01
Bitte aber es ist nicht perfekt wie gesagt z.b. das mit der Progressbar.

Das war nur ein Beispiel für das Updaten der EXE, man kann im gleichen Zug der Updateüberprüfung die Bedienungsanleitung auch mit Updaten nur so als zusätzlichen Vorschlag.

Und bei mir im Update hat der Anwender noch viel selber zu machen (die ganzen Button drücken) das habe ich aber bewusst so gemacht.

Wenn einer noch Verbesserungsvorschläge hat bin ich gerne für Kritik offen.
  Mit Zitat antworten Zitat
DevStar
 
#50
  Alt 27. Jul 2008, 17:29
Hat jemand mal ein komplettes Beispielprojekt?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 5 von 7   « Erste     345 67      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz