仮想ツリービューで複数の列を選択することが可能ですか?
-
20-08-2019 - |
質問
私は、ノードと列の長方形の選択範囲をコピーする機能を追加する必要がありますが、私は実際に(toFullRowSelect横に)仮想ツリービューで複数の列を選択する方法を見つけることができません。
私は何かが足りないのですか?ない場合と、格子状の複数列の選択をサポートしてそこに子孫があるのでしょうか?
解決
だから、いくつかのテストの後、私は、余分なプッシュのために、以下の、感謝DIGI思い付きました。それは無効にする必要がありますので、DrawSelectionは、このソリューションでは動作しません。私はすぐに私は子孫を書いていない、再びこれを実行する必要がありますとは思わないので。
Trueにに設定toDisableDrawSelection、toExtendedFocusとtoMultiSelectます。
どこかに適した以下の変数/プロパティを宣言します:
StartSelectedColumn: integer;
FirstSelectedColumn: integer;
LastSelectedColumn: integer;
Selecting: boolean;
次のイベントを更新します:
は、OnKeyDown
if (not Selecting) and (Key = VK_SHIFT) then
begin
StartSelectedColumn := vtMain.FocusedColumn;
FirstSelectedColumn := StartSelectedColumn;
LastSelectedColumn := StartSelectedColumn;
Selecting := true;
end;
OnKeyUpを
if Key = VK_SHIFT then
Selecting := false;
OnFocusChanged
if Selecting then
begin
if column < StartSelectedColumn then
begin
FirstSelectedColumn := column;
LastSelectedColumn := StartSelectedColumn;
end
else if column > StartSelectedColumn then
begin
FirstSelectedColumn := StartSelectedColumn;
LastSelectedColumn := column
end
else
begin
FirstSelectedColumn := column;
LastSelectedColumn := column;
end;
end
else
begin
StartSelectedColumn := column;
FirstSelectedColumn := column;
LastSelectedColumn := column;
end;
OnBeforeCellPaint
if vtMain.Selected[node] and InRange(column, FirstSelectedColumn, LastSelectedColumn) then
begin
if vtMain.Focused then
TargetCanvas.Brush.Color := vtMain.Colors.FocusedSelectionColor
else
TargetCanvas.Brush.Color := vtMain.Colors.UnfocusedSelectionColor;
TargetCanvas.Brush.Style := bsSolid;
TargetCanvas.FillRect(CellRect);
end;
OnPaintText
if vtMain.Selected[node] and InRange(column, FirstSelectedColumn, LastSelectedColumn) then
begin
if vtMain.Focused then
TargetCanvas.Font.Color := clHighlightText
else
TargetCanvas.Font.Color := vtMain.Font.Color;
end;
他のヒント
あなたはのtoGridExtensions ののTreeOptions.MiscOptions の中に追加/有効試すことができます。これは、カーソルキーで列に自由な移動を可能にしますが、VTはまだ残して上の列の選択を解除します。しかし、私はそれがカスタムドローで、それを「修正」し、開始ノードと列を覚えることが可能であると確信しています。
もう一つの先端 - を見てのにOnStateChange のイベント、多分あなたは使用することができます。
procedure TSomeForm.VTreeStateChange(Sender: TBaseVirtualTree; Enter,Leave: TVirtualTreeStates);
begin
if tsDrawSelecting in Enter then
begin
// Save position
end;
end;
所属していません StackOverflow