![]() |
Kann jemand bei dieser (eigenen)MaskMatch-Funktion helfen?
hi,
ich ware gerade dabei eine eigene MaskMatch funktion zu schreiben, bis her sieht sie so aus:
Delphi-Quellcode:
Sie funktioniert auch schon fast, z.b ergibt das:
function MaskMatch(S, Mask: string): Boolean;
var ML, SL, MI, SI: Integer; begin Result := False; if (S <> '') and (Mask <> '') then begin ML := Length(Mask); SL := Length(S); MI := 0; SI := 0; while (MI < ML) do begin Inc(MI); Inc(SI); while (MI < ML) and (Mask[MI] = '*') and (Mask[MI+1] = '*') do Inc(MI); if SI <= SL then begin case Mask[MI] of '*': begin if MI < ML then begin Inc(MI); while (SI <= SL) and (S[SI] <> Mask[MI]) do Inc(SI); if MI = ML then Result := (Mask[MI] = S[SI]) and (SI = SL) else Result := Mask[MI] = S[SI]; end else Result := True; end; '?': begin if MI = ML then Result := SI = SL; end; else begin if MI = ML then Result := (SI = SL) and (S[SI] = Mask[MI]) else Result := S[SI] = Mask[MI]; end; end; end else begin Result := (MI = ML) and (Mask[MI] = '*'); Break; end; if not Result then Break; end; end; end; Zitat:
aber das hier funktioniert nicht: Zitat:
Das liegt daran das nach "h" mit "k" verglichen wird... hat jemand ne Idee was ich da machen könnte? |
Re: Kann jemand bei dieser (eigenen)MaskMatch-Funktion helfe
hi,
schoene sache, das kann ich sicher auch mal gebrauchen... ich rate nur mal (sorry deshalb), an dieser stelle:
Delphi-Quellcode:
ein if MI <= ML ?
case Mask[MI] of
'*': begin if MI < ML then begin |
Re: Kann jemand bei dieser (eigenen)MaskMatch-Funktion helfe
Wenn ich mal fies sein darf :mrgreen:
Delphi-Quellcode:
...:cat:...
uses
Masks; ... var Mask: TMask; begin Mask := TMask.Create('*kk*'); try if Mask.Matches('khkk') then ShowMessage('Geht doch :)'); finally Mask.Free; end; end; P.S. Resourcenschutz vergessen :shock: |
Re: Kann jemand bei dieser (eigenen)MaskMatch-Funktion helfe
@sakura: uff :shock: :-D
|
Re: Kann jemand bei dieser (eigenen)MaskMatch-Funktion helfe
Moin Grumble,
nope daran liegt es nicht, ganz im Gegenteil, dadurch würden Fehler entstehen :] Wie du siehst wird nach MI < ML, MI inkrementiert, würde das passieren wenn MI(der Index) bereits ML(Die Länge von "Mask") ist, würde Mask[MI] einen Fehler verursachen, da es ausserhalb der Länge liegt. Ich benutze aber nun die Funktion "PathMatchSpec" aus der API(Danke Mathias ;)). Da du so eine Funktion ja auch suchst, kannst du die ja auch verwenden ;) So sieht sie aus:
Delphi-Quellcode:
function PathMatchSpec(pszFile, pszSpec: PAnsiChar): BOOL; stdcall; external 'shlwapi.dll' name 'PathMatchSpecA';
MfG Die DP, sagt mir das eine neue Nachricht während des Schreibens einging *g*. @Sakura: Ich habe die Funktion MatchesMask() extra nicht benutzt, da Sie buggy(?) ist. Versuch dein Beispiel mal mit:
Delphi-Quellcode:
Dann wird die Funktion True zurückgeben... Das ist aber Falsch (ausser es wurde extra so gemacht).
Mask := TMask.Create('?k?');
try if Mask.Matches('k') then Normalerweise sollte ein '?' immer durch ein anderes Zeichen repräsentiert werden und dies sollte nicht optional sondern pflicht sein. (Siehe PathMatchSpec, dort ist es so wie ich es brauche). |
Re: Kann jemand bei dieser (eigenen)MaskMatch-Funktion helfe
klasse, danke :)
|
Re: Kann jemand bei dieser (eigenen)MaskMatch-Funktion helfe
Ich würde sonst zu den Regular Expressions raten...
Kann aus Erfahrung nur sagen, dass die echt gut sind :) |
Re: Kann jemand bei dieser (eigenen)MaskMatch-Funktion helfe
Zitat:
Zitat:
...:cat:... |
Re: Kann jemand bei dieser (eigenen)MaskMatch-Funktion helfe
Hallo sakura,
du hast recht, es funktioniert dort auch. Komischerweise geht das nur mit dem kompletten Konstrukt. Wenn du nur MatchesMask() benutzt, zeigt sie auch True wenn man als Maske '??' eingibt und als Pfad 'A'. War das denn so geplant? |
Re: Kann jemand bei dieser (eigenen)MaskMatch-Funktion helfe
Ich würde auch für sakuras Vorschlag plädieren. ;)
Masks.pas gehört zu den "brauchbaren" Borland Units, da sie nicht Classes.pas (*würg*), oder andere Units mit 5 mio. Bezeichnern mitschleppt. :) (SysUtils bekommt man überall schon fast zwangsläufig aufgedrückt, ist also kein Nachteil von Masks ;) ) Wenn es nur die eine Macke ist, dann behandle doch diese eine Macke in deinem Wrapper extra. ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:40 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