der Aufruf von
Pos
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;