Einzelnen Beitrag anzeigen

The Lord

Registriert seit: 19. Sep 2005
Ort: Dortmund
125 Beiträge
 
Turbo Delphi für Win32
 
#15

Re: Frage zu Download Code mit idHTTP aus Code-Library

  Alt 20. Mär 2007, 18:02
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 <> '0then
    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='1then
    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;
Alexander
Dunkel die andere Seite ist...
Klappe Yoda und iss deinen Toast!
  Mit Zitat antworten Zitat