1

Delphi 7 でMultiSelectStyleプロパティがどのようSelectedに機能するかを説明してもらえますか? 私は何年もの間、Delphi コーディングから離れていましたが、誰かが私に何を見逃しているのか指摘しない限り、その背後にある論理はまったくわかりません。Selected.CountTTreeView

ポイントへ。TTreeView選択したフォルダーの内容を入力するルーチンがあります。再帰を使用するため、各フォルダーは子を持つノードとして表されます-サブフォルダーとファイルです。MultiSelectが に設定されているため、ユーザーはツリー上の複数のアイテムを選択できますTrue。グループではMultiSelectStyle、4 つの子プロパティすべてTrueを同様に設定しました (おそらくそれは間違いでした)。

私のプログラムのデバッグとして(これは正反対に動作すると思います)、次のコードがあります:

ShowMessage(IntToStr(tvShell.Selected.Count) + ' selected');

for i := 0 to (tvShell.Selected.Count - 1) do
begin
    ShowMessage(tvShell.Selected.Item[i].Text);
end;

そこで、プログラムを実行して、任意のフォルダーを選択します。ツリーがレンダリングされ、次のように表示されます。

  • 選択したフォルダーのフル パスTextと 6 つの子を持つルート ノード。選択したフォルダーには 6 つのサブフォルダーが含まれ、ファイルは含まれていません。
  • これらの 6 つのサブフォルダーにはファイルのみが含まれるため、ルート ノードの 6 つの子には適切な数の子が含まれます。たとえば、最初に 44 (ファイルまたはアイテム) が含まれ、最後に 9 (アイテムまたはファイル) が含まれます。

とマウスを使用しCtrlて、最初 (44 ファイル) と最後 (9 ファイル) のツリー ノード (ルート ノードの子) を選択し、上記のデバッグ コードを実行するボタンを押します。

ツリー コンテンツの例

私は何を期待していますか?2 つのアイテムが選択されています。msVisibleOnlyは between に設定されてTrueいるので、 に設定して 3 つのメッセージが表示されるMultiSelectStyleことを期待しています。tvShell.Selected.Count2

何を得るか?最初のメッセージは、9 つ​​のアイテムが選択されていることを示しています。続行すると、最後のフォルダー(ツリーの子) の内容を示す追加の 9 つのメッセージが表示されます。一番面白いのは、実際に私tvShell.Selected が選んだ 2 つの兆候がないことです。なんてこと?

理不尽が続く…

これらすべての手順を繰り返しますが、今回は最後のフォルダー (子) を選択 (クリック) し、Ctrlボタンを押したまま最初のフォルダー (ルートの子) をクリックしています。人間として、 2 つのアイテムが選択されていることがわかります。この木を見ると、視覚的に選択に違いは見られません。しかし、Delphi はそうします。

デバッグ コードを実行すると、今回は44個の項目が選択されているという情報が表示され、最初のフォルダーの内容を示す 44 個の追加メッセージ ボックスが表示されます。+完全に混乱して、最初と最後のフォルダーの横をクリックして、内部で選択されたアイテムがあるかどうかを確認していますが、ありません (msVisibleOnlyに設定されているためTrue)。

なるほど、それはどのように機能するのですか (最後にクリックしたアイテムの子はすべて選択されたアイテムの中にあると常に主張しています)、私はそれを理解していません。この背後にあるロジックはどこにありますか? コードからの結果が現実を反映していない場合、これはどのように役立つのでしょうか?

難しい言葉で申し訳ありませんが、これは私にとって完全な愚かさです。私は Delphi でコードを書いていないので (私は実際にそのような言語が嫌いです)、啓蒙や説明を求めません。喜んで読んでください)。

TTreeViewしかし、Delphi の誤った現実の解釈ではなく、真に選択されたものをコードから取得するために、コード内およびプロパティ間でどのような魔法を行う必要があるかを誰かが説明してくれれば、私は本当に幸せです。2 つの項目が選択されている場合は、tvShell.Selected.Count2 に設定し、選択したtvShell.Selected2 つの項目 (両方) を含める必要があります。それ以上でもそれ以下でもありません。

申し訳ありませんが、この質問は非常に長いですが、Delphi が本当に奇妙な言語であることを発見したとき (何年も経ってから)、私はフラストレーションの後に反応しなければなりませんでした。

4

1 に答える 1

6

あなたのコードはの値を表示します

tvShell.Selected.Count

これは、 の直接の子であるノードの数ですtvShell.SelectedtvShell.Selectedこれは単一のノードであることを忘れないでください。

あなたはおそらく使用するつもりでした

tvShell.SelectionCount

そして、あなたは表示します

tvShell.Selected.Item[i].Text

これらは、 の直接の子のキャプションですtvShell.Selected

選択したすべてのノードを反復処理する場合は、次のように実行できます。

for i := 0 to tvShell.SelectionCount-1 do
  DoSomething(tvShell.Selections[i]);

このような状況に直面した場合は、オンライン ヘルプを読むことをお勧めします。特に Delphi 7 の場合、ドキュメントは非常に明確です。Selectedドキュメントの状態について:

ツリー ビューで選択したノードを指定します。

選択されたプロパティ: TTreeNode;

説明

Selected を読み取り、ツリー ビューの選択されたノードにアクセスします。選択されたノードがない場合、Selected の値は nil です。

.....

MultiSelect プロパティが True で、MultiSelectStyle プロパティに msControlSelect が含まれている場合、Selected は最後にクリックされたノードを返します。MultiSelect が True の場合の現在の選択状態については、Selections プロパティを参照してください。

そして、そのドキュメントをたどると、次のように書かれCountています:

ツリー ノードの直系の子孫の数を示します。

プロパティカウント: 整数。

説明

Count を使用して、ツリー ノードに属する子ノードの数を決定します。カウントには直接の子のみが含まれ、その子孫は含まれません。Count は、ツリー ノードの子を反復処理するときに役立ちます。

言い換えれば、ドキュメンテーションは、私があなたに言ったのとまったく同じことをあなたに伝えます.

于 2013-01-08T13:26:32.097 に答える