Teilstrings aus String herausfiltern.
Hi DPler :hi:
Ich möchte in meiner Suchfunktion nach Einträgen in einer Listbox suchen. Das soll nat. auch funktionieren wenn in der LSB "Hallo_Welt" steht und ich in der Suchmaske "hallo Welt" schreibe. dafür muss ich ja die einzelnen Teilstrings "Hallo" und "Welt" aus dem Suchfeld rausfiltern und schauen ob das Ganze in der LSb ist (da er ja bei einem reinen vergleich beider Strings ein FALSE ausgeben würde, da "hallo Welt" <> "hallo_Welt"). Mein Problem ist dabei das Herausfiltern der Teilstrings. Ich nutze diesen Code:
Delphi-Quellcode:
Logischerweise findet er aber dabei nicht den letzten Teilstringwenn schon ein Leerzeichen vorkommt, er findet diesen erst wenn nach dem letzten Teilstring ein Leerzeichen kommt. Ich weiß nat. woran das Problem liegt (an der UNTIL-Bedingung), aber mir fällt einfach keine Möglichkeit ein das zu lösen...
var Suchtext : String;
u : integer; Suchtext := edSuchen.Text; u := 0; repeat begin Length(Teilstrings,u+1); if Pos(' ',Suchtext) > 0 then Teilstrings[u] := AnsiLeftStr(Suchtext,Pos(' ',Suchtext)-1) else Teilstrings[u] := Suchtext; Suchtext := AnsiRightStr(Suchtext,Length(Suchtext) - Pos(' ',Suchtext)); u := u + 1; end until Pos(' ',Suchtext) = 0; |
Re: Teilstrings aus String herausfiltern.
Du must erst die einzelnen Gesuchten Wörter erkennen und in eine Liste ablegen.
Dann erst das eine und dann das andere suchen. Es sei denn du meintest 'Hallo*Welt' oder 'Hallo?Welt' Für sowas eignest sich Masks.MatchesMask(const Filename, Mask: string): Boolean; ...auch wenn da dateiname steht... wenn du es ganz komfortabel haben willst dann empfehle ich dir eine UNIT zu suchen die Reguläre Ausdrücke unterstützt. |
Re: Teilstrings aus String herausfiltern.
Sry, aber was hat das mit meiner Frage zu tun? Wie ich das vergleiche ist klar, mir geht es um das herausfiltern der Strings. Damit hab ich ja das Problem mit meinem Code. Deine Antwort wäre wenn ich gar keine Ahnung hätte wie ich das Ganze insgesamt angehen müsste, und das weiß ich ja, es geht mir eben darum die einzelnen Teilstrings rauszufiltern ;)
|
Re: Teilstrings aus String herausfiltern.
Dafür sind die regulären Ausdrücke doch wunderbar geeignet.
|
Re: Teilstrings aus String herausfiltern.
Hi,
Delphi-Quellcode:
Hiermit suche ich die einzelnen SubStrings in einem Editfeld und übergebe das ganze an ein dynamische Array. Man kann natürlich auch eine Stringliste benutzen. In Delimeter musst du halt dann dein '_' angeben.
type
TsArray = Array of String; function GetSubStrings(AString: String; Delimiter: Char) : TsArray; var i: Integer; begin SetLength(result, 0); i := 0; while (Pos(Delimiter, aString) <> 0) do begin SetLength(Result, i+1); Result[i] := Copy(aString, 0, Pos(Delimiter, aString) - 1); Delete(aString, 1, Pos(Delimiter, aString)); inc(i); end; if (Length(aString) <> 0) then begin SetLength(Result, i+1); Result[i] := aString; end; end; MFG Lorenz |
Re: Teilstrings aus String herausfiltern.
Das seiht doch nicht schlecht aus.
Ich habe mich auch mal nach den reg. Ausdrücken erkundigt und werde es auch mal damit versuchen. Scheint aber recht kompliziert zu sein... |
Re: Teilstrings aus String herausfiltern.
Mach das! Regexen ist DAS Mittel zur Suche bzw. Filterung.
|
Re: Teilstrings aus String herausfiltern.
Ich bin da bis jetzt auf Das TPerlRegEx gestoßen. Gibts dafür deutsche tuts?
@Reinhardtinho: Ich hab das mal schnell gemacht aber es funktioniert so nicht. Die "Liste" enthält nur 1 Element...
Delphi-Quellcode:
procedure TForm1.Edit1Change(Sender: TObject);
var Liste : tsarray; i, u : integer; boola : bool; begin Listbox2.Clear; for i := 0 to 3 do begin Boola := TRUE; Liste := GetSubstrings(Listbox1.Items.Strings[i],Char(' ')); Label1.Caption := InttoStr(High(liste)); for u := 0 to high(Liste) do if not ansicontainstext(Listbox1.Items.Strings[i],Liste[u]) then Boola := FALSE; if Boola then Listbox2.Items.Add(Listbox1.Items.Strings[i]) end; end; |
Re: Teilstrings aus String herausfiltern.
Stehen in der ListBox1 die Wörter die gesucht werden sollen? Gib mal bitte ein Beispiel.
|
Re: Teilstrings aus String herausfiltern.
In der Listbox1 steht:
Hallo Welt Hallo_Welt Hallo Welt Komischerweise wird, sobald ich etwas in das Edit-feld reinschreibe, alles in der Listbox2 übernommen :gruebel: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:02 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