Entwickler-Ecke

Internet / Netzwerk - Update


GTA-Place - Mi 24.03.04 17:15
Titel: Update
Hi!

Ich will in meinem Prog. eine Updatefunktion haben die folgendes kann:

1. Prüfen ob Verbunden zum inet, wenn nicht
2. Verbindung herstellen
3. Schauen ob neue Version auf Server

Runterladen und istallieren weiß ich.
Hoffentlich könnt ihr mich helfen.
DANKE!

Moderiert von user profile iconPeter Lustig: Topic verschoben


NetFalcon - Mi 24.03.04 17:25

naja 1/2 ist nicht allzuschwer gibts bei google / seiten tonnen von tutorials

3. Würde ich eine datei runterladen in dem der neue wert (die neue version) steht
Verglichen wird mit der im Programm vorhanden Version falls version Prog < version datei starte download ?

Zitat:
Runterladen und istallieren weiß ich.

dann dürfte das kein Problem sein


GTA-Place - Mi 24.03.04 17:51

Aber wie kann ich die zwei dateien vergleichen lassen?


Udontknow - Mi 24.03.04 17:57

Das solltest du nicht tun. :wink:

Netfalcon hat schon die Richtung gewiesen: Du lädst eine andere (Text-) Datei herunter, in der die aktuelle Versionsnummer steht. Alles, was du tun musst, ist dann die Nummer in dieser Textdatei mit der Version des laufenden Programms zu vergleichen.

Cu,
Udontknow


GTA-Place - Mi 24.03.04 17:59

Zitat:
Alles, was du tun musst, ist dann die Nummer in dieser Textdatei mit der Version des laufenden Programms zu vergleichen.


Das weiß ich doch, aber wie kann ich die Nummer in der Textdatei mit der Version des laufenden Programms vergleichen?


Udontknow - Mi 24.03.04 18:04

Äh... Wieso willst du das machen? Du hast doch nur eine Textdatei und vergleichst die Angabe der Version mit der Version des Programms ... :roll:

Edit: Oh, hast den Text abgeändert...

Ja nu. Du kannst es "zu Fuss" machen, indem du eine Konstante in deinem Programm hast, die du bei jedem neuen Build erhöhst. Den Wert schreibst du auch in die Textdatei und lädst sie hoch. Wenn der Wert in der Textdatei ungleich deiner Konstante ist, gibt´s ne neue Version.

Alternativ kannst du auch die "offizielle" Version (siehe Projekt\Optionen\VersionsInfo) ermitteln, da gibt´s doch bestimmt irgendwo einen schönen FAQ-Eintrag, vermute ich... :wink:

Cu,
Udontknow


GTA-Place - Mi 24.03.04 18:07

Kann mir einer einen Quellcode dazu schreiben?

Bin absoluter Anfänger in Delphi.
Hab bisher mit DarkBasic "gearbeitet"


Udontknow - Mi 24.03.04 18:11

Argghhh! Wieso habe ich das geahnt! :x Warum tue ich mir das immer wieder an... :cry:

http://www.delphi-forum.de/viewtopic.php?t=15850&highlight=version

Eigeninitiative ist das Stichwort! Wenn du konkrete Fragen hast, stelle sie... Zum Arbeiten mit Texten empfehle ich TStringlist (siehe Delphi-Hilfe).

Cu,
Udontknow


GTA-Place - Mi 24.03.04 18:14

1. thx
2. OK, ich habe die Version ermittelt, wie kann ich jetzt die nummer aus der textdatei auslesen?

EDIT: Moment ich versuch mal "Eigeninitiative" :D


Udontknow - Mi 24.03.04 18:17

GTA-Place hat folgendes geschrieben:
EDIT: Moment ich versuch mal "Eigeninitiative" :D


Danke!!! :party:

Cu,
Udontknow


GTA-Place - Mi 24.03.04 18:19

Ich müsste eine Datei im Prog. öffnen und sie dann mit tsting auslesen, oder?

EDIT: Kann ich die Datei auch binär auslesen lassen und vergleichen?


Udontknow - Mi 24.03.04 18:30

TStringlist ist die Klasse, mit der man textdateien leicht einlesen kann.

Und ja, man kann binär einlesen (siehe TFileStream).

Cu,
Udontknow


GTA-Place - Mi 24.03.04 18:40

