Einzelnen Beitrag anzeigen

Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Dateinamen mit einem File Filter vergleichen

  Alt 8. Apr 2011, 12:08
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.

Geändert von Codehunter ( 8. Apr 2011 um 12:11 Uhr)
  Mit Zitat antworten Zitat