![]() |
Re: Teilstring suchen
So, vielleicht warten mir erstmal ab, was der T.E. dazu sagt :mrgreen:
|
Re: Teilstring suchen
Gerade jetzt, wo es lustig ist. :cry:
:tongue: |
Re: Teilstring suchen
Na gut, einen hab ich noch:
Delphi-Quellcode:
type TDynIntArr = array of integer;
TMySearchOption = (soIgnoreCase, //Groß-/Kleinschreibung ignorieren soSomewhere, //Suchstring kann irgendwo enthalten sein soIsBeginning); //Suchstring steht am Anfang, weitere Zeichen können folgen TMySearchOptions = set of TMySearchOption; procedure SearchSubString(const s, //gesuchter String Sep: string; //Trennstring const sList: TStrings; //Liste var ResultArr: TDynIntArr; //dynamisches Array nimmt Trefferpositionen auf const Options: TMySearchOptions); var i: integer; found: Boolean; sSearch: string; begin SetLength(ResultArr,0); i := 0; while (i < sList.Count) do begin sSearch := Copy(sList[i],1,Pos(Sep,sList[i]) - 1); if soIgnoreCase in Options then begin if soSomewhere in Options then found := Pos(AnsiLowerCase(s),AnsiLowerCase(sSearch)) > 0 else if soIsBeginning in Options then found := Pos(AnsiLowerCase(s),AnsiLowerCase(sSearch)) = 1 else found := AnsiSameText(s,sSearch); end else if soSomewhere in Options then found := Pos(s,sSearch) > 0 else if soIsBeginning in Options then found := Pos(s,sSearch) = 1 else found := AnsiCompareStr(s,sSearch) = 0; if found then begin SetLength(ResultArr,Length(ResultArr) + 1); ResultArr[High(ResultArr)] := i; end; inc(i); end; end; |
Re: Teilstring suchen
:shock:
verdammt man kommt sich ja manchmal echt dämlich vor :duck: . Aber ein fettes Dank an euch... hab es sogar wirklich hinbekommen. Ihr habt da zwischendurch mal was wirklich interessantes angesprochen... das mit den mehreren Autoren. Um jetzt aber die Suche weiterlaufen zu lassen, müsste ich doch theoretisch eine ganz neuen Button mit einer ganz neuen Funktion erstellen, oder? Kann ich das denn so machen, dass ich den Index(weil wenn er was gefunden hat, wird es ja markiert) einfach um einen erhöhe und er dann wieder die "normale" Suchfunktion durchführt? Sehr wahrscheinlich kommt jetzt wieder"Weißt du überhaupt was du da machst?" :tongue: |
Re: Teilstring suchen
Wenn Du die Funktion aus meinem letzten Posting nimmst (die ist noch nicht optimal, funktioniert aber), könntest Du das z.B. so machen:
Delphi-Quellcode:
procedure TForm5.Button1Click(Sender: TObject);
var Results: TDynIntArr; i: integer; begin ListBox1.ClearSelection; SearchSubString(Edit1.Text,'#',ListBox1.Items,Results,[]); for i := 0 to High(Results) do ListBox1.Selected[Results[i]] := true; SetLength(Results,0); end; |
Re: Teilstring suchen
der meckert immer rum, dass TdynIntArr ein undefinierter Bezeichner ist...
|
Re: Teilstring suchen
Hast Du den Code aus #13 denn auch komplett kopiert und bei Dir eingefügt (am Besten direkt unter "implementation")?
|
Re: Teilstring suchen
Ok, dann will ich hier mal meine Lösung Vorstellen xD
Delphi-Quellcode:
Diese Methode hat den Vorteil das sie erstens schnell ist, zweitens kannst du auch nach nach mehreren Wörtern suchen.
const
Delimiters = [#1..#47, #58..#64, #91..#96, #123..#191, #215, #216, #247, #248]; Delimiters_0 = [#0] + Delimiters; procedure GetWords(s: string; woerter: TStrings); var p, r: pchar; Token: string; begin woerter.Clear; p := pchar(s); repeat r := p; while not (p^ in Delimiters_0) do inc(p); SetString(Token, r, p - r); if Token <> '' then woerter.Add(Token); while p^ in Delimiters do inc(p); until p^ = #0; end; function Such(Txt, Pattern: string): boolean; var slP: TStringlist; x: integer; pt: PChar; p: array of PChar; i: array of integer; b: array of boolean; begin if (Txt = '') or (Pattern = '') then begin result := false; exit; end; Txt := ansiuppercase(Txt); Pattern := ansiuppercase(Pattern); slP := TStringlist.Create; GetWords(Pattern, slP); setlength(p, slP.count); setlength(i, slP.count); setlength(b, slP.count); for x := 0 to slP.count - 1 do begin p[x] := @slP[x][1]; i[x] := length(slP[x]); b[x] := false; end; pt := @Txt[1]; while pt^ <> #0 do begin for x := 0 to high(p) do if comparemem(pt, p[x], i[x]) then b[x] := true; inc(pt); result := true; for x := 0 to high(b) do result := result and b[x]; if result then break; end; b := nil; i := nil; p := nil; slP.free; end; procedure TForm1.SuchenButtonClick(Sender: Tobject); var I: Integer; Ergebnis: Array of Integer; AutorenListe: TStringList; begin SetLength(Ergebnis, 0); AutorenListe := TStringList.Create; if Listenfenster.Items.Count > 0 do for I := 0 to Pred(Listenfenster.Items.Count) do if Such(Listenfenster.Items[i], Autorfeld.Text) then begin SetLength(Ergebis, Succ(Length(Ergebnis))); Ergebnis[high(Ergebnis)] := I; AutorenListe.Add(Listenfenster.Items[i]); end; if length(Ergebnis) > 0 then // gefunden? // if AutorenListe.Count > 0 then // alternativ begin // jetzt steht in Ergebnis der Index zu den Einträgen in Listenfenster // zB den ersten Index kannst du mit Ergebnis[0] abrufen // oder du nimmst die AutorenListe: showmessage(AutorenListe[0]); end; AutorenListe.Free; end; Beispiel: Du suchst "Friedrich Schiller" Der Suchalgorythmus (schreibt man das so!?) würde auch "Friedrich von Schiller" oder "Schiller, Friedrich" finden. |
Re: Teilstring suchen
jetzt ja :oops: aber wo genau schreib ich denn das mit dem SearchSubString hin?
|
Re: Teilstring suchen
Was meinst Du jetzt?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:12 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