Mh...
Vergleichen würde ich vielleicht hinbekommen, aber ich schaffs nicht eine Datei auszulesen...

Kann mir da jemand helfen?


GTA-Place - Mi 24.03.04 19:06

Ich check das nicht... :cry:
Hoffentlich kann ich das auch mal...


Udontknow - Mi 24.03.04 19:56

Warum bemühst du nicht die Delphi-Hilfe? Du hast ein Problem mit TStringlist? Schau in die Delphi-Hilfe. Da stehen, sobald du auf den Link "Methoden" drückst, sämtliche Methoden eines TStringlist-Objekts, unter anderem auch "LoadFromFile". Unter dem Link "Verwendung von TStringlist" wird ausführlich erläutert, wie man mit Stringlisten arbeitet.

Ausserdem habe ich dir bereits gesagt, daß du besser konkrete Fragen stellst. Was schaffst du denn jetzt nicht? Wenn du nicht die elementaren Grundlagen von Delphi / Object Pascal beherrschst, solltest du dir vielleicht erst einmal ein Grundlagen-Tutorial [http://www.delphi-source.de/grundlagen/sprache/] zu Delphi zu Gemüte führen.

Cu,
Udontknow


GTA-Place - Mi 24.03.04 20:16


Delphi-Quelltext
1:
procedure LoadFromFile(const FileName: string); virtual;                    


Das ist der Befehl zum TxtDateien laden.
Das ist aber nur eine Procedure, was muss denn hinter "begin" und wieso erkennt delphi "virtual" nicht?

EDIT: Ach da ist ja ein Beispiel dabei :D

EDIT2: TxtDatei kann ich jetzt laden und anzeigen, jetzt muss ich nur noch vergleichen.


GTA-Place - Mi 24.03.04 20:45

Wie vergleich ich jetzt die eingeladene TxtDatei mit der Versionsnummer?


GTA-Place - Mi 24.03.04 20:52


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button1Click(Sender: TObject);
const
Path = 'c:\test.txt';
begin
  RichEdit1.PlainText := True;
  RichEdit1.Lines.LoadFromFile(Path);
  if RichEdit1.Lines = GetFileVersion(ParamStr(0))   then
  ShowMessage('Gleich')
  else
  ShowMessage('Ungleich')
end;


Also so gehts nicht,

Zitat:
Inkompatible Typen: 'String' und 'TStrings'


Christian S. - Mi 24.03.04 20:55

(1) Du kannst Deine Postings auch editieren, Du musst nicht in so kurzen Abständen neue posten.
(2) Wozu brauchst Du das RichEdit? Du kannst eine TStringList auch ohne irgendwas drum herum benutzen.
(3) Auf die einzelnen Zeilen (die dann Strings sind) kannst Du mittels Lines[i] beim RichEdit bzw. Items[i] bei TStringList zugreifen, wobei i der Index der Zeile ist. Die Indizes beginnen bei 0.


GTA-Place - Mi 24.03.04 21:06


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button1Click(Sender: TObject);
const
Path = 'c:\test.txt';
Path2 = 'c:\test2.txt';
begin
  RichEdit1.Lines.LoadFromFile(Path);
  RichEdit2.Lines.LoadFromFile(Path2);
  if RichEdit1.Lines = RichEdit2.Lines   then
  ShowMessage('Gleich!')
  else
  ShowMessage('Ungleich!')
end;


Eigentlich müsste es so gehen, aber er zeigt immer "Ungleich!" an auch wenn in den zwei dateien die gleiche zahl steht.
RichEdit könnte man zum Beispiel zur Anzeige, welche Version man benutzt, benützen.


Christian S. - Mi 24.03.04 21:10

Jetzt sieh Dir endlich mal ein paar Grundlagen an!!

Lines ist ein Objekt, die zu vergleichen macht keinen Sinn! Deswegen habe ich eben geschrieben, wie Du auf die einzelnen Zeilen zugreifen kannst.


GTA-Place - Mi 24.03.04 21:12

Ganz ruhig...

THX, es geht mit den Lines!


Christian S. - Mi 24.03.04 21:15

Zitat:
Ganz ruhig...
Entschuldigung ...


GTA-Place - Mi 24.03.04 21:37


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.UpdateSucheClick(Sender: TObject);
const
Path = 'c:\test.txt';
Path2 = 'c:\test2.txt';
begin
  MyVersionRich.Lines.LoadFromFile(Path);
  IEVersionRich.Lines.LoadFromFile(Path2);
  if MyVersionRich.Lines[1] = IEVersionRich.Lines[1]   then
  ShowMessage('Kein Update notwendig!')
  else
  ShowMessage('Bitte Updaten!')
end;

procedure TForm1.AbbruchButtonClick(Sender: TObject);
begin
Close;
end;



So geht's und so könnte eine Updatefunktion aussehen.


Christian S. - Mi 24.03.04 21:47

Hallo!

Läuft das Programm so? Denn Du greifst auf die zweiten Zeilen zu, die Erste hätte den Index 0 und nicht 1.

MfG
Peter


GTA-Place - Mi 24.03.04 21:47

Noch ne Frage:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
begin
     FileOnNet:='http://gta-place.s3.cybton.com/test2.txt';
     LocalFileName:='test2.txt';
  MyVersionRich.Lines.LoadFromFile(Path);
  IEVersionRich.Lines.LoadFromFile(Path2);
  if MyVersionRich.Lines[1] = IEVersionRich.Lines[1]   then
  ShowMessage('Kein Update notwendig!')
  else
  ShowMessage('Bitte Updaten!')
end;


Wie mach ich es, dass das Prog. wartet bis die TxtDatei runtergeladen ist und dann erst öffnet, sonst bekomm ich eine fehlermeldung


Christian S. - Mi 24.03.04 22:46

Wie sieht denn der Download bisher aus?

P.S: Du brauchst mir keine PNs schicken, in denen steht, welche Threads ich mir ansehen soll ... ich lese sowieso fast alles. :-)


