Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Frage zu Download Code mit idHTTP aus Code-Library (https://www.delphipraxis.net/88183-frage-zu-download-code-mit-idhttp-aus-code-library.html)

The Lord 15. Mär 2007 22:21

Re: Frage zu Download Code mit idHTTP aus Code-Library
 
Hi Lun,

ja richtig, ich habe auch das Beispiel benutzt. Die Datei wird heruntergeladen und immer wieder in sich selbst kopiert (wie soll ich es anders sagen ^^).

Hast du das Problem denn gelöst? Man muss also die Abbruchbedingung der Repeat-Schleife ändern, bzw. die Dateigröße anpassen?


Gute Nacht! :angel:

Lun 16. Mär 2007 10:09

Re: Frage zu Download Code mit idHTTP aus Code-Library
 
Hi Lord,

Zum ersten Problem :
Die Dateigröße

Das muss geändert werden damit GB amgezeigt werden und nicht Terrabyte:

Delphi-Quellcode:
 if (1048576 <= Size) and (Size < 1073741824) then
  begin
    Result := floattostr((round((Size/1048576)*100))/100)+' MB';
    exit;
  end;
  if Size > 1073741824 then
  begin
    Result := floattostr((round((Size/1073741824)*100))/100)+' GB';
  end;
Das zweite Problem habe ich dann nachher anders gemacht ist zwar nicht so genau wie die vorgesehene Methode
aber funktioniert auch und erfüllt ihren Zweck.

ich lade die DAtei wieder im ganzen runter mit idhttp.get(link,stream);

und benutze da zu die drei Ereignisse

Work, WorkBegin,WorkEnd

Ich habe das dann so wie in diesem Beispiel gelöst:

Beispiel

In WorBegin

Delphi-Quellcode:
 if AWorkCountMax > 0 then ProgressBar1.Max := AWorkCountMax
    else ProgressBar1.Max := DateigrößeBytes;
In Work

Delphi-Quellcode:
 ProgressBar1.Position := AWorkCount;
     application.ProcessMessages;
und zu letzt

workEnd

Delphi-Quellcode:
 ProgressBar1.Position := 0;

So hoffe ich könnte dir weiterhelfen ansonsten mußt du mal den verfasser gsh fragen.

greetz Lun

The Lord 18. Mär 2007 14:16

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

Zitat von Lun
Zum ersten Problem :
Die Dateigröße

Das muss geändert werden damit GB amgezeigt werden und nicht Terrabyte:

Delphi-Quellcode:
 if (1048576 <= Size) and (Size < 1073741824) then
  begin
    Result := floattostr((round((Size/1048576)*100))/100)+' MB';
    exit;
  end;
  if Size > 1073741824 then
  begin
    Result := floattostr((round((Size/1073741824)*100))/100)+' GB';
  end;

Das habe ich erfolgreich geändert.

Zitat:

Zitat von Lun

ich lade die DAtei wieder im ganzen runter mit idhttp.get(link,stream);

und benutze da zu die drei Ereignisse

Work, WorkBegin,WorkEnd

Ich habe das dann so wie in diesem Beispiel gelöst:

Beispiel

In WorBegin

Delphi-Quellcode:
 if AWorkCountMax > 0 then ProgressBar1.Max := AWorkCountMax
    else ProgressBar1.Max := DateigrößeBytes;

Woher kennt er die Variable 'DateigrößeBytes' ?

Werden die alten Ereignisse durch deine neuen ersetzt oder ergänzt? Ersetzt, oder?


--
Gruß

Lun 19. Mär 2007 08:29

Re: Frage zu Download Code mit idHTTP aus Code-Library
 
Hi Lord,

ich hole mir die DateigrößeBytes aus dem Header der runterzuladenen Datei
und zwar so:

DateigrößeBytes := IdHTTP1.Response.ContentLength;

DateigrößeBytes : int64; ist als int64 deklariert nur zur info.

greetz Lun

The Lord 20. Mär 2007 18:02

Re: Frage zu Download Code mit idHTTP aus Code-Library
 
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 <> '0' then
    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='1' then
    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;

Lun 21. Mär 2007 10:07

Re: Frage zu Download Code mit idHTTP aus Code-Library
 
Hi Lord,

wir kriegen das schon hin, also nimm mal die Schleife hier raus aus deinem Source:

Delphi-Quellcode:
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;
und ersetze das durch

try

idHTTP1.Get(Edit1.Text, lStream);

Mom das natürlich natürlich wieder unten drunter

finally
if Assigned(lStream) then lStream.Free; //FileStream freigeben wenn gesetzt
end;

The Lord 22. Mär 2007 16:17

Re: Frage zu Download Code mit idHTTP aus Code-Library
 
Oh ja! Es war einfach und es funktioniert jetzt!

Vielen Dank an euch alle, vor allem Lun!!!
:dp: :hello: :firejump: :bouncing4: :bounce1: :bounce2: :coder: :spin2: :chat: :coder2:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:57 Uhr.
Seite 2 von 2     12   

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