3

使い方を学んTVirtualStringTreeでいて、インクリメンタル検索を実装する必要があります。ユーザーが文字を入力するTEditと、フォーカスされたノードをツリー内の最初の条件を満たすノードに移動したいと考えています。

私は見つけることができるすべてのデモとサンプルコードを読んでいますが、これの出発点を見つけることができないようです. 誰でも擬似コードまたはそれ以上のコードを使用できますか?

4

2 に答える 2

6

コントロールは、インクリメンタル検索を既にサポートしています。編集コントロールを追加する必要はありません。ツリー コントロールに入力を開始するだけで、次に一致するノードが選択されます。、、、およびプロパティを必要に応じてIncrementalSearch設定します。IncrementalSearchDirectionIncrementalSearchStartIncrementalSearchTimeout

特定の基準に一致する最初のノードを選択するには、 を使用しますIterateSubtree。の署名に一致するメソッドを記述TVTGetNodeProcして、検索基準に対して単一のノードをチェックします。ツリー内の各ノードに対して呼び出され、ノードが一致する場合は、Abortパラメーターを true に設定する必要があります。IterateSubtree(named )の 3 番目のパラメーターを使用してData、検索用語を他の検索条件と共にコールバック関数に伝達します。

于 2013-06-10T20:06:46.447 に答える
4

不要なコードの一部を削除しましたが、次のとおりです。

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.
于 2013-06-11T09:48:01.927 に答える