// Wer die Unit "Masks" besitzt (nicht in allen Versionen enthalten), kann mit
// der Funktion "MatchesMask" Strings unter Verwendung von Wildcards vergleichen.
// Allerdings kommt es dort auch unter Umständen zu Falschinterpretationen.
// Da ich nicht über die Unit verfüge, hier der folgende Code, welcher die zwei
// bekanntesten Wildcards verwendet.

// Getestet mit D4 unter XP und mit D2010 unter W7
 

//    Wildcard    Bedeutung 
//       ?        ein Zeichen 
//       *        kein oder beliebig viele Zeichen 
// Zum besseren Verständnis ein paar Vergleichsbeispiele:
 
{ 
   Pattern   Txt      Result 
   Te??      Test     True 
   *Te*st**  Test     True 
   t*t       Test     True 
   ????      Test     True 
   ?????     Test     False 
   Test?     Test     False 
   *         Test     True 
} 
 
function Cmp(const pattern, txt: string): Boolean; 
type 
  arr = array of PChar; 
var 
  zur: array of arr; 
  cn, cw: char; 
  x: integer; 
  pp: PChar; 
  pt: PChar; 
  procedure forall; 
  begin 
    dec(x); 
    while (x > -1) and (zur[x, 1]^ = #0) do dec(x); 
    if x < 0 then begin 
      result := False; 
      exit; 
    end; 
    pp := zur[x, 0]; 
    Inc(pp); 
    Inc(zur[x, 1]); 
    pt := zur[x, 1]; 
    Inc(x); 
  end; 
begin 
  x := 0; 
  pp := @pattern[1]; 
  pt := @txt[1]; 
  while (pp^ > #0) or (pt^ > #0) do begin 
    case pp^ of 
      '*': 
        begin 
          setlength(zur, succ(x), 2); 
          zur[x, 0] := pp; 
          zur[x, 1] := pt; 
          Inc(x); 
          Inc(pp); 
          continue; 
        end; 
      '?': 
        begin 
          if pt^ = #0 then 
          begin 
            if x > 0 then begin 
              forall; 
              continue; 
            end; 
            result := False; 
            exit; 
          end; 
        end; 
    else 
      begin 
        cn := pt^; 
        cw := pp^; 
        if cn <> cw then 
        begin 
          if x > 0 
            then begin 
            forall; 
            continue; 
          end; 
          result := False; 
          exit; 
        end; 
      end; 
    end; 
    if pt^ > #0 then Inc(pt); 
    if pp^ > #0 then Inc(pp); 
  end; 
  result := true; 
end; 
 
function cmpwc(const pattern, txt: string): Boolean; 
begin 
  result := Cmp(ansilowercase( 
    stringreplace(pattern, #32, '*', [rfreplaceall])), ansilowercase( 
    stringreplace(txt, #32, '*', [rfreplaceall]))); 
end;

 
// Beispielaufruf 
procedure TForm1.Button7Click(Sender: TObject); 
begin 
  if CmpWC('*RAU?EN?*', 'Schraubenfabrik') 
    then showmessage('passt') else showmessage('passt nicht'); 
end;



Zugriffe seit 6.9.2001 auf Delphi-Ecke