![]() |
Debugger-Exception bei Einsatz von Stringlist
Halli Hallo!
Ich möchte in meinem Programm erreichen, dass mittels einer Prozedur alle Namen der Dateien eines Verzeichnisses ohne Dateinamenerweiterung in einer Listbox angezeigt werden. Um nun aber die Dateien an sich weiterzuverwenden, soll der volle Dateipfad jeder Datei parallel in ein TStrings-Objekt eingefügt werden. Folgende Prozedur habe ich dafür gefertigt:
Delphi-Quellcode:
Diese werden dann folgendermaßen aufgerufen (dateiliste:TStrings):
procedure ListeDir(Path: string; FileList: TStrings; ext:boolean);
var SR: TSearchRec; begin if FindFirst(Path + '*.*', faAnyFile, sr) = 0 then begin repeat if ((sr.Attr and faDirectory) <> faDirectory) and (sr.Name <> '.') and (sr.Name <> '..') then begin if MatchesMask(sr.Name,'*.avi') OR MatchesMask(sr.Name,'*.mpeg') OR MatchesMask(sr.Name,'*.mpg') then begin if ext then begin sr.name:= StringReplace(sr.name,'.avi','',[rfReplaceAll]); sr.name:= StringReplace(sr.name,'.mpg','',[rfReplaceAll]); sr.name:= StringReplace(sr.name,'.mpeg','',[rfReplaceAll]); end; FileList.Append(sr.Name); end; end; until FindNext(sr) <> 0; FindClose(sr); end; end;
Delphi-Quellcode:
Wenn ich dies so verwende, wird zwar alles einwandfrei compiliert, wird die Prozedur aber in der Laufzeit aufgerufen, brignt der Debuger mir eine Fehlermeldung (Typ C0000005) und mein Programm bleibt stehen.
ListDir('c:\irgendwas',Listbox1.Items,true);
ListDir('c:\irgendwas',dateiliste,false); Habt ihr 'ne Idee, wie ich das ganze effizienter machen kann, bzw.überhaupt erstmal zum Funktionieren bringen könnte? |
Re: Debugger-Exception bei Einsatz von Stringlist
effizenter? Ja, da habe ich ein paar Anmerkungen:
1. MatchesMask() ist recht aufwendig - vor allem wenn du nur die Endung vergleichen willst. Dann nutze lieber einmalig ![]() 2. Du willst die Dateiendung entfernen. Dein StringReplace würde diese Endung auch entfernen wenn sie irgendwo in der Mitte des Dateinamens auftreten. Von daher nutze lieber die dafür gedachte ![]() So und warum es bei dir mit einer AV im Kernel/kernel32.dll abstürzt, kann ich von den hier geposteten Ausschnitten nicht erkennen. Hier scheint es grundlegend erstmal in Ordnung zu sein. Ich könnte mir nur vorstellen, dass du "dateiliste" nirgendwo instanziiert hast. |
Re: Debugger-Exception bei Einsatz von Stringlist
Herzlich willkommen in der Delphi-PRAXiS, grebaldi.
SR solltest du nur auslesen:
Delphi-Quellcode:
Freundliche Grüße
procedure ListDir(const Path: string; FileList: TStrings; ext: Boolean);
var SR: TSearchRec; begin Assert(Assigned(FileList), 'Gotcha!'); // EDIT if FindFirst(IncludeTrailingPathDelimiter(Path) + '*.*', faAnyFile, sr) = 0 then begin repeat if ((sr.Attr and faDirectory) <> faDirectory) and (sr.Name <> '.') and (sr.Name <> '..') and ({StrUtils.}AnsiIndexText(ExtractFileExt(sr.Name), ['.avi', '.mpg', '.mpeg']) >= 0) then if ext then FileList.Append(ChangeFileExt(sr.Name, '')) // EDIT else FileList.Append(sr.Name); until FindNext(sr) <> 0; FindClose(sr); end; end; |
Re: Debugger-Exception bei Einsatz von Stringlist
Danke für die schnellen Antworten.
Ich habe die Verbesserungen vorgenommen,aber das Problem besteht weiterhin. dateiliste ist z.Z. in der Typendeklaration als public deklariert. Jedoch scheint es egal zu sein, wo ich sie deklariere (bei dieser variablen bin ich mir ohnehin nicht sicher wohin damit). |
Re: Debugger-Exception bei Einsatz von Stringlist
Ganz dumme Frage, hast Du auch die Variable die Du an FileList übergibst erstellt ?
|
Re: Debugger-Exception bei Einsatz von Stringlist
Ja, dateiliste ist erstellt. Der Compiler sagt wie gesagt auch nichts an, ich bekomme nur während der Laufzeit eine Debugger-Exception.
|
Re: Debugger-Exception bei Einsatz von Stringlist
Hallo,
ich habe den Code in Beitrag #3 etwas überarbeitet. Die erste Änderung verschafft uns Klarheit, ob die übergebene StringList instanziert wurde. Die zweite Änderung trägt den fehlenden zweiten Parameter von ChangeFileExt() nach, worauf mich Muetze1 aufmerksam gemacht hat - Mein Dank geht an Thomas. Freundliche Grüße |
Re: Debugger-Exception bei Einsatz von Stringlist
Hallo,
deklariert <> instanziiert. Deklaration
Delphi-Quellcode:
Instanziierung
var
dateiliste: TStringList; // (NICHT TStrings)
Delphi-Quellcode:
Heiko
dateiliste:= TStringList.Create;
PS: Irgendwo wird dateiliste.Free hoffentlich auch noch aufgerufen |
Re: Debugger-Exception bei Einsatz von Stringlist
Vielen, vielen Dank! Der letzte Beitrag war die Lösung. Ich war nämlich slbst so blöd, TStrings wie einen array zu behandeln und habe deswegen nichts instanziiert. Ich bedanke mich für die Hilfe!
Beste Grüße, grebaldi |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz