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: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18

Win 7 64 bit
Delphi 2009 Professional
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: So 26.06.11 10:53 
user profile iconkoegi hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 26.06.11 10:56 
Was kommt denn genau für eine Zugriffsverletzung? Adresse, Zugriffszieladresse?
colaka Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 4

Win XP, W7
Delphi 2005 Prof.
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
try
  // Fehlerbehaftener Code
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 26.06.11 11:59 
user profile iconcolaka hat folgendes geschrieben Zum zitierten Posting springen:
Die Fehlermeldung lautet:
Zugriffsverletzung bei Adresse xxx in Modul Programm.exe. Schreiben von Adresse yyy.
Und das wichtigste lässt du weg... :roll:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 4

Win XP, W7
Delphi 2005 Prof.
BeitragVerfasst: 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?

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 26.06.11 14:37 
user profile iconcolaka hat folgendes geschrieben Zum zitierten Posting springen:
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? :gruebel:
Da gibt es vielleicht einen sinnvolleren Weg.
colaka Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 4

Win XP, W7
Delphi 2005 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 26.06.11 16:33 
user profile iconcolaka hat folgendes geschrieben Zum zitierten Posting springen:
Die Bilder lade ich in einer Schleife, weil ich sie auf ein Standardmaß verkleinern will.
Und dafür packst du die in ein TImage? :lol: Geht es dir ohne zu schnell? ;-)

user profile iconcolaka hat folgendes geschrieben Zum zitierten Posting springen:
Trotzdem würde mich interessieren, warum trotz try..except die Fehlermeldung auftritt.
Bist du sicher, dass das in der Zeile auftritt? Da es danach weitergeht, bin ich mir nicht sicher, denn eigentlich muss die Exception ja abgefangen werden, sonst ginge es nicht weiter. :gruebel:

Lässt sich der Fehler mit einem der Bilder einzeln reproduzieren? Dann könntest du vielleicht eine Demo anhängen?
colaka Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 4

Win XP, W7
Delphi 2005 Prof.
BeitragVerfasst: So 26.06.11 16:47 
ja, das habe ich doch 3 Beiträge weiter vorher gemacht.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 4

Win XP, W7
Delphi 2005 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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