Thema: Delphi Teilstring suchen

Einzelnen Beitrag anzeigen

dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#18

Re: Teilstring suchen

  Alt 18. Apr 2008, 19:28
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.
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat