Autor Beitrag
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 03.04.04 18:31 
Ich will ja deinen Tatendrang nicht bremsen, aber ...
  1. Wozu ein RichEdit? Oder sogar zwei? "MyVersionRich" und "IEVersionRich" sind doch offenbar welche.
  2. Dann gäbe es sogar noch die Möglichkeit einer Fortschrittsanzeige bei Suche in der Delphi-PRAXiS URLDOWNLOADTOFILE.
  3. Und noch einfacher würdest du bspw. mit einer XML-Datei wegkommen, denn ein vernünftiger XML-Parser lässt auch den Direktzugriff auf die Adresse (URL) zu. Das heißt, du müsstest die Datei nicht runterladen, sondern würdest die Infos direkt vom Server in dein lokales XML-Objekt einlesen. Diese Datei könnte ja recht simpel so aussehen:
    ausblenden Quelltext
    1:
    2:
    3:
    <ApplicationUpdate>
      <version>2.1.0.0</version>
    </ApplicationUpdate>

    Die ermittelte Versionsnummer ließe sich dann wohl recht einfach mit der Versionsnummer deiner Anwendung vergleichen, da beides Strings sind.

GTA-Place hat folgendes geschrieben:
1. Bin kein Mädl.

Das merkt man. Die wenigen anwesenden Frauen bemühen sich in den meisten Fällen wenigstens noch, ihre Fragen korrekt zu stellen, oder sie suchen wenigstens selbst. :roll:
GTA-Place Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Sa 03.04.04 18:50 
Danke für deine Hilfe, aber es hat sich erledigt. Alles funktioniert.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 03.04.04 21:14 
Das war als Kritik gedacht, nicht als Hilfe. Deine Form des Updates ist alles andere als effizient.
GTA-Place Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: So 04.04.04 10:12 
Dann wars halt Kritik ist jetzt auch egal, solangs geht, wo ist da das Problem :roll:

EDIT: Mit den 2 Rich kann man sehen, welche Version man hat, was auch nicht so schlecht ist, wenn es ein Prob. gibt und jemand mir ne Mail schickt und sagt welche Version er hat.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 04.04.04 10:35 
GTA-Place hat folgendes geschrieben:
EDIT: Mit den 2 Rich kann man sehen, welche Version man hat, was auch nicht so schlecht ist, wenn es ein Prob. gibt und jemand mir ne Mail schickt und sagt welche Version er hat.

Dazu brauchst du kein RichEdit. Ein Edit oder besser noch ein Label reicht da völlig aus. Wenn du in deinem Programm eine Konstante definierst, etwa
ausblenden Delphi-Quelltext
1:
2:
const
  szCurrentVersion = '1.1.0.0';

dann dürfte es für dich wohl kein Problem sein, diese Konstante an ein Label weiterzureichen. Ich glaube aber, jemand hat dir hier sogar gesagt (zumindest via Link) wie man die Versionsnummer des Programms selbst auslesen kann (das, was du in den Projektoptionen unter "Version" einstellen kannst). Da das Ergebnis ebenfalls ein String ist, ist die Anzeige in einem Label, bzw. der Vergleich mit einem vom Server ermittelten Wert wohl kaum das Problem.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 04.04.04 13:00 
Damit du mir nicht vorwirfst, ich würde nur meckern aber nichts Produktives beitragen, habe ich mal eine Demo zusammengeschraubt: WebUpdate.zip. Allerdings ist es nur der Quellcode. Aber da wir hier in einem Delphiforum sind, macht das sicher nichts. :mrgreen:

Und du brauchst Microsoft XML 4 (Anleitung s. Quellcode, Projektquelltext). Standardmäßig liest das Programm die lokale XML-Datei aus. Wenn du die Info direkt aus dem Web lesen willst (die gleiche XML-Datei liegt noch mal auf dem Server), dann entferne den Punkt in der Zeile
ausblenden Delphi-Quelltext
1:
{.$DEFINE USEWEB}					

("Unit1.pas"). Das Programm verbindet sich allerdings nicht selbst, und ich übernehme auch keine Garantie, dass die Funktion "IsOnline" (zum Prüfen ob eine Verbindung da ist oder nicht) in jedem Fall funktioniert. Notfalls musst du die entsprechenden Zeilen am Anfang der Buttonklick-Prozedur also mal kurz auskommentieren.


