Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Kann jemand bei dieser (eigenen)MaskMatch-Funktion helfen? (https://www.delphipraxis.net/45653-kann-jemand-bei-dieser-eigenen-maskmatch-funktion-helfen.html)

Pseudemys Nelsoni 10. Mai 2005 04:28


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:
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;
Sie funktioniert auch schon fast, z.b ergibt das:

Zitat:

if MaskMatch('blubbk12345', '?????k*') then
true usw....

aber das hier funktioniert nicht:

Zitat:

if MaskMatch('khkk', '*kk*') then
Das ergibt False obwohl es True sein müsste...

Das liegt daran das nach "h" mit "k" verglichen wird... hat jemand ne Idee was ich da machen könnte?

Grumble 10. Mai 2005 07:58

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:
case Mask[MI] of
          '*': begin
                 if MI < ML then
                 begin
ein if MI <= ML ?

sakura 10. Mai 2005 08:01

Re: Kann jemand bei dieser (eigenen)MaskMatch-Funktion helfe
 
Wenn ich mal fies sein darf :mrgreen:
Delphi-Quellcode:
uses
  Masks;

...

var
  Mask: TMask;
begin
  Mask := TMask.Create('*kk*');
  try
    if Mask.Matches('khkk') then
      ShowMessage('Geht doch :)');
  finally
    Mask.Free;
  end;
end;
...:cat:...

P.S. Resourcenschutz vergessen :shock:

Grumble 10. Mai 2005 08:04

Re: Kann jemand bei dieser (eigenen)MaskMatch-Funktion helfe
 
@sakura: uff :shock: :-D

Pseudemys Nelsoni 10. Mai 2005 08:11

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:
  Mask := TMask.Create('?k?');
  try
    if Mask.Matches('k') then
Dann wird die Funktion True zurückgeben... Das ist aber Falsch (ausser es wurde extra so gemacht).

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

Grumble 10. Mai 2005 08:16

Re: Kann jemand bei dieser (eigenen)MaskMatch-Funktion helfe
 
klasse, danke :)

SubData 10. Mai 2005 08:50

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

sakura 10. Mai 2005 08:55

Re: Kann jemand bei dieser (eigenen)MaskMatch-Funktion helfe
 
Zitat:

Zitat von Pseudemys Nelsoni
Ich habe die Funktion MatchesMask() extra nicht benutzt, da Sie buggy(?) ist.

Ja :gruebel: Ich nutze die seit Jahren...

Zitat:

Zitat von Pseudemys Nelsoni
Delphi-Quellcode:
  Mask := TMask.Create('?k?');
  try
    if Mask.Matches('k') then
Dann wird die Funktion True zurückgeben... Das ist aber Falsch (ausser es wurde extra so gemacht).

Delphi 7 hat den Fehler nicht, Delphi 5 und 2005 auch nicht. Ich habe es gerade extra für Dich getestet.

...:cat:...

Pseudemys Nelsoni 10. Mai 2005 09:36

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?

Robert_G 10. Mai 2005 09:51

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 10:57 Uhr.
Seite 1 von 2  1 2      

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