AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Frage zu Download Code mit idHTTP aus Code-Library
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zu Download Code mit idHTTP aus Code-Library

Ein Thema von The Lord · begonnen am 11. Mär 2007 · letzter Beitrag vom 22. Mär 2007
Antwort Antwort
Seite 2 von 2     12   
The Lord

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

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

  Alt 15. Mär 2007, 22:21
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!
Alexander
Dunkel die andere Seite ist...
Klappe Yoda und iss deinen Toast!
  Mit Zitat antworten Zitat
Benutzerbild von Lun
Lun

Registriert seit: 4. Feb 2006
122 Beiträge
 
Delphi 2005 Professional
 
#12

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

  Alt 16. Mär 2007, 10:09
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

 ProgressBar1.Position := 0;
So hoffe ich könnte dir weiterhelfen ansonsten mußt du mal den verfasser gsh fragen.

greetz Lun
  Mit Zitat antworten Zitat
The Lord

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

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

  Alt 18. Mär 2007, 14:16
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 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ß
Alexander
Dunkel die andere Seite ist...
Klappe Yoda und iss deinen Toast!
  Mit Zitat antworten Zitat
Benutzerbild von Lun
Lun

Registriert seit: 4. Feb 2006
122 Beiträge
 
Delphi 2005 Professional
 
#14

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

  Alt 19. Mär 2007, 08:29
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
  Mit Zitat antworten Zitat
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
Benutzerbild von Lun
Lun

Registriert seit: 4. Feb 2006
122 Beiträge
 
Delphi 2005 Professional
 
#16

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

  Alt 21. Mär 2007, 10:07
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;
  Mit Zitat antworten Zitat
The Lord

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

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

  Alt 22. Mär 2007, 16:17
Oh ja! Es war einfach und es funktioniert jetzt!

Vielen Dank an euch alle, vor allem Lun!!!
Alexander
Dunkel die andere Seite ist...
Klappe Yoda und iss deinen Toast!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz