Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Teilstring suchen (https://www.delphipraxis.net/112263-teilstring-suchen.html)

DeddyH 17. Apr 2008 20:09

Re: Teilstring suchen
 
So, vielleicht warten mir erstmal ab, was der T.E. dazu sagt :mrgreen:

Die Muhkuh 17. Apr 2008 20:11

Re: Teilstring suchen
 
Gerade jetzt, wo es lustig ist. :cry:

:tongue:

DeddyH 17. Apr 2008 20:47

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;

Hugo Hasi 18. Apr 2008 17:59

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:

DeddyH 18. Apr 2008 18:11

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;

Hugo Hasi 18. Apr 2008 18:18

Re: Teilstring suchen
 
der meckert immer rum, dass TdynIntArr ein undefinierter Bezeichner ist...

DeddyH 18. Apr 2008 18:25

Re: Teilstring suchen
 
Hast Du den Code aus #13 denn auch komplett kopiert und bei Dir eingefügt (am Besten direkt unter "implementation")?

dominikkv 18. Apr 2008 18:28

Re: Teilstring suchen
 
Ok, dann will ich hier mal meine Lösung Vorstellen xD

Delphi-Quellcode:
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;
Diese Methode hat den Vorteil das sie erstens schnell ist, zweitens kannst du auch nach nach mehreren Wörtern suchen.
Beispiel: Du suchst "Friedrich Schiller"
Der Suchalgorythmus (schreibt man das so!?) würde auch "Friedrich von Schiller" oder "Schiller, Friedrich" finden.

Hugo Hasi 18. Apr 2008 18:31

Re: Teilstring suchen
 
jetzt ja :oops: aber wo genau schreib ich denn das mit dem SearchSubString hin?

DeddyH 18. Apr 2008 18:34

Re: Teilstring suchen
 
Was meinst Du jetzt?


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:07 Uhr.
Seite 2 von 4     12 34      

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