NetFalcon - Mi 24.03.04 23:35

Hi GTA-Place,

ein paar Dinge zum Anfang

Du liest 1. die falschen Zeilen aus! Der Index muss 0 sein nicht 1

2ten ist es mit INDY ein einfaches downlaod geschwindigkeit/status etc auszulesen
man müsste nur ein bisschen lesen
http://www.delphi-source.de/tutorials/indy/?page=5


GTA-Place - Do 25.03.04 08:09

Gibts denn keinen "Wait"-Befehl?


Udontknow - Do 25.03.04 10:08

Wie lädst du denn die Datei herunter?

Wenn du mit der Komponente TIDHttp und dem Befehl Get etwas herunterlädst, wird automatisch gewartet...

Cu,
Udontknow


GTA-Place - Do 25.03.04 14:27


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
uses Wininet;

function GetInetFile (const fileURL, FileName: String): boolean;
const BufferSize = 1024;
var hSession, hURL: HInternet;
    Buffer: array[1..BufferSize] of Byte;
    BufferLen: DWORD;
    f: File;
    sAppName: string;
begin
     Result   := False;
     sAppName := ExtractFileName(Application.ExeName);
     hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nilnil0);
     try
        hURL := InternetOpenURL(hSession, PChar(fileURL), nil,0,0,0);
        try
           AssignFile(f, FileName);
           Rewrite(f,1);
           repeat
                 InternetReadFile(hURL, @Buffer,
                 SizeOf(Buffer), BufferLen);
                 BlockWrite(f, Buffer, BufferLen)
           until BufferLen = 0;
           CloseFile(f);
           Result:=True;
        finally
               InternetCloseHandle(hURL)
        end
     finally
            InternetCloseHandle(hSession)
     end
end;

