Autor Beitrag
colaka
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 4

Win XP, W7
Delphi 2005 Prof.
BeitragVerfasst: Sa 25.06.11 06:43 
Hallo,

ich möchte ein paar tausend Bilder herunterladen. Das versuche ich mit dem folgenden Code:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure TFKategorieBilder.ButtonDownloadClick(Sender: TObject);
var
  Datei : TFileStream;
  http : TIdHTTP;
begin
  Datei := nil;
  DatMod.TBilder.First;
  while not DatMod.TBilder.Eof do begin
    LabelURL.Caption := DatMod.TBilderURL.AsString;
    if DatMod.TArtikel.Locate('HerstBez', DatMod.TBilderArtID.AsString, []) then begin
      try
        Datei := TFileStream.Create(UHaupt.Programmpfad + 'Bilder\HighPic\' +
          DatMod.TArtikelArtID.AsString + '.jpg', fmCreate);
        http := TIdHTTP.Create(nil);
        try
          IdHTTP.Get(DatMod.TBilderURL.AsString, Datei);
        finally
          Datei.Free;
        end;
      finally
        http.Free;
      end;
    end;
    Application.ProcessMessages;
    if Abbruch then exit else DatMod.TBilder.Next;
  end;
end;


Das Programm lädt auch ca. 80 Bilder herunter und bleibt dann immer an demselben Bild hängen. Die ausgegebene Fehlermeldung lautet: "externer Fehler 80000004".

Ich habe natürlich überprüft, ob das Bild vorhanden ist. Es läßt sich auch problemlos von Hand herunterladen, bloß mit dem obigen Code nicht.

Da es mir bei der Riesenmenge auf ein Bild mehr oder weniger nicht ankommt und ich leicht auf 1 Bild von 80 verzichten kann, ist meine Frage:
Wie kann ich den obigen Code so verändern, daß das Programm die Fehlermeldung abfängt und einfach mit dem nächsten Bild weitermacht?

Natürlich würde mich auch interessieren, was die Fehlermeldung bedeutet.

Danke Ebi


Moderiert von user profile iconNarses: Topic aus Internet / Netzwerk verschoben am Sa 25.06.2011 um 10:22


Zuletzt bearbeitet von colaka am Sa 25.06.11 10:06, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 25.06.11 07:03 
Warum erstellst du denn ständig die TIdHttp-Komponente neu? :shock:
// EDIT: Zudem nutzt du die ja nicht einmal...
user profile iconcolaka hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
        http := TIdHTTP.Create(nil);
        try
          IdHTTP.Get(DatMod.TBilderURL.AsString, Datei);
Wieso lässt sich der Code kompilieren? Hast du da noch eine solche Komponente auf dem Formular oder so? :gruebel:

Zudem sind die Ressourcenschutzblöcke abenteuerlich gesetzt.
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
procedure TFKategorieBilder.ButtonDownloadClick(Sender: TObject);
var
  Datei: TFileStream;
  http: TIdHTTP;
begin
  http := TIdHTTP.Create(nil);
  try
    DatMod.TBilder.First;
    while not DatMod.TBilder.Eof do
    begin
      LabelURL.Caption := DatMod.TBilderURL.AsString;
      if DatMod.TArtikel.Locate('HerstBez', DatMod.TBilderArtID.AsString, []) then
      begin
        Datei := TFileStream.Create(UHaupt.Programmpfad + 'Bilder\HighPic\' +
          DatMod.TArtikelArtID.AsString + '.jpg', fmCreate);
        try
          http.Get(DatMod.TBilderURL.AsString, Datei);
        finally
          Datei.Free;
        end;
      end;
      Application.ProcessMessages;
      if Abbruch then
        Exit 
      else
        DatMod.TBilder.Next;
    end;
  finally
    http.Free;
  end;
end;
Wenn das Problem dennoch auftritt, musst du wohl den Fehler mit try..except abfangen.
colaka Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 4

Win XP, W7
Delphi 2005 Prof.
BeitragVerfasst: Sa 25.06.11 09:47 
Hallo,

inzwischen bin ich wohl in der falschen Rubrik, denn das Problem hat überhaupt nichts mit dem Herunterladen zu tun, sondern mit dem Erzeugen der Datei. Den Code habe ich inzwischen soweit reduziert, daß das Ganze eindeutig ist:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
procedure TFKategorieBilder.Button1Click(Sender: TObject);
var
  D : TFileStream;
begin
  DatMod.TBilder.First;
  while not DatMod.TBilder.Eof do begin
    if DatMod.TArtikel.Locate('HerstBez', DatMod.TBilderArtID.AsString, []) then begin
      LabelURL.Caption := DatMod.TBilderURL.AsString;
      Application.ProcessMessages;
      try
        try
          D := TFileStream.Create(UHaupt.Programmpfad + 'Bilder\' +
            DatMod.TArtikelArtID.AsString + '.jpg', fmCreate);
        except
          ShowMessage('Fehler');
        end;
      finally
        D.Free;
      end;
    end;
  if Abbruch then exit else DatMod.TBilder.Next;
  end;
end;


Nach dem Bestätigen der Fehlermeldung erscheint das folgende Fenster:

Fehler

Wie kommt das Zustande?
Und wie kann ich das Beheben?

Danke Ebi

Moderiert von user profile iconNarses: Bild als Anhang hochgeladen.
Einloggen, um Attachments anzusehen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 25.06.11 09:53 
Ich habe doch schon geschrieben, dass deine Ressourcenschutzblöcke falsch gesetzt sind. Jetzt hast du die HTTP-Konponente (bei der es falsch war) herausgenommen und es stattdessen bei der Datei falsch gemacht.

D ist überhaupt nicht initialisiert, da im Konstruktor von TFileStream ein Fehler aufgetreten ist. Da du diese Zeile aber fälschlicherweise innerhalb des try-Blocks hast, landest du trotz des Fehlers bei D.Free und das knallt logischerweise. Denn du greifst dabei auf D, also eine zufällige Stelle im Speicher, zu.

Für diesen Beitrag haben gedankt: colaka