Einzelnen Beitrag anzeigen

lucius

Registriert seit: 6. Okt 2005
Ort: Niederlande
215 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: ProgressForm schliesst sich nicht.

  Alt 2. Dez 2005, 14:13
Den Fehler fuer die 3e Form hab ich schon selber gefunden, trotsdem Danke.
Hab mir den Code mal richtig angeschaut.
Delphi-Quellcode:
var
  BytesKopiert, BytesInsgesamt : int64;
  lStream: TFileStream;
begin
  Form3.Show; <--------------------ProgressForm anzeigen
  //Initialiesieren
  Form3.Status.Caption := '';
  BytesKopiert := 0;
  Form3.Progress.Position := 0;
  //In edit 1 steht die downzuladene Datei (z.b. [url]http://www.server.com/datei.dat[/url])
  Form3.Status.Caption := 'Prüfe Header';
  // Durch die zwei nächsten Befehle wird die Größe ermittelt und ihn der Variable BytesInsgesamt abgespeichert
  HTTP.Head(Form3.Edit1.Text);
  BytesInsgesamt := HTTP.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
    Form3.SpeedLabel.Caption := 'Normalles herunterladen';
    Form3.Status.Caption := 'Erstelle Datei';
    //In Edit 2 steht welche Datei (z.b. C:\datei.dat)
    //Datei erstellen
    lStream:=TFileStream.Create(Form3.Edit2.Text, fmCreate or fmShareDenyNone);
    try
      //und "normal" herunterladen
      HTTP.Get(Form3.Edit1.Text, lStream);
    finally
      if Assigned(lStream) then lStream.Free; //FileStream freigeben wenn gesetzt
    end;
    //Alles auf fertig stellen
    Form3.SpeedLabel.Caption := 'Fertig';
    Form3.Status.caption := 'Fertig';
    Form3.Close; <-------------------------------//Hier muss er auch noch rein!//
    exit;
  end;
  //Also wenn wir hier angelangt sind dann bedeutet es der Server hat uns die Dateigröße zur Verfügung gestellt.
  Form3.Progress.Max := BytesInsgesamt;
  Form3.Status.Caption := 'Erstelle Datei';
  //In Edit 2 steht welche Datei (z.b. C:\datei.dat)
  //Datei erstellen
  lStream:=TFileStream.Create(Form3.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
      HTTP.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
        HTTP.Request.ContentRangeEnd := BytesKopiert+cFileSplitSize-1;
      end
      //Den rest der Datei
      else HTTP.Request.ContentRangeEnd := BytesInsgesamt;
      Application.ProcessMessages;
      //Den eingesttelten Teil herunterladen und ihn die Datei speichern
      HTTP.Get(Form3.Edit1.Text, lStream);
      //Progress und Status aktualliesieren
      Form3.Progress.Position := BytesKopiert;
      Form3.SpeedLabel.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;
  Application.ProcessMessages;
  //Alles auf fertig stellen
  Form3.SpeedLabel.Caption := 'Fertig';
  Form3.Status.caption := 'Fertig';
  Form3.Progress.Position := 100;
  Form3.Close; <--------------------------ProgressForm schliessen, funktioniert nicht.
end;
Wer lesen kann ist klar im Vorteil.
  Mit Zitat antworten Zitat