我需要添加功能來複制節點和列的矩形選區,但是我找不到任何方法來真正選擇虛擬樹狀視圖中的多個列(在FullRowSelect旁邊)。是否可以在Virtual Treeview中選擇多個列?
我是否錯過了什麼?如果沒有,是否有一個後裔與網格多列選擇支持?
我需要添加功能來複制節點和列的矩形選區,但是我找不到任何方法來真正選擇虛擬樹狀視圖中的多個列(在FullRowSelect旁邊)。是否可以在Virtual Treeview中選擇多個列?
我是否錯過了什麼?如果沒有,是否有一個後裔與網格多列選擇支持?
所以經過一些測試後,我想出了以下內容,感謝DiGi的額外推動。 DrawSelection不適用於此解決方案,因此需要禁用它。因爲我認爲我不需要很快再做這件事,所以我沒有寫出後代。
將其設置爲不可見畫面選擇,toExtendedFocus和toMultiSelect爲True。
聲明下面的變量/屬性某處適合:
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;
在FocusChanged
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;
您可以嘗試啓用/添加到網格擴展在TreeOptions.MiscOptions。它允許通過光標鍵在列中自由移動,但VT在離開時仍然取消選擇列。但我相信可以通過自定義繪製來「修復」它並記住起始節點和列。
一個提示 - 看OnStateChange事件,也許你可以使用
procedure TSomeForm.VTreeStateChange(Sender: TBaseVirtualTree; Enter,Leave: TVirtualTreeStates);
begin
if tsDrawSelecting in Enter then
begin
// Save position
end;
end;
有趣,我稍後再看。 :) 謝謝! – PetriW 2009-01-30 12:52:29
我已經嘗試過這一點,當你想使用鼠標時,它不能很好地工作。然而,它確實「解決」了問題,因此得到了滿意的結果。 :) – PetriW 2009-01-29 13:05:07