(Quelle: http://home.arcor.de/hardcoders/)

Das und das:


Delphi-Quelltext
1:
2:
FileOnNet:='http://gta-place.s3.cybton.com/test2.txt'
LocalFileName:='test2.txt';


verwend ich


GTA-Place - Do 25.03.04 20:22

Ich lese ja das Tutorial durch :roll: , aber noch eine Frage:

Scheinbar lädt Delphi die Datei nicht herunter. Kann man statt die TxtDatei runterzuladen, auch gleich auf dem Server auf sie zugreifen und auslesen? Wahrscheinlich schon, denn
http://gta-place.s3.cybton.com/test2.txt
und man kann ja von Delphi aus auf eine Website draufzugrefeifen, also auch auf die TxtDatei.
Also mal schnell das Internet durchsuchen (Eigeninitiative :D )
Mh...
*Nix Find*
Dann mal weitersuchen und Prob. selber lösen...

EDIT: Schon was gefunden, also Indy runterladen und los geht´s (das programmieren)
EDIT2: Stellen wir uns mal vor: Ich hab D3 und Indy ist erst ab D4. Was macht man dann?
EDIT3: Man versucht es anders...
EDIT4: Ich verzweifel langsam... Da hilft das Tut wahrscheinlich auch nicht mehr... D muss doch irgendwie die Seite auslesen können...


MaxiTB - Do 25.03.04 21:12

Zitat:
Scheinbar lädt Delphi die Datei nicht herunter. Kann man statt die TxtDatei runterzuladen

Per HTTP - Nein.

Zitat:
Wahrscheinlich schon, denn
http://gta-place.s3.cybton.com/test2.txt
und man kann ja von Delphi aus auf eine Website draufzugrefeifen, also auch auf die TxtDatei.

Die Datei wird lokal gecached - es fällt dir nur nicht auf, weils so schnell geht.

Zitat:
EDIT3: Man veruscht es anders...

Suche in: Delphi-Forum, Delphi-Library URLDOWNLOADTOFILE

Zitat:
Ich lese ja das Tutorial durch ...

Sehr gute Idee ... ich hab da noch was für dich: Click ! [http://www.lugbz.org/documents/smart-questions_de.html]

//Edit: URL-Tag.


GTA-Place - Do 25.03.04 21:16

1. Wenn ich auf die Suche klicke finde ich diesen Thread wieder.
2. Tolles Tutorial, endlich mal richtig fragen!


MaxiTB - Do 25.03.04 21:23

1. :roll: Is echt eine Überraschung, daß der erste Link wieder hier her führt ... aber das tolle an der Suche, man hat eine Menge Alternativen und es gibt mindestens hundert, die sind Treffer. Jetzt bist also du an der Reihe.

2. :? Schon gelesen ? Hoffe ich ja doch, ich denke, du kannst die Tipps dort noch brauchen.

//Edit: Oder ich hab mich vertippt und es gibt nur einen Treffer :oops: - korregiert und es sind immerhin 33. Na, das ist doch was !


GTA-Place - Do 25.03.04 21:28

Es hat funktioniert!
Er ladet die Datei runter und startet sie dann!

THX Peter Lustig, Udontknow, NetFalcon und MaxiTB!


GTA-Place - Do 25.03.04 22:43

Jetzt nur noch eine einzige Frage:

Wenn Delphi die Datei nicht downloaden kann (z.B. keine Internetverbindung) dann soll es eine Fehlermeldung anzeigen (z.B. "Keine Internetverbindung?") und nicht gleich das Prog. abstürzen lassen.


MaxiTB - Do 25.03.04 22:59

Mädl, du solltest wirklich mehr die Online Hilfe von Delphi lesen.
Oder die Sachen, die wir dir schreiben.

UrlDownloadToFile z.b. gibt eine HRESULT zurück, und Indy kannst du per try...except Exceptions abfangen.


GTA-Place - Fr 26.03.04 19:13

1. Bin kein Mädl.
2. Ich kann kein Indy verwenden


GTA-Place - Sa 03.04.04 16:40

Du hättest auch einfach sagen können:

Mit "try" und "except" kannst du Fehler abfangen.

So gehts nämlich.


Delete - 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:

    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 - Sa 03.04.04 18:50

Danke für deine Hilfe, aber es hat sich erledigt. Alles funktioniert.


Delete - 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 - 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.


Delete - 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

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.


Delete - 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

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.


GTA-Place - So 04.04.04 13:19

Schon runtergeladen :D
THX!
Gleich mal testen!


EDIT: Delphi findet "MSXML4_TLB" nicht. Hab XML Installiert.


Delete - So 04.04.04 13:55

Ich habe doch gesagt, schau in den Projektquelltext (Project1.dpr)
Zitat:

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 - 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'.


Delete - 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:

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 - So 04.04.04 17:32

Jetzt kommt keine Fehlermeldung mehr, aber wenn ich das Prog. starte, beendet sich es automatisch wieder.


Delete - So 04.04.04 18:24

Ganz ohne Meldung? Dann kommen eigentlich nur noch 2 Kandidaten in Frage (s. Unit1, ganz am Ende):

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:

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 - So 04.04.04 18:58

Wollte die c't eh kaufen.

So wie du es gechrieben hats, gehts! THX


Delete - 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:

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

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.

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 - 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
http://www.delphi-source.de/tutorials/indy/?page=5


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