Einzelnen Beitrag anzeigen

jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

AW: VST - schnelle Suche über 42000 Datensätze

  Alt 17. Sep 2010, 13:24
Pos dürfte hier weniger das Problem sein. Gravierender ist, dass hinter "edt_search.Text" ein WM_GETTEXT-SendMessage Aufruf an das Edit-Control steckt. Das dauert schon mal lange. Diesen kann man durch einmaliges auslesen und zwischenspeichern vor dem IterateSubtree() Aufruf in den Griff bekommen.
Was aber auch recht lange dauert, sind die beiden LowerCase-Aufrufe. Mit dem zwischengespeicherten edt_search.Text kann man schon mal einen loswerden, indem man bei der Zwischenspeicherung bereits LowerCase ausführt. Um den zweiten LowerCase loszuwerden, müsste man von Pos zu einer Case-Insensitiven Pos-Funktion wechseln (die aber nicht selbst wieder das LowerCase macht, wie so viele Pos-Nachahmungen).

Delphi-Quellcode:
type
  Tfrm_main = class(...)
  private
    FEditText: string;
  end;

procedure Tfrm_main.edt_searchChange(Sender: TObject);
begin
  FEditText := LowerCase(edt_search.Text);
  vst_daten.IterateSubtree(nil, SearchDataCallback, nil);
end;

procedure Tfrm_main.SearchDataCallback(Sender: TBaseVirtualTree; Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
var
 Daten : TOData;
begin
 Daten := TOData(vst_daten.GetNodeData(Node)^);
 vst_daten.IsVisible[node] := (FEditText = '') or (pos(FEditText, LowerCase(Daten.suchfeld)) > 0);
end;
  Mit Zitat antworten Zitat