Autor |
Beitrag |
colaka
      
Beiträge: 200
Erhaltene Danke: 4
Win XP, W7
Delphi 2005 Prof.
|
Verfasst: So 26.06.11 10:32
Hallo,
ich möchte alle Bilder in einem Ordner verkleinern. Dazu lade ich die Bildnamen in eine Listbox, um sie dann Bild für Bild auf ein Standardmaß zu bringen. Leider bekomme ich schon beim Schleifendurchlauf durch die Listbox bei manchen Bildern eine Zugriffsverletzung.
Ich denke eigentlich, mit dem folgenden Code tue ich eigentlich schon zuviel des Guten.
Obwohl ich die Listbox soeben erst mit den Dateinamen gefüllt habe, prüfe ich nochmal, ob die Datei existiert, und die LoadFromFile-Methode habe ich in einen Try-Block gepackt. Also mir ist es ein völliges Rätsel, wo da jetzt noch eine Zugriffsverletzung herkommen kann.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| Gauge.Visible := true; Gauge.ForeColor := $0082F6; Gauge.MaxValue := ListBox.Items.Count; for i := 0 to ListBox.Items.Count do begin if Abbruch then exit else begin if FileExists(ListBox.Items[i]) then try ImageBild.Picture.LoadFromFile(ListBox.Items[i]); except end; ListBox.ItemIndex := i; Gauge.Progress := i; Application.ProcessMessages; end; end; Gauge.Visible := false; |
Aber irgendwo muß ich da wohl mal wieder einen Denkfehler haben.
Danke Ebi
Zuletzt bearbeitet von colaka am Mo 27.06.11 05:27, insgesamt 2-mal bearbeitet
|
|
koegi
      
Beiträge: 18
Win 7 64 bit
Delphi 2009 Professional
|
Verfasst: So 26.06.11 10:46
Hallo, colaka!
Ich glaube, dass Problem liegt beim Index.
Du lässt zwar die for-Schleife richtigerweise bei 0 beginnen, allerdings bis count anstatt bis count-1. Denn count liefert die gesamte Anzahl der Einträge und nicht den höchsten Index-Eintrag.
Viele Grüße
Thomas
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: So 26.06.11 10:53
koegi hat folgendes geschrieben : | Ich glaube, dass Problem liegt beim Index. |
Müsste dann nicht zunächst ein 'List index out of bounds (<Index>)'-Error erscheinen?
Ich schlage daher vor, Breakpoint setzen und mit allen bekannten Mitteln debuggen. 
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 26.06.11 10:56
Was kommt denn genau für eine Zugriffsverletzung? Adresse, Zugriffszieladresse?
|
|
colaka 
      
Beiträge: 200
Erhaltene Danke: 4
Win XP, W7
Delphi 2005 Prof.
|
Verfasst: So 26.06.11 11:04
Hallo,
vielen Dank für die schnellen Antworten.
Also das mit dem Index kann wohl nicht sein, weil der Fehler während des Schleifendurchlaufs auftritt. Da es sich um ein paar tausend Bilder handelt, habe ich die Schleife noch gar nie bis zum Ende durchlaufen lassen.
Der Fehler tritt immer so etwa nach ein paar Hundert Bildern auf. Es handelt sich aber immer um dieselben Bilder. Die Fehlermeldung lautet:
Zugriffsverletzung bei Adresse xxx in Modul Programm.exe. Schreiben von Adresse yyy.
Wenn ich die Fehlermeldung wegklicke, läuft das Programm weiter, als wäre nichts geschehen.
Danke Ebi
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: So 26.06.11 11:32
Vielleicht geht es eleganter, aber eine Möglichkeit um an die Stelle zu gelangen, in der der Error-Auftritt, könnte so aussehen:
Delphi-Quelltext 1: 2: 3: 4: 5:
| try except ShowMessage('Error occured at index: ' + IntToStr(i)); end; |
Mit dem Index kannst du nun bequem im Debug-Modus an die Stelle springen, in der der Error auftritt und dort deine Variablen analysieren.
Beste Grüße
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 26.06.11 11:59
colaka hat folgendes geschrieben : | Die Fehlermeldung lautet:
Zugriffsverletzung bei Adresse xxx in Modul Programm.exe. Schreiben von Adresse yyy. |
Und das wichtigste lässt du weg...
Was steht bei xxx und yyy?
// EDIT:
Falls die Adressen alle größer als 200 oder so sind und es sich um JPEG-Dateien handelt, kommt Delphis JPEG-Unit mit diesen Dateien nicht klar. Dann könntest du einmal GraphicEx oder so ausprobieren (und natürlich die Bilder erst einmal manuell in Paint oder so anschauen, ob das die lesen kann).
|
|
colaka 
      
