folgendes Problem:
Ich habe einen Algorithmus geschrieben, der einen angegebenen Ordner und die Unterordner nach Dateien durchsucht. Als kleine Übung und weil mir die Funktion FindAllFiles() nicht ausreicht, weil sie nicht die Datei-Attribute berücksichtigt.
Jedenfalls habe ich dann die Ergebnisse in eine ListBox ausgegeben und wollte nach ganz unten scrollen und dann kamen folgende Fehlermeldungen:
1. Debuggerausnahmen-Nachricht
Projekt <beliebiger Projektname> hat Exception-Klasse >>RunError(201)<< ausgelöst.
In Datei 'win32\win32callback.inc' in Zeile 742:
ScrollCode := LOWROD(WParam);
2. Debuggerausnahmen-Nachricht
Projekt <beliebiger Projektname> hat Exception-Klasse >>ERangeError<< ausgelöst mit der Meldung:
Range check error.
In Datei 'win32\win32callback.inc' in Zeile 742:
ScrollCode := LOWROD(WParam);
Dann habe ich mir den Quellcode der Datei angesehen, in der die Exception auftritt und folgenden Kommentar gefunden:
MWE hat geschrieben:TLMScroll has not the same size as the VCL/Winapi counterpart.
IMO we don't have to force all widgetsets to be compatible in a shortcoming
in the win32 API.
So POS: SmallInt -> LongInt and a win32compatible smallpos is added
Due to this, the record is a LongInt to large.
Lässt sich mit folgendem Code reproduzieren:
Code: Alles auswählen
ListBox1.Items.BeginUpdate;
repeat
ListBox1.Items.Add('TEST');
ListBox1.Tag := ListBox1.Tag + 1;
until ListBox1.Tag = 40000; // mit 30.000 geht es noch aber mit High(SmallInt) + 20 schon nicht mehr
ListBox1.Items.EndUpdate;
Natürlich könnte man sich jetzt fragen, ob man unbedingt 30.000 Items in einer ListBox haben möchte, aber so viele sind es doch auch nicht. Wenn es etliche Milliarden wären, hätte ich ja noch Verständnis.
Gibt es eine Möglichkeit, diesen Fehler zu umgehen? Ich habe probiert, die Datentypen anzupassen, also aus SmallInt -> Integer, aber das klappt nicht. (Hätte ich mir auch denken können, denn, wenn es gehen würde, würde es dort auch stehen. Ich probiere eben gerne rum.)
-- Dee