Entwickler-Ecke
Dateizugriff - externer Fehler 80000004
colaka - Sa 25.06.11 06:43
Titel: externer Fehler 80000004
Hallo,
ich möchte ein paar tausend Bilder herunterladen. Das versuche ich mit dem folgenden Code:
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
Narses: Topic aus Internet / Netzwerk verschoben am Sa 25.06.2011 um 10:22
jaenicke - 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...
colaka hat folgendes geschrieben : |
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.
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 - 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:
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:
Wie kommt das Zustande?
Und wie kann ich das Beheben?
Danke Ebi
Moderiert von
Narses: Bild als Anhang hochgeladen.
jaenicke - 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!