6

別の手順からのファイル/フォルダーが既に取り込まれているツリー ビューがあります。ツリー ビューの項目を 1 つずつ、上から下に正確な順序で繰り返し処理したいと思います。ただし、通常のリストとは異なり、単純なforステートメントだけを使用することはできません。各ノードなどに入る必要があります。

どうすればいいですか?再帰的な手順を実行せずにそれを行う方法があることを願っています。これらのアイテムを反復処理するとき、現在フォーカスされているアイテムの親ノードまたは子ノードを必ずしも気にしません。Data各ノードを渡すときにそのプロパティを読み取れるようにする必要があるだけでなく、ツリー ビューで現在のノードを強調表示する必要があります。このツリー ビューの各項目について、いくつかの作業を実行し、このプロセスで現在どの項目が選択されているかをユーザーに視覚的に表示したいと考えています。

4

2 に答える 2

16

for実際、ループを使用できます。

var
  Node: TTreeNode;
....
for Node in TreeView.Items do
  DoSomething(Node);

これは、次のシンタックス シュガーです。

for i := 0 to TreeView.Items.Count-1 do
  DoSomething(TreeView.Items[i]);

読みやすさの観点から、for/inループをお勧めします。

ノード イテレータをサポートしていない古いバージョンの Delphi では、whileループを使用した方がよい場合があります。

Node := TreeView.Items.GetFirstNode;
while Assigned(Node) do
begin
  DoSomething(Node);
  Node := Node.GetNext;
end;

他にも方法があると思います。これらは私が知っている唯一のものです!


LU RD は、ドキュメントに次のような興味深い見解を示しています。

インデックスによるツリー ビュー アイテムへのアクセスは、特にツリー ビューに多数のアイテムが含まれている場合、時間がかかる場合があります。最適なパフォーマンスを得るには、ツリー ビューのアイテム インデックスへの依存関係ができるだけ少なくなるようにアプリケーションを設計してください。

これはかなり真実です。ランダム アクセスの場合、コードはルートから i番目のノードが見つかるまでツリーをたどる必要があります。

ただし、順次アクセスには最適化があります。Delphi ツリー ビュー ラッパーは、インデックスによって特定された最後のノードのインデックスを記憶しています。次回、キャッシュされたノードと 1 つしか違わないインデックスを持つノードを要求すると、必要なノードがすぐに返されます。これは に実装されていTTreeNodes.GetNodeFromIndexます。

于 2012-12-26T19:40:55.827 に答える
3
var
 i:Integer;
begin
  for I := 0 to tv.Items.Count - 1 do
      begin
        Listbox1.Items.Add(tv.Items[i].Text +' SubItems: ' + IntToStr(tv.Items[i].Count))
      end;

end;
于 2012-12-26T19:42:59.853 に答える