Zuletzt bearbeitet von MathiasSimmack am So 04.04.04 14:12, insgesamt 1-mal bearbeitet
GTA-Place Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: So 04.04.04 13:19 
Schon runtergeladen :D
THX!
Gleich mal testen!


EDIT: Delphi findet "MSXML4_TLB" nicht. Hab XML Installiert.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 04.04.04 13:55 
Ich habe doch gesagt, schau in den Projektquelltext (Project1.dpr)
Zitat:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
  // Wahrscheinlich hast du diese Unit nicht.
  // Kein Problem: Wenn MS-XML bei dir vorhanden ist, dann
  // "Projekt/Typbibliothek importieren ..." -> Microsoft XML, v4.0

  MSXML4_TLB in '..\MSXML4_TLB.pas';

  // Standardmäßig heißt die Unit dann aber MSXML2_TLB. Ich habe
  // schlicht den Dateinamen und den Namen in der Unit geändert,
  // weil ich auch die Units für XML 2 und 3 auf der Platte habe.
  // So weiß ich, welche Unit für welche XML-Version ist.
  // Außerdem liegt die Unit im Ordner über dem Quellcode. Aber
  // das ist, denke ich, das geringste Problem.

  // Ab Delphi 6 könntest du dein Glück auch mit der XML-Komponente
  // versuchen. Min. 1 Beispiel gibt´s in der Sparte "Dateizugriff"
  // des DF.
GTA-Place Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: So 04.04.04 14:24 
Achso.

Zitat:

1. Undefinierter Bezeichner: 'InternetGetConnectedState'.
2. Deklaration von 'GetPriority' unterscheidet sich von der Deklaration in interface 'IBindStatusCallback'.
3. Deklaration von 'OnDataAvailable' unterscheidet sich von der Deklaration in interface 'IBindStatusCallback'.
4. Deklaration von 'OnObjectAvailable' unterscheidet sich von der Deklaration in interface 'IBindStatusCallback'.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 04.04.04 17:06 
Zitat:
1. Undefinierter Bezeichner: 'InternetGetConnectedState'.

Evtl. ein Delphi 3-Problem. Du kannst versuchen, das Problem mit dieser Deklaration zu umgehen:
ausblenden Delphi-Quelltext
1:
2:
function InternetGetConnectedState(lpdwFlags: PDWORD;
  dwReserved: dword): boolean; stdcallexternal 'wininet.dll';


Zitat:
2. Deklaration von 'GetPriority' unterscheidet sich von der Deklaration in interface 'IBindStatusCallback'.
3. Deklaration von 'OnDataAvailable' unterscheidet sich von der Deklaration in interface 'IBindStatusCallback'.
4. Deklaration von 'OnObjectAvailable' unterscheidet sich von der Deklaration in interface 'IBindStatusCallback'.

Du hast, laut Profil, Delphi 3 Professional. Das heißt, die Quellcodes der Units liegen bei. Such bitte in der Unit "UrlMon.pas" nach IBindStatusCallback und schau dir die Deklarationen der entsprechenden Funktionen an. Dann übernimmst du die Deklarationen aus der Unit in das Programm.

