Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Debugger-Exception bei Einsatz von Stringlist (https://www.delphipraxis.net/108323-debugger-exception-bei-einsatz-von-stringlist.html)

grebaldi 11. Feb 2008 17:14


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:
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;
Diese werden dann folgendermaßen aufgerufen (dateiliste:TStrings):
Delphi-Quellcode:
 ListDir('c:\irgendwas',Listbox1.Items,true);
ListDir('c:\irgendwas',dateiliste,false);
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.

Habt ihr 'ne Idee, wie ich das ganze effizienter machen kann, bzw.überhaupt erstmal zum Funktionieren bringen könnte?

Muetze1 11. Feb 2008 18:02

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 Delphi-Referenz durchsuchenExtractFileExt() und vergleiche diese.
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 Delphi-Referenz durchsuchenChangeFileExt().

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.

marabu 11. Feb 2008 18:07

Re: Debugger-Exception bei Einsatz von Stringlist
 
Herzlich willkommen in der Delphi-PRAXiS, grebaldi.

SR solltest du nur auslesen:

Delphi-Quellcode:
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;
Freundliche Grüße

grebaldi 11. Feb 2008 19:06

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

RWarnecke 11. Feb 2008 19:07

Re: Debugger-Exception bei Einsatz von Stringlist
 
Ganz dumme Frage, hast Du auch die Variable die Du an FileList übergibst erstellt ?

grebaldi 11. Feb 2008 19:14

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.

marabu 11. Feb 2008 20:27

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

hoika 11. Feb 2008 20:35

Re: Debugger-Exception bei Einsatz von Stringlist
 
Hallo,

deklariert <> instanziiert.

Deklaration

Delphi-Quellcode:
var
  dateiliste: TStringList; // (NICHT TStrings)
Instanziierung

Delphi-Quellcode:
dateiliste:= TStringList.Create;
Heiko
PS:
Irgendwo wird dateiliste.Free hoffentlich
auch noch aufgerufen

grebaldi 11. Feb 2008 21:27

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 01:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz