Jepp, vollkommen korrekt Gollum
Hab mich nämlich auch gewundert dass mir der Code um die Ohren geflogen ist... Daneben habe ich noch ein paar Failsafes eingebaut für den Fall das lange Dateipfade als Filename übergeben werden (Da scheint MatchesMask allergisch zu sein) und auch für den Fall, dass der Filterstring nicht ganz sauber formuliert ist.
So schauts jetzt aus:
Delphi-Quellcode:
function dwMatchesFilter(const AFilename, AFilter: String): Boolean;
var
I: Integer;
SL: TStringList;
S, FN: String;
begin
result:= FALSE;
FN:= ExtractFileName(AFilename);
SL:= TStringList.Create;
try
SL.Text:= StringReplace(Trim(AFilter), '|', #13#10, [rfReplaceAll]);
for I:= 0 to SL.Count - 1 do begin
if I mod 2 <> 0 then begin
S:= S + SL[I] + ';';
end;
end;
while Pos(';;', S) > 0 do S:= StringReplace(S, ';;', ';', [rfReplaceAll]);
SL.Text:= StringReplace(S, ';', #13#10, [rfReplaceAll]);
for I:= 0 to SL.Count - 1 do begin
S:= SL[I];
if MatchesMask(FN, S) then begin
result:= TRUE;
Break;
end;
end;
finally
SL.Free;
end;
end;
Allerdings passt die praktische Erfahrung hier nicht mit der Delphi-Hilfe zusammen, die bei "Exit" folgendes sagt:
Code:
Exit beschränkt sich nicht auf einen Block, sondern beendet die gesamte Prozedur. Exit beeinflusst die Ablaufsteuerung von try..finally-Blöcken nicht. Wenn Sie Exit in einem try..finally-Konstrukt aufrufen, wird die Ausführung in der finally-Klausel fortgesetzt.
Denn wie man hier sehen kann wird SL.Free im finally nicht aufgerufen obwohl es laut Hilfe so sein sollte.