使い方を学んTVirtualStringTree
でいて、インクリメンタル検索を実装する必要があります。ユーザーが文字を入力するTEdit
と、フォーカスされたノードをツリー内の最初の条件を満たすノードに移動したいと考えています。
私は見つけることができるすべてのデモとサンプルコードを読んでいますが、これの出発点を見つけることができないようです. 誰でも擬似コードまたはそれ以上のコードを使用できますか?
使い方を学んTVirtualStringTree
でいて、インクリメンタル検索を実装する必要があります。ユーザーが文字を入力するTEdit
と、フォーカスされたノードをツリー内の最初の条件を満たすノードに移動したいと考えています。
私は見つけることができるすべてのデモとサンプルコードを読んでいますが、これの出発点を見つけることができないようです. 誰でも擬似コードまたはそれ以上のコードを使用できますか?
コントロールは、インクリメンタル検索を既にサポートしています。編集コントロールを追加する必要はありません。ツリー コントロールに入力を開始するだけで、次に一致するノードが選択されます。、、、およびプロパティを必要に応じてIncrementalSearch
設定します。IncrementalSearchDirection
IncrementalSearchStart
IncrementalSearchTimeout
特定の基準に一致する最初のノードを選択するには、 を使用しますIterateSubtree
。の署名に一致するメソッドを記述TVTGetNodeProc
して、検索基準に対して単一のノードをチェックします。ツリー内の各ノードに対して呼び出され、ノードが一致する場合は、Abort
パラメーターを true に設定する必要があります。IterateSubtree
(named )の 3 番目のパラメーターを使用してData
、検索用語を他の検索条件と共にコールバック関数に伝達します。
不要なコードの一部を削除しましたが、次のとおりです。
unit fMyForm;
interface
uses
Windows, Messages, Forms, StdCtrls, VirtualTrees, StrUtils;
type
TfrmMyForm = class(TForm)
vstMyTree: TVirtualstringTree;
myEdit: TEdit;
procedure myEditChange(Sender: TObject);
private
procedure SearchForText(Sender: TBaseVirtualTree; Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
end;
PDatastructure = ^TDatastructure;
TDatastructure = record
YourFieldHere : Widestring;
end;
implementation
{$R *.dfm}
procedure TfrmMyForm.SearchForText(Sender: TBaseVirtualTree; Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
var
NodeData: PDatastructure; //replace by your record structure
begin
NodeData := Sender.GetNodeData(Node);
Abort := AnsiStartsStr(string(data), NodeData.YourFieldHere); //abort the search if a node with the text is found.
end;
procedure TfrmMyForm.myEditChange(Sender: TObject);
var
foundNode : PVirtualNode;
begin
inherited;
//first param is your starting point. nil starts at top of tree. if you want to implement findnext
//functionality you will need to supply the previous found node to continue from that point.
//be sure to set the IncrementalSearchTimeout to allow users to type a few characters before starting a search.
foundNode := vstMyTree.IterateSubtree(nil, SearchForText, pointer(myEdit.text));
if Assigned (foundNode) then
begin
vstMyTree.FocusedNode := foundNode;
vstMyTree.Selected[foundNode] := True;
end;
end;
end.