Beiträge: 200
Erhaltene Danke: 4
Win XP, W7
Delphi 2005 Prof.
|
Verfasst: So 26.06.11 12:09
Hallo,
also die Fehlermeldung lautet vollständig:
Zugriffsverletzung an Adresse 005FC291 in Modul 'QuantallV.exe'. Schreiben von Adresse 043AC000.
Das beanstandete Bild läßt sich von meinem Programm aus auch nicht einzeln, also ohne die Schleife aufrufen, über den Windows-Explorer wird es aber ohne weiteres in ein Bildbearbeitungsprogramm geladen.
Das Problem läßt sich also auf die Frage reduzieren, warum wird im folgenden Code trotz des Try-Except-Blockes eine Zugriffsverletzung ausgelöst bzw. wie kann ich das beheben?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TFBildURL.Button2Click(Sender: TObject); var i : Integer; begin i := ListBox.ItemIndex; try ImageBild.Picture.LoadFromFile(ListBox.Items.Strings[i]); except end; end; |
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 26.06.11 14:37
colaka hat folgendes geschrieben : | Das Problem läßt sich also auf die Frage reduzieren, warum wird im folgenden Code trotz des Try-Except-Blockes eine Zugriffsverletzung ausgelöst bzw. wie kann ich das beheben? |
Die Exception siehst du natürlich trotzdem, wenn du im Debugger aus Delphi heraus startest. Denn da möchtest du ja Fehler mitbekommen. Wenn du das Programm einzeln startest, siehst du die Exception natürlich nicht.
Ja, du könntest eine andere Grafikbibliothek, eben wie GraphicEx, versuchen.
Warum willst du eigentlich so schnell hintereinander neue Bilder laden?
Da gibt es vielleicht einen sinnvolleren Weg.
|
|
colaka 
      
Beiträge: 200
Erhaltene Danke: 4
Win XP, W7
Delphi 2005 Prof.
|
Verfasst: So 26.06.11 16:05
Hallo,
nein, die Fehlermeldung kommt auch ohne Delphi. Das ist ja das, was mich wundert (und frage).
Die Bilder lade ich in einer Schleife, weil ich sie auf ein Standardmaß verkleinern will. Das war bis jetzt nur der Anfang, also noch ohne Verkleinerung.
Inzwischen habe ich alles fertig, und die Bilder werden wunschgemäß verkleinert. Bei insgesamt 10.000 Bildern sind nur 3 dabei, die den Fehler erzeugen. Den muß ich dann halt wegklicken.
Trotzdem würde mich interessieren, warum trotz try..except die Fehlermeldung auftritt.
Danke Ebi
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 26.06.11 16:33
|
|
colaka 
      
Beiträge: 200
Erhaltene Danke: 4
Win XP, W7
Delphi 2005 Prof.
|
Verfasst: So 26.06.11 16:47
ja, das habe ich doch 3 Beiträge weiter vorher gemacht.
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 26.06.11 19:36
Stimmt, sorry. Kannst du das vielleicht als Demo posten?
Und was passiert eigentlich, wenn du das nicht in ein TImage lädst, sondern nur non-visuell, wie du es ja auch nur brauchst?
Hast du GraphicEx mal ausprobiert?
|
|
colaka 
      
Beiträge: 200
Erhaltene Danke: 4
Win XP, W7
Delphi 2005 Prof.
|
Verfasst: So 26.06.11 19:57
Hallo,
es stimmt schon, zum Verkleinern brauche ich das Bild nicht im Image, aber später dann doch.
Eine Demo mit dem Fehler habe ich angefügt.
Danke Ebi
Einloggen, um Attachments anzusehen!
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 26.06.11 20:34
Ja, das ist der Jpeg-Fehler, den ich meinte. Mit Delphi XE lässt sich das Projekt problemlos kompilieren und fehlerfrei ausführen.
Für ältere Delphiversionen wie deine kannst du NativeJpg als Ersatz nehmen und statt der Unit Jpeg im Projekt einbinden:
www.simdesign.nl/nativejpg.html
Damit funktioniert es auch problemlos.
Für diesen Beitrag haben gedankt: colaka
|
|
|