Die Deklarationen müssen in der Unit und im Programm identisch sein. Deswegen schaust du dir an, was bei den 3 bemängelten Funktionen in der Unit steht und übernimmst diese Angaben in das Programm. Bitte nicht umgekehrt!
GTA-Place Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: So 04.04.04 17:32 
Jetzt kommt keine Fehlermeldung mehr, aber wenn ich das Prog. starte, beendet sich es automatisch wieder.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 04.04.04 18:24 
Ganz ohne Meldung? Dann kommen eigentlich nur noch 2 Kandidaten in Frage (s. Unit1, ganz am Ende):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
initialization
  if(WsaStartup(MAKEWORD(1,0),wsadata) <> 0then Application.Terminate;
  if(CoInitialize(nil) <> S_OK) then Application.Terminate;
finalization
  CoUninitialize;
  WsaCleanup;
end.


"CoInitialize" und "CoUninitialize" (ActiveX-Unit) dienen eigentlich dazu, das XML-Objekt zu initialisieren. Das benötigt man aber eigentlich nur in nonVCL-Anwendungen. Bei der VCL gibt es garantiert irgendeine Unit, die das aufruft. Aber falsch ist es nicht, und darum schreibe ich das grundsätzlich dazu (wenn auch nicht in dieser Form). Du kannst es versuchsweise weglassen, aber ich kann dir nicht versprechen, dass dann der XML-Code geht.

"WsaStartup" und "WsaCleanup" (WinSock-Unit) sind für die erweiterten Eigenschaften der Funktion "IsOnline" nötig. Ich habe schon extra die Version 1.0 genommen (s. "MAKEWORD(1,0)"), die eigentlich jede Windows-Version unterstützen sollte. Alternativ kannst du die Funktion "IsOnline" ja auch kürzen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
function IsOnline: boolean;
begin
  Result  := InternetGetConnectedState(nil,0);
end;

und dann kannst du "WsaStartup" und "WsaCleanup" weglassen.


Wenn´s dann immer noch nicht geht, würde ich vorschlagen: Nimm dir das Geld und kaufe dir morgen die c't. Da liegt wohl Delphi 7 Personal bei. Dann hast du die ganzen Probleme nicht mehr, denn ich hab´ das Programm eben mal mit D7 (zwar Professional, aber das ist egal) getestet, und es funktionierte.


Ach ja: Ich habe meinen Server aufgeräumt. Wenn du das mit der XML-Datei online testen willst, dann hau sie bitte auf deinen Server und ändere die Konstante "szUrl" im Programm entsprechend.
GTA-Place Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: So 04.04.04 18:58 
Wollte die c't eh kaufen.

So wie du es gechrieben hats, gehts! THX
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 04.04.04 19:53 
Freut mich. :)

Den Vorteil der Methode kannst du, denke ich, erkennen. Du kannst eine XML-Datei auf deinem Server benutzen um mehrere Programme, oder besser gesagt: Produkte, updaten zu lassen. Du musst sie nur aufzählen:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
<?xml version="1.0" encoding="ISO-8859-1"?>
<DOCTYPE products [
  ...
]>
<products>
  <product>
    <name>Dein Programm 1</name>
    <version>1.0.0.0</version>
    <url>http://www.blablabla.de/download.exe</url>
  </product>
  <product>
    <name>Dein Programm 2</name>
    <version>2.0.0.0</version>
    <url>http://www.blablabla.de/download2.exe</url>
  </product>
</products>

und wenn du im jeweiligen Updateprogramm den Namen angibst
ausblenden Delphi-Quelltext
1:
2:
const
  THISAPP     = 'Dein Programm 2';

(und evtl. auch die Versionsnummer, falls das Updateprogramm nicht auch gleich das eigentliche Programm ist, das du aktualisieren willst), dann greift der XML-Code immer auf den Schlüssel zu und erkennt damit die Versionsnummer und den Downloadlink der auf dem Server liegenden Version.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
    node := xmldoc.selectSingleNode(
      '//products/product[name="' + THISAPP + '"]/version');
    url  := xmldoc.selectSingleNode(
      '//products/product[name="' + THISAPP + '"]/url');


Das halte ich persönlich für effizient, denn du kannst entweder den Updatecode in jedes deiner Programme übernehmen, oder du schreibst ein spezielles Updateprogramm, das dir als Basis dient und für jedes Programm quasi personalisiert wird. Aber auf dem Server liegt eben nur eine XML-Datei mit allen notwendigen Daten.


Is´ besser als mit RichEdits zu hantieren, usw. ;)
Coder
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1383
Erhaltene Danke: 1

WinXP
D2005 PE
BeitragVerfasst: Fr 03.09.04 21:27 
NetFalcon hat folgendes geschrieben:
2ten ist es mit INDY ein einfaches downlaod geschwindigkeit/status etc auszulesen
man müsste nur ein bisschen lesen
www.delphi-source.de...torials/indy/?page=5


Downloaden funktioniert. Wie lese ich jetzt die geschwindigkeit und den status aus? (hab gesucht aber nix gefunden)