![]() |
Frage zu Download Code mit idHTTP aus Code-Library
Hi,
ich wollte den Code ausprobieren, aber ich bekomme eine Masse an Fehlermeldungen. Warum funktioniert das nicht?
Delphi-Quellcode:
Hier z.B.: ';' erwartet, aber '.' gefunden
procedure THaupt.IdHTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode;
AWorkCountMax: Integer); Fehlt eine USES-Anweisung?
Delphi-Quellcode:
Liebe Grüße!
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, ComCtrls; PS:der ![]() |
Re: Frage zu Download Code mit idHTTP aus Code-Library
Das liegt daran, dass Delphi THaupt nicht "kennt". Du musst entweder dein Hauptformular "Haupt" nennen oder im Code THaupt durch TForm1 (bzw. den Namen deines Formulars) ersetzen. Außerdem musst du die Prozeduren erst erstellen, z.B. durch Doppelklick auf das jeweilige Ereignis im Objektinspektor (onWorkBeginn bei IdHTTP etc.), denn der Code kann in den seltensten Fällen 1:1 übernommen werden.
|
Re: Frage zu Download Code mit idHTTP aus Code-Library
Danke! Ja ich bin gewöhnt, meine Komponentennamen nicht zu verändern und das ich die Prozeduren noch nicht erstellt hatte, daran hatte ich nicht gedacht :(
Danke :) :dp: |
Re: Frage zu Download Code mit idHTTP aus Code-Library
Jetzt funktioniert das Programm. Aber wieso muss ich die Quelldatei für idHTTP.pas suchen? Normalerweise hat er das automatisch gemacht, oder irre ich mich?
Ich habe die Datei gefunden, aber jetzt stürzt das Programm ab, wenn ich auf den Button klicke und es kommt eine Fehlermeldung mit: 'Unknown Protocol'! Und jetzt? |
Re: Frage zu Download Code mit idHTTP aus Code-Library
Eigentlich musst du die Quelldatei nicht suchen. Würde Delphi sie nicht finden, dann würde schon das Comilieren nicht klappen.
Die Meldung "Unknown Protocol" hat damit wahrscheinlich eher nichts zu tun. Es sieht eher so aus, als würde IdHTTP nicht mit dem Server klarkommen. Wie beginnt denn die Adresse, von der du runterladen willst? |
Re: Frage zu Download Code mit idHTTP aus Code-Library
Ich habe gerade ausprobiert:
Wenn ich diese Datei laden will (die ich vorhabe zu laden), dann gibt es den entsprechenden Fehler: ![]() Bei einer Bilddatei der gleichen Seite funktioniert es! |
Re: Frage zu Download Code mit idHTTP aus Code-Library
Ok es klappt. Ich habe nur die falsche Adresse genommen, ich musste Sie erst aus dem PHP-Code auslesen! Danke für alles... :)
|
Re: Frage zu Download Code mit idHTTP aus Code-Library
Oh nein! Es gibt ein weiteres Problem :'(
Es klappt alles wunderbar, nur wird der Download nicht richtig beendet. Die Datei ist 1,49 MB groß, aber der Download läuft weiter, obwohl er eigentlich abgeschlossen sein müsste. Die Fortschrittsanzeige läuft weiter bis 100%, dann wird aber die Datei größer als 50MB... Vielleicht stimmt eine Zählschleife nicht? |
Re: Frage zu Download Code mit idHTTP aus Code-Library
Ich hab noch rumprobiert, aber der läd einfach zu viel herunter :(
Woran liegt das? :wiejetzt: Grüße |
Re: Frage zu Download Code mit idHTTP aus Code-Library
Hi Lord,
war dass das Beispiel: ![]() Bei diesem Beispiel hatte ich damals auch zwei Probleme, einmal stimmte die Angabe der Dateigröße nicht, ich glaube bei der Berechnung der Dateigröße ist die Angabe der Bytes für ein Gigabyte ein Terrabyte gewesen. Und beim Downloaden wurde die Datei viel größer als sie Orginal tatsächlich war, der Fehler den Du auch hast. Die Fortschrittsanzeige ist bei diesem Beispiel so realisiert das der Download geteilt abläuft und anhand der Bytes bestimmt wird wie weit der Download in der Progressbar ist. Das Problem hier ist aber das bei mir die Datei nachdem sie fertig war immer wieder neu heruntergeladen wurde, bis zu einem bestimmten Zeitpunkt. Dadurch hast du dann ganz oft deine Daten in einer Datei. Es kann sein das du den gleichen Fehler hast, entweder liegt das an dem Beispiel oder ich habe irgendetwas damals übersehen. Also das zerhacken der Datei und das Stücke laden der Bytes ist dafür verantwortlich. greetz Lun P.S: Wenn das nicht das Beispiel war vergesse den Eintrag. |
Re: Frage zu Download Code mit idHTTP aus Code-Library
Hi Lun,
ja richtig, ich habe auch das Beispiel benutzt. Die Datei wird heruntergeladen und immer wieder in sich selbst kopiert (wie soll ich es anders sagen ^^). Hast du das Problem denn gelöst? Man muss also die Abbruchbedingung der Repeat-Schleife ändern, bzw. die Dateigröße anpassen? Gute Nacht! :angel: |
Re: Frage zu Download Code mit idHTTP aus Code-Library
Hi Lord,
Zum ersten Problem : Die Dateigröße Das muss geändert werden damit GB amgezeigt werden und nicht Terrabyte:
Delphi-Quellcode:
Das zweite Problem habe ich dann nachher anders gemacht ist zwar nicht so genau wie die vorgesehene Methode
if (1048576 <= Size) and (Size < 1073741824) then
begin Result := floattostr((round((Size/1048576)*100))/100)+' MB'; exit; end; if Size > 1073741824 then begin Result := floattostr((round((Size/1073741824)*100))/100)+' GB'; end; aber funktioniert auch und erfüllt ihren Zweck. ich lade die DAtei wieder im ganzen runter mit idhttp.get(link,stream); und benutze da zu die drei Ereignisse Work, WorkBegin,WorkEnd Ich habe das dann so wie in diesem Beispiel gelöst: ![]() In WorBegin
Delphi-Quellcode:
In Work
if AWorkCountMax > 0 then ProgressBar1.Max := AWorkCountMax
else ProgressBar1.Max := DateigrößeBytes;
Delphi-Quellcode:
und zu letzt
ProgressBar1.Position := AWorkCount;
application.ProcessMessages; workEnd
Delphi-Quellcode:
ProgressBar1.Position := 0;
So hoffe ich könnte dir weiterhelfen ansonsten mußt du mal den verfasser gsh fragen. greetz Lun |
Re: Frage zu Download Code mit idHTTP aus Code-Library
Zitat:
Zitat:
Werden die alten Ereignisse durch deine neuen ersetzt oder ergänzt? Ersetzt, oder? -- Gruß |
Re: Frage zu Download Code mit idHTTP aus Code-Library
Hi Lord,
ich hole mir die DateigrößeBytes aus dem Header der runterzuladenen Datei und zwar so: DateigrößeBytes := IdHTTP1.Response.ContentLength; DateigrößeBytes : int64; ist als int64 deklariert nur zur info. greetz Lun |
Re: Frage zu Download Code mit idHTTP aus Code-Library
Ich habe das jetzt mal versucht zu ändern. Also es wird alles kompiliert und auch der download funktioniert. Nur dann zeigt mir das Status-Label an, dass ein Fehler aufgetreten ist. Und dann läuft der download anscheinend unendlich weiter. Vielleicht habe etwas an falscher Stelle eingesetzt oder deklariert.
Delphi-Quellcode:
procedure TForm4.Button1Click(Sender: TObject); var BytesKopiert, BytesInsgesamt: int64; lStream: TFileStream; begin //Initialiesieren Status.Caption := ''; BytesKopiert := 0; Progress.Position := 0; //In edit 1 steht die downzuladene Datei (z.b. [url]http://www.server.com/datei.dat[/url]) Status.Caption := 'Prüfe Header'; // Durch die zwei nächsten Befehle wird die Größe ermittelt und ihn der Variable BytesInsgesamt abgespeichert IdHTTP1.Head(Edit1.Text); BytesInsgesamt := IdHTTP1.Response.ContentLength; DateigroesseBytes := IdHTTP1.Response.ContentLength; //Wenn die Indy Komponente -1 zurückgibt dann bedeutet es des der die Dateigröße nicht zu verfügung //stellt uns somit kann die Datei ganz normall heruntergeladen werden (ohne Fortschrittsanzeige) if BytesInsgesamt = -1 then begin Status.Caption := 'Normalles herunterladen'; Status.Caption := 'Erstelle Datei'; //In Edit 2 steht welche Datei (z.b. C:\datei.dat) //Datei erstellen lStream:=TFileStream.Create(Edit2.Text, fmCreate or fmShareDenyNone); try //und "normal" herunterladen idHTTP1.Get(Edit1.Text, lStream); finally if Assigned(lStream) then lStream.Free; //FileStream freigeben wenn gesetzt end; //Alles auf fertig stellen Status.Caption := 'Fertig'; SpeedStatus.caption := 'Fertig'; exit; end; //Also wenn wir hier angelangt sind dann bedeutet es der Server hat uns die Dateigröße zur Verfügung gestellt. Progress.Max := BytesInsgesamt; Status.Caption := 'Erstelle Datei'; //In Edit 2 steht welche Datei (z.b. C:\datei.dat) //Datei erstellen lStream:=TFileStream.Create(Edit2.Text, fmCreate or fmShareDenyNone); lStream.Position := 0; try repeat // Damit sich das Programm nicht aufhängt Application.ProcessMessages; //Nun setzen wir den Start nach die bereits kopierten Bytes IdHTTP1.Request.ContentRangeStart := BytesKopiert; //Hier wird gebrüft ob die restlichen Bytes größer sind als cFileSplitSize if (BytesInsgesamt-BytesKopiert) > cFileSplitSize then begin //Hier wird einmal die cFileSplitSize eingestellt IdHTTP1.Request.ContentRangeEnd := BytesKopiert+cFileSplitSize-1; end //Den rest der Datei else IdHTTP1.Request.ContentRangeEnd := BytesInsgesamt; Application.ProcessMessages; //Den eingesttelten Teil herunterladen und ihn die Datei speichern IdHTTP1.Get(Edit1.Text, lStream); //Progress und Status aktualliesieren Progress.Position := BytesKopiert; Status.Caption := GetSizeName(BytesKopiert)+'/'+GetSizeName(BytesInsgesamt); //BytesKopiert weiter setzen BytesKopiert := BytesKopiert+cFileSplitSize; until (BytesKopiert >= BytesInsgesamt); //Schleife beenden wenn datei fertig finally if Assigned(lStream) then lStream.Free; //FileStream freigeben wenn gesetzt end; //Alles auf fertig stellen Status.Caption := 'Fertig'; SpeedStatus.caption := 'Fertig'; Progress.Position := 100; if FileExists(Edit2.Text) then begin Application.MessageBox ('Das Programm wird beendet, um ein Update zu installieren.','Update wird durchgeführt',0+48); ShellExecute(Handle, 'open', PChar(Edit2.Text), nil, nil, SW_NORMAL); Close; end; end; procedure TForm4.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Integer); begin if AWorkCountMax > 0 then Progress.Max := AWorkCountMax else Progress.Max := DateigroesseBytes; {FTime := GetTickCount; FBytes := 0; Application.ProcessMessages;} end; procedure TForm4.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer); begin Progress.Position := AWorkCount; application.ProcessMessages; { if not((GetTickCount - FTime) <= 0) then begin try SpeedStatus.caption := Format('%.2f KB/s', [(AWorkCount - FBytes) / (GetTickCount - FTime)]); except end; end; FTime := GetTickCount; FBytes := AWorkCount; Application.ProcessMessages; } end; procedure TForm4.BitBtn1Click(Sender: TObject); var ip : string; online, pc, pfad, installation, name : string; onl, off : real; i : integer; begin installation:=ExtractFilePath(ParamStr(0)); name:=installation+'update.exe'; Edit2.Text:=name; if IsConnectedToInternet then Edit5.Text:='1' else Edit5.Text:='0'; if Edit5.Text <> '0' then begin ip:=IdHTTP1.Get('http://www.bertbolz.de/home/nn/ip.php'); //ip Adresse online:=IdHTTP1.Get('http://www.bertbolz.de/home/nn/v.php?p=pm'); //Online Version pfad:=IdHTTP1.Get('http://www.bertbolz.de/home/nn/dir.php?p=pm'); //Pfad auf dem Server end; Label2.Caption:=ip; Edit3.Text:=online; Edit1.Text:=pfad; {i:=0; while online[i]='.' do begin i:=i+1; online[i]:=','; end; ShowMessage(online); onl:=StrToFloat(online); off:=0; if off < onl then begin Application.MessageBox ('Ein Update für Ihre Software ist verfügbar.','Versionstest',0+64); Edit5.Text:='1' end else begin Application.MessageBox ('Ein Update für Ihre Software ist nicht verfügbar.','Versionstest',0+64); Edit5.Text:='0'; end; } end; procedure TForm4.Edit5Change(Sender: TObject); begin if Edit5.Text='1' then Button1.Enabled:=True else Button1.Enabled:=False; end; procedure TForm4.FormClose(Sender: TObject; var Action: TCloseAction); begin Form2.Visible:=True; end; procedure TForm4.IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode); begin Progress.Position := 0; end; |
Re: Frage zu Download Code mit idHTTP aus Code-Library
Hi Lord,
wir kriegen das schon hin, also nimm mal die Schleife hier raus aus deinem Source:
Delphi-Quellcode:
und ersetze das durch
try
repeat // Damit sich das Programm nicht aufhängt Application.ProcessMessages; //Nun setzen wir den Start nach die bereits kopierten Bytes IdHTTP1.Request.ContentRangeStart := BytesKopiert; //Hier wird gebrüft ob die restlichen Bytes größer sind als cFileSplitSize if (BytesInsgesamt-BytesKopiert) > cFileSplitSize then begin //Hier wird einmal die cFileSplitSize eingestellt IdHTTP1.Request.ContentRangeEnd := BytesKopiert+cFileSplitSize-1; end //Den rest der Datei else IdHTTP1.Request.ContentRangeEnd := BytesInsgesamt; Application.ProcessMessages; //Den eingesttelten Teil herunterladen und ihn die Datei speichern IdHTTP1.Get(Edit1.Text, lStream); //Progress und Status aktualliesieren Progress.Position := BytesKopiert; Status.Caption := GetSizeName(BytesKopiert)+'/'+GetSizeName(BytesInsgesamt); //BytesKopiert weiter setzen BytesKopiert := BytesKopiert+cFileSplitSize; until (BytesKopiert >= BytesInsgesamt); //Schleife beenden wenn datei fertig finally if Assigned(lStream) then lStream.Free; //FileStream freigeben wenn gesetzt end; try idHTTP1.Get(Edit1.Text, lStream); Mom das natürlich natürlich wieder unten drunter finally if Assigned(lStream) then lStream.Free; //FileStream freigeben wenn gesetzt end; |
Re: Frage zu Download Code mit idHTTP aus Code-Library
Oh ja! Es war einfach und es funktioniert jetzt!
Vielen Dank an euch alle, vor allem Lun!!! :dp: :hello: :firejump: :bouncing4: :bounce1: :bounce2: :coder: :spin2: :chat: :coder2: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:35 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