![]() |
Download Tool
Hi, ich hab hier mal was im Forum gefunden und mal ausprobiert.
Leider geht das ganze nicht. Ich bekomme weder einen Fehler noch irgend was anderes, wenn ich den Button 1 Klick, passiert 0. Kann sich das mal einer anschauen?
Delphi-Quellcode:
Wäre net danke.
unit by;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP; type TForm1 = class(TForm) GroupBox1: TGroupBox; StatusBar1: TStatusBar; Progress: TProgressBar; SpeedLabel: TLabel; Status: TLabel; Button1: TButton; Edit1: TEdit; Edit2: TEdit; IdHTTP: TIdHTTP; Label1: TLabel; private FTime: Longword; //Beide Variablen werden für die kb/sec anzeige gebraucht FBytes: Longword; procedure IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer); procedure Button1Click(Sender: TObject); procedure IdHTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Integer); public { Public-Deklarationen } end; var Form1: TForm1; const cFileSplitSize : Int64 = 40*1024; //40 KB größe stücke wird die Datei zerhackt implementation {$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 TForm1.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 SpeedLabel.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'; SpeedLabel.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 IdHTTP.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 IdHTTP.Request.ContentRangeEnd := BytesKopiert+cFileSplitSize-1; end //Den rest der Datei else IdHTTP.Request.ContentRangeEnd := BytesInsgesamt; 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'; SpeedLabel.caption := 'Fertig'; Progress.Position := 100; end; end. |
DP-Maintenance
Dieses Thema wurde von "Luckie" von "Sonstige Fragen zu Delphi" nach "Internet / LAN / ASP.NET" verschoben.
Ist doch eindeutig, dass es um Internet geht, warum steht das hier bei \\"Sonstiges\\"? |
Re: Download Tool
klick mal deinen button1 im form zur design-zeit doppelt an. vielleicht ist ihm nicht die Button1Click Methode zugewiesen?
|
Re: Download Tool
Zitat:
|
Re: Download Tool
also der button ist richtig zugewiesen.
mit F7 steigt er bei: Application.Run; aus. :< |
Re: Download Tool
hmm, jetzt geht gar nix mehr . .
Im Project by_.exe ist eine Exception der Klasse EReadError aufgetretten. Meldung: 'Ungültiger Eigenschaftswert'. Prozess wurde angehalten . . . . Fehler beim lesen von Button1.OnClick hmm was bedeutet das jetzt genau? |
Re: Download Tool
Mach mal die Deklaration für die Button1Click Prozedur über dem Schlagwort Private rein...
[Edit] Das gilt im Zweifelsfall natürlich auch für die beiden Anderen...[/Edit] MfG Toni |
Re: Download Tool
okay jetzt kann ich ihn wennigstens wieder öffnen, aber delphi friert er ein wenn ich den button 1 click, nach ner zeit kommt ein fehler:
EIdSocketError . . . Meldung Socket-Fehler # 10060 |
Re: Download Tool
kann es sein das jetzt alles tut nur das das proxy hinter dem ich sitz, die indy komponente net raus lässt?
|
Re: Download Tool
Ja, das bekomme ich auch... Was steht denn in deinem Edit1 drin?
Bei mir ist nämlich immernoch der String "Edit1" drin. Und dass das ein gültiger header für die Socketvervindung ist kann ich mir nur schwer vorstellen... Toni BTW: Benutz doch bitte die Edit-Funktion, ja? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 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