Es gibt mehrere Fehlerquellen in deinem Code -
Der erste hat mit dem Einlesen von INIs nichts zu tun, sondern betrifft die StringListe. Wird die anderweitig freigegeben (sicher),denn nur so ließe sich der fehlende
try/
finally-Block erklären. Ich gehe mal davon aus, ansonsten müsste dein "äußerer" Code so aussehen:
Quelltext
1: 2: 3: 4: 5: 6:
| extensions := TStringList.Create; try { ... } finally extensions.Free; end; |
Nummer #2 wäre, dass du nicht wirklich prüfst, ob überhaupt eine INI-Datei vorhanden ist. Das Argument: "bei mir ist mindestens eine INI-Datei da", trifft vielleicht für dein System zu. Ein Anwender löscht möglicherweise die INIs in dem Verzeichnis, in dem dein Programm arbeitet.
Korrekter wäre also eine Prüfung wie:
Quelltext
1:
| if FindFirst('*.ini',faAnyFile,Results) = 0) then ... |
Ich persönlich bevorzuge eine integer-Variable und eine while-Schleife; aber das ist eine persönliche Sache, die ich noch aus alten TP-Tagen habe.
Eine mögliche Quelle des Versagens wäre die Einschränkung auf Dateinamen mit maximal 7 Zeichen. Was, wenn eine INI-Datei nun einen längeren Namen hat? In dem Fall trifft die Bedingung
Quelltext
1:
| if length(results.Name)<=7 then |
nicht mehr zu, und die Datei wird deiner Liste
nicht hinzugefügt.
Absoluter Fehler ist dies:
Quelltext
1: 2: 3:
| while findnext(Results)=0 do begin findnext(Results); { ... } |
Zweimal "FindNext" hintereinander. Kein Wunder, dass dadurch Dateien verlorengehen.
Und zu guter Letzt sollte man eine Dateisuche immer mit
Quelltext
abschließen.
Wir lernen also folgendes daraus:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| res := FindFirst('*.ini',faAnyFile,Results); while(res = 0) do begin if(length(Results.Name) <= 7) then extensions.Add(ChangeFileExt(Results.Name,''));
res := FindNext(Results); end; FindClose(Results); |
Bitteschön.
Gruß,
Mathias.