![]() |
Re: noob hat problem mit idHTTP
Liste der Anhänge anzeigen (Anzahl: 1)
also jetzt passts da oben, thx. Nur jetzt kommt das nächste problem.
komplett-code:
Delphi-Quellcode:
neuer error:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP; type TForm1 = class(TForm) IdHTTP: TIdHTTP; Button1: TButton; Edit1: TEdit; Edit2: TEdit; SpeedLabel: TLabel; Status: TLabel; Progress: TProgressBar; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } FTime: Longword; //Beide Variablen werden für die kb/sec anzeige gebraucht FBytes: Longword; // --"-- public { Public-Deklarationen } procedure IdHTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Integer); procedure IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer); end; var Form1: TForm1; const cFileSplitSize : Int64 = 40*1024; //40 KB größe stücke wird die Datei zerhackt implementation //uses unit2; {$R *.dfm} function GetSizeName(const Size : int64): String; begin Result := 'Fehler'; if Size = -1 then exit; if Size < 1024 then begin Result := IntToStr(Size)+' Byte'; exit; end; if (1024 <= Size) and (Size < 1048576) then begin Result := floattostr((round((Size/1024)*100))/100)+' KB'; exit; end; if (1048576 <= Size) and (Size < 1099511627776) then begin Result := floattostr((round((Size/1048576)*100))/100)+' MB'; exit; end; if Size > 1099511627776 then begin Result := floattostr((round((Size/1099511627776)*100))/100)+' GB'; end; end; procedure THaupt.IdHTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Integer); begin FTime := GetTickCount; FBytes := 0; Application.ProcessMessages; end; procedure TForm1.IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer); begin 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 TForm1.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 IdHTTP.Head(Edit1.Text); BytesInsgesamt := IdHTTP.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 idHTTP.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; //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 IdHttp.Request.Range := Format('%d-%d', [BytesInsgesamt, (BytesKopiert+cFileSplitSize-1)]); end else IdHttp.Request.Range := Format('%d-', [BytesKopiert]); Application.ProcessMessages; //Den eingesttelten Teil herunterladen und ihn die Datei speichern IdHTTP.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; end; end. Grafik im Anhang [edit=Matze][15.05.08] Grafik angehängt, da die Imageshack-Server dermaßen langsam sind. Gut, dass sich das Bild dort noch befand, sonst wäre das Thema nutzlos. MfG, Matze[/edit] |
Re: noob hat problem mit idHTTP
Deine Form-Klasse heißt TForm1 nicht THaupt.
|
Re: noob hat problem mit idHTTP
Liste der Anhänge anzeigen (Anzahl: 1)
und bam wer hats erraten...der nächste error....thanx fuer deine geduld :-D
Grafik im Anhang [edit=Matze][15.05.08] Grafik ebenfalls angehängt. MfG, Matze[/edit] |
Re: noob hat problem mit idHTTP
Hast du auch die gleiche Version von INDY?
|
Re: noob hat problem mit idHTTP
edit:
Also ich hab das tut benützt: ![]() doch anstatt den ...60.dpk hab ich immer ...100.dpk geöffnet. Passt das? [edit=Christian Seehase]Push-Beitrag gelöscht. Pushen von Threads frühestens nach 24 Stunden. (nicht nach 57 Minuten :!: . Ich glaube das ist neuer Rekord :gruebel:) Mfg, Christian Seehase[/edit] @ Chris, sorry habs bissl eilig :)...w00t rekord? xD |
Re: noob hat problem mit idHTTP
Wenn ich den Thread mal kapern darf...
Gleiches Tut, läuft alles. Bis auf die Tatsache, dass das Event OnWork nicht befeuert wird. Wird während dem gesamten Download nicht einmal ausgelöst. Somit habe ich auch keine Anzeige der KB/s. Irgendeine Idee warum das so ist? |
Re: noob hat problem mit idHTTP
Zitat:
|
Re: noob hat problem mit idHTTP
Zitat:
|
Re: noob hat problem mit idHTTP
Eigentlich genauso, wie es in
![]() Hab den Code gerad enicht zur Hand, sonst würde ich ihn posten. Aber wie gesagt, habe nur die Anleitung ausprobiert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:52 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