Thema: Delphi Suche effizienter machen

Einzelnen Beitrag anzeigen

guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#32

Re: Suche effizienter machen

  Alt 23. Sep 2008, 12:39
Hier ist meine Variante:

Delphi-Quellcode:
var SuchPos: Integer;
begin
  if OpenDialog.Execute then
  begin
    if Length(edSuchwort.Text) > 0 then
    begin
      RichEdit.Lines.LoadFromFile(OpenDialog.FileName);
      SuchPos := 0;
      repeat
        SuchPos := RichEdit.FindText(edSuchwort.Text,SuchPos,Length(RichEdit.Lines.Text),[stWholeWord]);
        if SuchPos > -1 then
        begin
          RichEdit.SelStart := SuchPos;
          RichEdit.SelLength := Length(edSuchwort.Text);
          RichEdit.SelAttributes.Color := clRed;
          SuchPos := SuchPos + Length(edSuchwort.Text);
        end;
      until SuchPos = -1;
    end;
  end;
end;
Ich habe keinen Vergleich, wie schnell sie ist, aber sie funktioniert, wenn auch nur mit einem Suchwort. Für weitere Wörter muss man halt erweitern. Ein paar Kleinigkeiten könnte man auch noch optimieren, z.B. SuchLaenge := Length(edSuchwort.Text); im Voraus zuweisen.

EDIT

Der Aufruf von Length scheint viel Zeit zu benötigen. Ich habe das jetzt noch einmal so probiert und der Geschwindigkeitsunterschied ist immens.

Delphi-Quellcode:
var SuchPos, SuchLaenge, RichEditLaenge: Integer;
    STime, ETime: Integer;
begin
  if OpenDialog.Execute then
  begin
    SuchLaenge := Length(edSuchwort.Text);
    if SuchLaenge > 0 then
    begin
      RichEdit.Lines.LoadFromFile(OpenDialog.FileName);
      RichEditLaenge := Length(RichEdit.Lines.Text);

      STime := GetTickCount();

      SuchPos := 0;
      repeat
        SuchPos := RichEdit.FindText(edSuchwort.Text,SuchPos,RichEditLaenge,[stWholeWord]);
        if SuchPos > -1 then
        begin
          RichEdit.SelStart := SuchPos;
          RichEdit.SelLength := SuchLaenge;
          RichEdit.SelAttributes.Color := clRed;
          SuchPos := SuchPos + SuchLaenge;
        end;
      until SuchPos = -1;

      ETime := GetTickCount();
      lbZeit.Caption := IntToStr(ETime - STime);
      lbZeit.Visible := True;

    end;
  end;
end;
  Mit Zitat antworten Zitat