![]() |
TMSWebUpdate - eine neue WebUpdate-Komponente
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Listers,
vor gut einer Woche hatte ich entgültig die Nase voll. Ich suchte eine Komponente für ein automatisches WebUpdate, Internet-Update, ganz wie ihr wollt. Entweder es gab lauter teures Zeug, oder Freeware, die zwar gut, aber meist recht wenig anpassbar war, dann noch ein paar Schnipsel hier, ein Textchen da, ein Code-Teilchen wo anders.... Also gut, selber schreiben... Und hier ist das Ergebnis. TMSWebUpdate ist ganz sicher nicht neu, aber - Freeware mit Source - Einfach zu integrieren - Anpassbar, also keine Formulare die schon mit dabei sind - Flexibel, was die Anzahl der runterzuladenden Dateien angeht - Flexibel beim format der Steuerdatei auf dem Server. - Nicht erst ab Delphi 2006 enterprise lauffähig. ;-) - Auf Indy basierend, also geht ab Delphi 5. Webupdate schaut auf einem Server in einer Infodatei nach, ob eine neuere Version, als die aktuelle, vorhanden ist. Falls ja, können eine, oder mehrere Dateien, heruntergeladen, und ggf. eine davon als Update ausgeführt werden. Dazu einfach die Komponente auf die form. Die zwei eigenschaften UpdateURL und IniName müssen natürlich ausgefüllt werden. UpdateUrl ist die Adresse zur ini-datei also z.B. ![]() (http und / am ende werden automatisch ergänzt) IniName ist der Name der Datei, in der die Infos über ein evtl. Update stehen, also beispielsweise MeinProg_Update.html Und MeinProg_Update.html könnte dann ungefähr so aussehen: [Version] Major=1 Minor=0 Release=0 Build=99 [File001] Name=MeinProg_Update.exe Start=1 [File002] name=EinSound.wav Path=sounds [New] Ein Fehler beim entgültigen löschen von Dateien wurde beseitigt. Mehrere kleine Sachen sind jetzt leider kaput. Ich bin noch dran! ;-) ... Alles was nach dem Schlüsselwort [New] steht, wird gnadenlos als WhatsNew angezeigt, dann zu finden in der WhatsNewListe der Komponente. Ach ja, die Anweisung zur Prüfung heißt CheckForUpdates. Das war’s schon, und 6 Ereignisse OnUpdatefound OnNoUpdateFound OnDownloadProgress OnDownloadComplete OnNextFile und OnError Gibt’s natürlich auch noch. So. und nun wünsche ich viel spaß beim ausprobieren, testen, einsetzen, was auch immer. Ich würde mich über verbesserungsvorschläge, wünsche, anregungen, kritik, besonders über Lob, natürlich sehr freuen. Wenn bedarf ist, können wir auch gerne ein Projekt daraus machen. Viele Grüße Marco |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Hört sich gut an,einfach und geradeheraus :thumb:
Geht's auch ohne TComponent-heritage, also einfach als TObject? Wäre schon cool...... 8) |
Re: TWebUpdate - eine neue WebUpdate-Komponente
kann man die heruntergeladenen dateien auch in ein anderes verzeichnis packen, bespielsweise "%MeineAnwendung%\Resourcen\blah\" ?? oder müsste das per update.exe im temp geschehen?
ansonsten: supi :D |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Hi WebCSS,
Zitat:
|
Re: TWebUpdate - eine neue WebUpdate-Komponente
Zitat:
Ist eigentlich auch ne einfache Geschichte: einfach per Compiler-Switch die class auf TComponent oder TObject, und den Constructor ebenso, das ist alles... Schau es Dir einfach mal an. |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Hallo again,
so. Dann machen wir mal ‚n kleines ChangeLog auf: - die Klasse TWebUpdate kann jetzt als TComponent oder TObject kompiliert werden (Compilerdirektive). Danke an WebCss. - Es wird in der Info-Datei zwischen einem direkten und indirekten Update unterschieden. Beim direkten update wird die anwendung geschlossen und dann eine batchdatei ausgeführt, die die alte anwendung löscht, (natürlich mit Pause vorher), die update umbenennt und sie dann wieder startet. Beim indirekten wird die als erstes angegebene Datei einfach ausgeführt, für ein Update-Programm, beispielsweise mit Inno Setup erstellt. - Es ist jetzt für jede Datei, die ins Programmverzeichnis soll, möglich, sie in ein Unterverzeichnis des Programmverzeichnisses zu packen, die werden auch automatisch erstellt. Vielen dank an Crazy Ivan. Das geht nur im Programmverzeichnis, damit’s erst gar kein gehampel mit Vista gibt, und im Temp-Verzeichnis würde das, meiner Meinung nach, keinen wirklichen sinn machen. - Eine ReadMe ist inzwischen auch da! - Und auch ein Demo-Programm für’s direkte Update, das indirekte kommt noch. Ach ja, die url ![]() Schaut’s euch mal an, aktualisiert, wie immer, im ersten Beitrag. Bin weiter gespannt auf Verbesserunsvorschläge, Wünsche kritik und alles andere. Viele grüße Marco |
Re: TWebUpdate - eine neue WebUpdate-Komponente
super, dankeschön, werd's demnächst mal testen!
eine sache fällt mir noch ein: ne liste mit downloadservern, die nach und nach abgeklappert werden, ähnlich wie z.B. Antivir das macht.... |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Hallo
Ich bin noch anfänger und ich hab ein problem. Ich bekomm die komponente nicht installiert. Ich hab delphi 2007, aber wenn ich sie auf "neue vlc komponente" gehe und dann alles angebe passiert nichts. Was muss ich denn machen um die Komponente richtig zu installieren? wäre nett wenn mir das jemand sagen könnte, denn ich werde aus dem readme net schlau |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Hallo und Willkommen Pif,
du musst eine Komponente in ein Package installieren, das dient quasi als Conteiner für mehrere Komponenten. Du könntest über "Neu" ein neues Package erstellen oder ein vorhandenes nehmen. Denke dann auch daran, den Suchpfad anzupassen (unter Tools > Optionen > Delphi-Optionen) Notfalls kannst du die Komponente auch erst zur Laufzeit erstellen, dann musst du sie nicht in die Palette installieren. Gruß Pfoto |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Hallo Pfoto
Danke für deine hilfe, das mit dem package habsch begriffen. aber wenn ich das installieren will kommt ein fehler im quelltext der komponente
Delphi-Quellcode:
[DCC Fehler] WebUpdateThread.pas(39): E2009 Inkompatible Typen: 'Liste der Parameter ist unterschiedlich'
fIdHTTP.OnWork := InternalOnWork;
Mach ich da was falsch oder liegt es am quellcode? |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Hallo Pif,
Delphi-Quellcode:
bedeuted, dass beim das Ereignis OnWork von der Methode
fIdHTTP.OnWork := InternalOnWork;
InternalOnWork aufgefangen wird. Die Parameter des Types von OnWork und die Parameter der Methode von InternalOnWork müssen identisch sein. Das ist nun vielleicht durch Versionsunterschiede nicht mehr passend. Die Methode
Delphi-Quellcode:
müsste also angepasst werden.
procedure InternalOnWork (Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
Ich habe die Indy-Komponenten nicht installiert, deswegen kann ich ab hier nicht weiterhelfen. Sorry. Gruß Pfoto |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Trotzdem Danke Pfoto.
Ich scheine der einzige mit dem Problem zusein. Ich werd mal schaun ob ich es gefixed bekomme. MfG Pif |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Hallo,
Es gibt eine neue Version. Geändert hat sich lediglich, daß das Demo für das indirekte Update nicht mehr kommt, weil sich das, meiner Meinung nach, selbst erklärt. Außerdem mußte ich die Demo-Update-Dateien auf meinem Server umziehen, deshalb gibts 'ne neue Version. Viel spaß damit und viele Grüße Marco |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Nur so: Normalerweise sind die Bezeichner (von den Events) Englisch ;)
Ich hab mich beim ersten durchlesen gewundert, wegen dem denglisch (OnUpdateGefunden :mrgreen: ) |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Zitat:
Ich weiß nicht wie ich es beheben kann. Kann mir vielleicht einer helfen? |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Hallo,
Zitat:
Was sagt denn die Indy hilfe, zum aufbau von OnWork, also wie sieht bei dir die Parameterliste aus? Viele Grüße Marco |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Hallo,
Es gibt eine neue Version, weil die Batch-Datei, nach einem direkten Update, nicht ordnungsgemäß gelöscht wurde. Des weiteren heißt die Prozedur zum starten der Update-Suche, ganz nach Marco-Denglisch: SucheNachUpdates. Viele Grüße Marco |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Hallo zusammen,
Es gibt, mal wieder, eine neue Version (1.00.5). Neuerungen sind das Ereignis OnKeinUpdateGefunden, selbsterklärend und eine Prozedur Namens Neustart. Wenn nämlich der Neustart der Anwendung, nach einem Update, nicht gleich, sondern erst später durchgeführt werden soll, hatte man, vorher, ein Problem. Viel Spaß damit und wie gesagt: für Kritiken und Anregungen bin ich jederzeit offen! Viele Grüße Marco |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Hallo,
da ich meine Updates auf einem SSL-Webserver liegen habe, hab ich deine Komponente um SSL-Fähigkeit erweitert. Das notwendige OpenSSL-Update für Delphi/Indy gibt es ![]() Hier geänderte der Code:
Delphi-Quellcode:
Das war's auch schon. Bei mir funktioniert das für meine Zwecke :lol:
uses
...,IdSSLOpenSSL; TWebUpdate = class(TComponent) private { Private-Deklarationen } ... fSSLIOHandler: TIdSSLIOHandlerSocket; ... end; constructor TWebUpdate.Create; begin ... fSSLIOHandler := TIdSSLIOHandlerSocket.Create(self); fSSLIOHandler.SSLOptions.Method := sslvSSLv3; fIdHTTP.IOHandler := fSSLIOHandler; ... end; procedure TWebUpdate.SetUpdateURL(const value: string); begin ... if copy (UpperCase (fUpdateUrl), 1, 4) <> 'HTTP' then // <-- damit man auch https eingeben kann fUpdateURL := 'http://' + fUpdateURL; ... end; |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Gefällt mir schonmal ganz gut, aber ich hab 2 Probleme:
1. Ich lasse die Dateien in das Unterverzeichnis '\downloads' laden. Nachdem das Update-Programm geschlossen wird, werden diese Dateien allerdings nicht ins Hauptverzeichnis verschoben. 2. Fällt bei mir AWorkCount in den negativen Bereich. Da ich eigtl einen Fortschrittsbalken einbauen wollte, kann ich das erstmal vergessen, da mir negative Werte rein gar nichts bringen. Denn so kann es bei größeren Dateien schnell den Anschein haben, dass der Download steckengeblieben ist. |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Huhu,
Zitat:
Zitat:
Kannst du die Dateien, die du im Hauptverzeichnis brauchst, nicht gleich dorthin laden? Zitat:
Grüße Marco |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Hallo Listers,
Es gibt eine Neue Version der WebUpdate-Komponente, V1.01.0. Es hat sich einiges Neue getan. An dieser Stelle ein Dank an Fylo und Svenkan für die Ideen. Das SSL gibt's im nächsten update. Neuerungen: Für jede, in der Versionsdatei angegebene Datei, gilt: ist ein Pfad angegeben, wird die Datei beim Herunterladen dort hinein kopiert. (wie gehabt). Ist Pfad= angegeben, oder wird die Angabe schlicht weggelassen, wird die Datei in ein Unterverzeichnis, unterhalb des Programmverzeichnisses, mit dem Namen WebUpdateDateien kopiert. All diese Dateien werden, nach Programmende, ins eigentliche Programmverzeichnis kopiert. Das hat den vorteil, daß auch mehrere Dateien, beispielsweise dlls, im Programmverzeichnis ersetzt werden können. Wird z.B. Pfad=sound angegeben, wird die Datei ins Verzeichnis sound\ unterhalb des eigentlichen Programmverzeichnisses kopiert. So kann, weiterhin, eine Image, sound,-...-Datei ersetzt werden. Die erste datei, die den Zusatz Start=1 hat, wird von der Batch-Datei als letzte Aktion ausgeführt. Auf diese Weise, kann das Programm sofort nach dem Update automatisch wieder neu gestartet werden. Schaut euch auch das Beispiel im demo an. Das bringt u.a. den enormen vorteil, daß man als neue Programmversion schlicht die Programmdatei benutzen kann, und die nicht umständlich erst umbenennen muß. Die Section [Einstellungen] samt [DirektesUpdate] entfällt dadurch komplett. Um ein indirektes Update, also das Ganze über ein setup.exe durchzuführen, sieht die Sektion für Datei001 dann so aus: [Datei001] name=setup.exe ; die eigentliche Update-Datei, als Setup verpackt. Pfad= ; wird ins Programmverzeichnis kopiert. Start=1 ; wird, nach dem alles kopiert ist, ausgeführt. Hier bleibt dem Programmierer lediglich, die Setup.exe nach Programmstart von Hand zu löschen, da WebUpdate nicht weiß, daß es sich um eine Update-Datei handelt. Also z.B.
Code:
Die Batchdatei entfernt, um keinen Müll zu hinterlassen, gnadenlos alle Dateien in
UpdateName := ExtractFilePath (Application.ExeName) + 'setup.exe';
If FileExists (UpdateName) then DeleteFile (UpdateName); WebUpdateDateien und auch das verzeichnis selbst. Ebenso wurden das Demo und die Doku ein wenig überarbeitet - ich hoffe,zum Besseren hin. So. Ich warte, wieder, auf Lob, Kritik, Anregungen und sowas schönes alles! Einen schönen Abend! Marco p.s.: ach ja, ;-), geänderte Version, wie immer, im ersten Beitrag. |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Zitat:
Was genau brauchst du um mir zuhelfen Marco? ^^ |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Hi,
hört sich an wie unterschiedliche Indy-Versionen. Mfg FAlter |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Was kann ich da machen?
|
Re: TWebUpdate - eine neue WebUpdate-Komponente
Hallo,
Jetzt geht mir dieser Fehler wirklich auf den Geist. ;-) Den werden wir doch irgendwie behoben kriegen!!! Zitat:
Aber jetzt hab ich 'ne Frage: wie kann ich feststellen, welche Indy-Version läuft, also z.B. Compiler-Schalter, oder geht sowas mit Overload? Viele Grüße Marco |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Delphi-Quellcode:
Also ich bin jetzt nich so der Delphi-Pro. Ich hoffe du meinst das so. Ich hab ne neue Anwendung gemacht dieses TIDHTTP draufgezogen und dann onwork definiert...
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) IdHTTP1: TIdHTTP; procedure IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer); begin end; end. Das ist der Code (oben). "TWorkMode" wird mir als nicht deklarierter Bezeichner angezeigt. Ich hoffe ich kann dir helfen ... |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Liste der Anhänge anzeigen (Anzahl: 1)
Huhu Pif,
Zitat:
Ich häng dir hier mal eine geänderte WebUpdateThread.pas dran. Die bitte mal drüberkopieren und mir sagen, ob's jetzt geht! Dank dir und viele Grüße Marco |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Ich muss dich enttäuschen.... Also ich bekomme den gleichen fehler immernoch. :wall:
Vllt. mache ich ja auch was falsch beim installieren. Ich mache ein neues Package. Dann füge ich unter "Enthält" WebUpdate.pas und WebUpdateThread.pas hinzu. Dann mach ich aufs Package rechtsklich und dann installieren. Dabei bringt er mir dann den fehler! MfG Pif |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Huhu,
Zitat:
Delphi-Quellcode:
Ändere die doch bitte mal so, daß das ganze {$ifndef} draußen ist, also die Zeile so aussieht:
procedure InternalOnWork (Sender: TObject; AWorkMode: TWorkMode; {$IFNDEF Indy100} const {$ENDIF} AWorkCount: Integer);
Delphi-Quellcode:
Das gleiche gibt es dann weiter unten nocheinmal, bitte genauso verfahren.
procedure InternalOnWork (Sender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer);
Klappt es jetzt? Wenn du mir hilfst, wär' das echt klasse! Viele Grüße Marco |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Hallo.
Ich helf dir gerne, nur kann ich die Zeile nicht finden. Bzw sieht sie bei mir anders aus. So sieht meine WebUpdateThread.pas aus:
Delphi-Quellcode:
unit WebUpdateThread;
interface uses classes, IdComponent, IdHTTP; type TOnWorkEvent = procedure(Sender: TThread; AWorkCount: Integer) of object; TDownloadThread = Class (TThread) private fIdHTTP: TIdHTTP; fName: string; // Name einer herunterzuladenden Datei fPfad: string; // wohin soll die Datei auf Platte gespeichert werden fURL: string; // URL der Datei fWorkCount: integer; fOnWorkEvent: TOnWorkEvent; procedure InternalOnWork (Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); procedure DoNotifyWork; protected procedure execute; override; public property name: string read fName write fName; property Pfad: string read fPfad write fPfad; property URL: string read fURL write fURL; property OnWork: TOnWorkEvent read FOnWorkEvent write FOnWorkEvent; end; implementation uses SysUtils; procedure TDownloadThread.Execute; var fs: TFileStream; begin fIdHTTP := TIdHTTP.Create(nil); fIdHTTP.OnWork := InternalOnWork; fs := TFileStream.Create (fPfad + fName, fmCreate or fmShareExclusive); try fIdHTTP.Get(fURL + fName, fs); finally fs.Free; fIdHTTP.Free; end; end; procedure TDownloadThread.InternalOnWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); begin FWorkCount := AWorkCount; Synchronize(DoNotifyWork); end; procedure TDownloadThread.DoNotifyWork; begin if Assigned(OnWork) then OnWork (Self, FWorkCount); end; end. |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Huhu Pif,
aaah, ich hatte im Beitrag davor, noch 'ne geänderte Version gepostet, aber die vergiß mal. ;-) okay: Die Zeile heißt
Delphi-Quellcode:
das
procedure InternalOnWork (Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
Delphi-Quellcode:
vor dem aWorkCount muß raus, und unten auch nochmal.
const
Jetzt sollte es gehen ... Hoffnungsvolle Grüße Marco |
Re: TWebUpdate - eine neue WebUpdate-Komponente
JAWOLLLLL
Es geht =) n1 Arbeit. Besten Dank! MfG Pif |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Huhu,
Zitat:
Jetzt muß ich's nur noch verallgemeinern. Viel Spaß beim testen, morgen oder übermorgen sollte es 'ne Version geben, die das schon drin hat. Viele Grüße Marco |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Wie siehtsn mit der neuen Version aus?
|
Re: TWebUpdate - eine neue WebUpdate-Komponente
Hallo zusammen,
... und hier ist V1.01.1. Neuerungen: Das Ereignis OnFehler tritt auf, wenn z.B. keine Verbindung zum Internet hergestellt werden kann, oder ein anderer Fehler auftritt. Ebenso wurden die notwendigen Compiler-Schalter in die WebUpdate.inc ausgelagert. Ein zweiter Schalter Indey10 ist dazu gekommen. Der Muß gesetzt werden, wenn Indy10 eingesetzt wird. Tut mir leid, daß das jeder von Hand machen muß, aber ich hab absolut nicht rausfinden können, wie man's Programmseitig ermitteln kann. Viel Spaß beim Testen und einen schönen Abend Marco |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Hi Marco,
Zitat:
Delphi-Quellcode:
Wird in IdGlobal.pas per IdCompilerDefines.inc gesetzt. Also einfach IdGlobal einbinden und per IFDEF prüfen.
{$IFDEF INDY100}
Gruß Assertor |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Also ich muss sagen, deine Komponente gefällt mir richtig gut :)
Ich habe sie direkt mal in mein aktuelles Projekt eingebaut. Allerdings vermisse ich sehr einen funktionierenden Fortschritt. Dass das Progress nicht funktioniert wurde ja schon angesprochen. Außerdem wäre eine Anzeige der Dateigrößen schön :) gruß |
Re: TWebUpdate - eine neue WebUpdate-Komponente
Ein weiteres nettes Feature wäre die Anzeige aller zu downloadeden Dateien und ein Event sobald eine Datei fertig ist. Als Parameter dann den Namen der Datei. Das ganze könnte man dann schön in ein Log einbauen.
|
Re: TWebUpdate - eine neue WebUpdate-Komponente
Ah, ich sehe schon, das mit der Dateiliste gibt es wohl schon, tut mir leid.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz