Delphi-PRAXiS

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 11. Mär 2007 14:31


Frage zu Download Code mit idHTTP aus Code-Library
 
Hi,

ich wollte den Code ausprobieren, aber ich bekomme eine Masse an Fehlermeldungen. Warum funktioniert das nicht?

Delphi-Quellcode:
procedure THaupt.IdHTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Integer);
Hier z.B.: ';' erwartet, aber '.' gefunden

Fehlt eine USES-Anweisung?

Delphi-Quellcode:
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP, ComCtrls;
Liebe Grüße!

PS:der Beitrag

ManuMF 11. Mär 2007 14:36

Re: Frage zu Download Code mit idHTTP aus Code-Library
 
Das liegt daran, dass Delphi THaupt nicht "kennt". Du musst entweder dein Hauptformular "Haupt" nennen oder im Code THaupt durch TForm1 (bzw. den Namen deines Formulars) ersetzen. Außerdem musst du die Prozeduren erst erstellen, z.B. durch Doppelklick auf das jeweilige Ereignis im Objektinspektor (onWorkBeginn bei IdHTTP etc.), denn der Code kann in den seltensten Fällen 1:1 übernommen werden.

The Lord 11. Mär 2007 14:47

Re: Frage zu Download Code mit idHTTP aus Code-Library
 
Danke! Ja ich bin gewöhnt, meine Komponentennamen nicht zu verändern und das ich die Prozeduren noch nicht erstellt hatte, daran hatte ich nicht gedacht :(

Danke :) :dp:

The Lord 11. Mär 2007 14:57

Re: Frage zu Download Code mit idHTTP aus Code-Library
 
Jetzt funktioniert das Programm. Aber wieso muss ich die Quelldatei für idHTTP.pas suchen? Normalerweise hat er das automatisch gemacht, oder irre ich mich?
Ich habe die Datei gefunden, aber jetzt stürzt das Programm ab, wenn ich auf den Button klicke und es kommt eine Fehlermeldung mit: 'Unknown Protocol'!

Und jetzt?

ManuMF 11. Mär 2007 15:02

Re: Frage zu Download Code mit idHTTP aus Code-Library
 
Eigentlich musst du die Quelldatei nicht suchen. Würde Delphi sie nicht finden, dann würde schon das Comilieren nicht klappen.

Die Meldung "Unknown Protocol" hat damit wahrscheinlich eher nichts zu tun. Es sieht eher so aus, als würde IdHTTP nicht mit dem Server klarkommen. Wie beginnt denn die Adresse, von der du runterladen willst?

The Lord 11. Mär 2007 15:10

Re: Frage zu Download Code mit idHTTP aus Code-Library
 
Ich habe gerade ausprobiert:

Wenn ich diese Datei laden will (die ich vorhabe zu laden), dann gibt es den entsprechenden Fehler: http://www.bertbolz.de/home/nn/ct.php?dl=pm

Bei einer Bilddatei der gleichen Seite funktioniert es!

The Lord 11. Mär 2007 15:40

Re: Frage zu Download Code mit idHTTP aus Code-Library
 
Ok es klappt. Ich habe nur die falsche Adresse genommen, ich musste Sie erst aus dem PHP-Code auslesen! Danke für alles... :)

The Lord 11. Mär 2007 15:50

Re: Frage zu Download Code mit idHTTP aus Code-Library
 
Oh nein! Es gibt ein weiteres Problem :'(

Es klappt alles wunderbar, nur wird der Download nicht richtig beendet. Die Datei ist 1,49 MB groß, aber der Download läuft weiter, obwohl er eigentlich abgeschlossen sein müsste. Die Fortschrittsanzeige läuft weiter bis 100%, dann wird aber die Datei größer als 50MB...

Vielleicht stimmt eine Zählschleife nicht?

The Lord 12. Mär 2007 21:49

Re: Frage zu Download Code mit idHTTP aus Code-Library
 
Ich hab noch rumprobiert, aber der läd einfach zu viel herunter :(
Woran liegt das? :wiejetzt:

Grüße

Lun 15. Mär 2007 13:06

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

war dass das Beispiel:

Beispiel idhttp download mit fortschrittsbalken ?

Bei diesem Beispiel hatte ich damals auch zwei Probleme, einmal stimmte die Angabe der Dateigröße nicht, ich glaube bei
der Berechnung der Dateigröße ist die Angabe der Bytes für ein Gigabyte ein Terrabyte gewesen.

Und beim Downloaden wurde die Datei viel größer als sie Orginal tatsächlich war, der Fehler den Du auch hast. Die Fortschrittsanzeige ist bei diesem Beispiel so realisiert das der Download geteilt abläuft und anhand der Bytes bestimmt wird wie weit der Download in der Progressbar ist. Das Problem hier ist aber das bei mir die Datei nachdem sie fertig war immer wieder neu heruntergeladen wurde,
bis zu einem bestimmten Zeitpunkt. Dadurch hast du dann ganz oft deine Daten in einer Datei.

Es kann sein das du den gleichen Fehler hast, entweder liegt das an dem Beispiel oder ich habe irgendetwas damals übersehen.
Also das zerhacken der Datei und das Stücke laden der Bytes ist dafür verantwortlich.

greetz Lun

P.S: Wenn das nicht das Beispiel war vergesse den Eintrag.

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 22:35 Uhr.

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