![]() |
Problem mit Suche
Hallo erstmal,
Habe ein Problem mit einer Suche. Ich gebe ein Suchwort ein, lasse dateien durchsuchen nach dem wort und wenn gefunden gibt er die Zeile in der Datei aus. Allerdings soll die suche mit Wildcard funktionieren. Das heißt man muss z.B nur "Hal" eingeben und trotzdem wird das Wort "Hallo" gefunden. Ich habe eine Funktion dazu, die wie folgt aussieht:
Delphi-Quellcode:
function MatchStr(Source,Pattern:String;CaseSensitive:Boolean):Boolean;
function Match(Source,Pattern:PChar):Boolean; begin if StrComp(Pattern,'*')=0 then Result:=true else if (Source^=Chr(0)) and (Pattern^<>Chr(0)) then Result:=false else if Source^=Chr(0) then Result:=true else case Pattern^ of '*': if Match(Source,@Pattern[1]) then Result:=true else Result:=Match(@Source[1],Pattern); '?': Result:=Match(@Source[1],@Pattern[1]); else if Source^=Pattern^ then Result:=Match(@Source[1],@Pattern[1]) else Result:=false; end; end; begin if not(CaseSensitive) then begin Source :=AnsiLowerCase(Source); Pattern:=AnsiLowerCase(Pattern); end; Result:=Match(PChar(Source),PChar(Pattern)) end; ausgerufen so:
Delphi-Quellcode:
zw = ist die Zeile die ausgelesen wurde.
for i := 0 to LBZWDateipfad.Count - 1 do
Begin zw:=GetXLine(Path + '\Kunden\' + LBZWDateipfad.Items.Strings[i], 3); // nicht beachten ist nur die funktion zum Zeilen auslesen IF MatchStr(zw , suche + '*' ,false)= true then Begin // speicher ergebnisse end; end; suche = das Suchwort. Nun zum eigentlichen Problem: Er findet einfach alles wenn ich zb: "E" eingebe findet er alles auch wörter ohne "E". Er findet nur dann nix wenn der Buchstabe überhaupt nicht vorkommt in der Zeile der Textdatei. Was mache ich falsch? |
Re: Problem mit Suche
bitte um hilfe :(
|
Re: Problem mit Suche
Hallo,
pushen erst nach 24h. Hast Du schon einmal die Suche bemüht. Die Stichworte sind in Deiner Anfrage alle enthalten. -> ![]() Grüße Klaus |
Re: Problem mit Suche
Hallo,
deinen Code habe ich mir erstmal anders hingeschrieben:
Delphi-Quellcode:
Bei langen Strings ist die Rekursion keine ökonomische Lösung.
function MatchStr(Source, Pattern: string; CaseSensitive: Boolean = True): Boolean;
function Match(Source, Pattern: PChar): Boolean; begin if StrComp(Pattern, '*') = 0 then Result := true else if (Source^ = Chr(0)) and (Pattern^ <> Chr(0)) then Result := false else if Source^ = Chr(0) then {Result := true} Exit else case Pattern^ of '*': Result := Match(Source, @Pattern[1]) or Match(@Source[1], Pattern); '?': Result := Match(@Source[1], @Pattern[1]); else Result := (Source^ = Pattern^) and Match(@Source[1], @Pattern[1]); end; end; begin if not CaseSensitive then begin Source := AnsiLowerCase(Source); Pattern := AnsiLowerCase(Pattern); end; Result := Match(PChar(Source), PChar(Pattern)) end; Ich habe dir zusätzlich eine kleine Änderung eingebaut: Wenn du am Ende des Source-Strings angekommen bist, darfst du das Ergebnis nicht unbedingt auf FALSE setzen. Grüße vom marabu |
DP-Maintenance
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Delphi-Frage |
DP-Maintenance
Dieses Thema wurde von "Sharky" von "Sonstige Fragen zu Delphi" nach "Object-Pascal / Delphi-Language" verschoben.
Ist ja eine Delphi-Frage |
Re: Problem mit Suche
danke das war es.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:46 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