AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Kann jemand bei dieser (eigenen)MaskMatch-Funktion helfen?
Thema durchsuchen
Ansicht
Themen-Optionen

Kann jemand bei dieser (eigenen)MaskMatch-Funktion helfen?

Ein Thema von Pseudemys Nelsoni · begonnen am 10. Mai 2005 · letzter Beitrag vom 10. Mai 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#1

Kann jemand bei dieser (eigenen)MaskMatch-Funktion helfen?

  Alt 10. Mai 2005, 04:28
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?
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Benutzerbild von Grumble
Grumble

Registriert seit: 19. Mär 2003
Ort: Dresden
203 Beiträge
 
Delphi 6 Enterprise
 
#2

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

  Alt 10. Mai 2005, 07:58
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 ?
gruss
Grumble

... moege der code mit dir sein ...
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#3

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

  Alt 10. Mai 2005, 08:01
Wenn ich mal fies sein darf
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;
......

P.S. Resourcenschutz vergessen
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Grumble
Grumble

Registriert seit: 19. Mär 2003
Ort: Dresden
203 Beiträge
 
Delphi 6 Enterprise
 
#4

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

  Alt 10. Mai 2005, 08:04
@sakura: uff
gruss
Grumble

... moege der code mit dir sein ...
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#5

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

  Alt 10. Mai 2005, 08:11
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:

function PathMatchSpec(pszFile, pszSpec: PAnsiChar): BOOL; stdcall; external 'shlwapi.dllname '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).
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Benutzerbild von Grumble
Grumble

Registriert seit: 19. Mär 2003
Ort: Dresden
203 Beiträge
 
Delphi 6 Enterprise
 
#6

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

  Alt 10. Mai 2005, 08:16
klasse, danke
gruss
Grumble

... moege der code mit dir sein ...
  Mit Zitat antworten Zitat
Benutzerbild von SubData
SubData

Registriert seit: 14. Sep 2004
Ort: Stuhr
1.078 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 10. Mai 2005, 08:50
Ich würde sonst zu den Regular Expressions raten...

Kann aus Erfahrung nur sagen, dass die echt gut sind
Ronny
/(bb|[^b]{2})/
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#8

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

  Alt 10. Mai 2005, 08:55
Zitat von Pseudemys Nelsoni:
Ich habe die Funktion MatchesMask() extra nicht benutzt, da Sie buggy(?) ist.
Ja Ich nutze die seit Jahren...

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.

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#9

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

  Alt 10. Mai 2005, 09:36
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?
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#10

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

  Alt 10. Mai 2005, 09:51
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:56 Uhr.
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