Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Download Tool (https://www.delphipraxis.net/56748-download-tool.html)

BackYard 10. Nov 2005 13:44


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:
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.
Wäre net danke.

DP-Maintenance 10. Nov 2005 13:45

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\\"?

mumu 10. Nov 2005 13:47

Re: Download Tool
 
klick mal deinen button1 im form zur design-zeit doppelt an. vielleicht ist ihm nicht die Button1Click Methode zugewiesen?

Luckie 10. Nov 2005 13:47

Re: Download Tool
 
Zitat:

Zitat von BackYard
Hi,
Ich bekomme weder einen Fehler noch irgend was anderes, wenn ich den Button 1 Klick, passiert 0.

Dann geh das ganze doch mal mit F7 Schritt für Schritt durch und guck, wo er aussteigt.

BackYard 10. Nov 2005 14:00

Re: Download Tool
 
also der button ist richtig zugewiesen.

mit F7 steigt er bei: Application.Run;
aus.
:<

BackYard 10. Nov 2005 14:06

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?

Tonic1024 10. Nov 2005 14:15

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

BackYard 10. Nov 2005 14:23

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

BackYard 10. Nov 2005 14:24

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?

Tonic1024 10. Nov 2005 14:25

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.
Seite 1 von 2  1 2      

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