![]() |
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 02:57 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