6


2

ノードと列の矩形選択をコピーする機能を追加する必要がありますが、仮想ツリービューで(toFullRowSelect以外に)複数の列を実際に選択する方法が見つかりません。

私は何かが足りない? そうでない場合は、グリッドのような複数列の選択をサポートする子孫がありますか?

3 Answer


6


それで、いくつかのテストの後、私は次のことを思いついた、余分なプッシュのためにDiGiに感謝する。 DrawSelectionはこのソリューションでは機能しないため、無効にする必要があります。 私はすぐにこれをする必要があるとは思わないので、私は子孫を書きませんでした。

toDisableDrawSelection、toExtendedFocus、およびtoMultiSelectをTrueに設定します。

以下の変数/プロパティを適切な場所で宣言します。

StartSelectedColumn:整数。 FirstSelectedColumn:整数。 LastSelectedColumn:整数。選択:ブール値;

以下のイベントを更新してください。

OnKeyDown

(選択していない)および(Key = VK_SHIFT)の場合は、StartSelectedColumnを開始します。= vtMain.FocusedColumn; FirstSelectedColumn:= StartSelectedColumn; LastSelectedColumn:= StartSelectedColumn;選択:= true;終わり;

OnKeyUp

Key = VK_SHIFTの場合、Select:= false;

OnFocusChanged

column <StartSelectedColumnであれば選択して開始し、次にFirstSelectedColumn:= columnで開始します。 LastSelectedColumn:= StartSelectedColumn; column> StartSelectedColumnであればそれ以外で終了し、次にFirstSelectedColumn:= StartSelectedColumn;を開始します。 LastSelectedColumn:=列の終わり、それ以外の場合はFirstSelectedColumn:= column; LastSelectedColumn:= column;終わり;それ以外の場合は開始StartSelectedColumn:= column; FirstSelectedColumn:= column; LastSelectedColumn:= column;終わり;

OnBeforeCellPaint

vtMain.Selected [node]およびInRange(column、FirstSelectedColumn、LastSelectedColumn)の場合は、vtMain.Focusedの場合はTargetCanvas.Brush.Color:= vtMain.Colors.FocusedSelectionColorの場合はTargetCanvas.Brush.Color:= vtMain.Colors.UnfocusedSelectionとなります。 TargetCanvas.Brush.Style:= bsSolid; TargetCanvas.FillRect(CellRect);終わり;

OnPaintText

vtMain.Selected [node]およびInRange(column、FirstSelectedColumn、LastSelectedColumn)の場合は、vtMain.Focusedの場合はTargetCanvas.Font.Color:= clHighlightTextの場合、TargetCanvas.Font.Color:= vtMain.Font.Color;終わり;


1


_TreeOptions.MiscOptions_で_toGridExtensions_を有効にしたり追加したりできます。 カーソルキーで列を自由に動かすことができますが、VTはまだ離脱時に列の選択を解除します。 しかし、それをカスタムドローで開始ノードと列を覚えて「修正」することは可能です。


1


もう一つのヒント - * OnStateChange *イベントを見てください、多分あなたは使用することができます

procedure TSomeForm.VTreeStateChange(送信者:TBaseVirtualTree;入力、終了:TVirtualTreeStates); tsDrawSelectingがEnterで始まる場合は開始// //位置を保存する。終わり;