2009-01-29 44 views
6

我需要添加功能來複制節點和列的矩形選區,但是我找不到任何方法來真正選擇虛擬樹狀視圖中的多個列(在FullRowSelect旁邊)。是否可以在Virtual Treeview中選擇多個列?

我是否錯過了什麼?如果沒有,是否有一個後裔與網格多列選擇支持?

回答

6

所以經過一些測試後,我想出了以下內容,感謝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; 
1

您可以嘗試啓用/添加到網格擴展TreeOptions.MiscOptions。它允許通過光標鍵在列中自由移動,但VT在離開時仍然取消選擇列。但我相信可以通過自定義繪製來「修復」它並記住起始節點和列。

+0

我已經嘗試過這一點,當你想使用鼠標時,它不能很好地工作。然而,它確實「解決」了問題,因此得到了滿意的結果。 :) – PetriW 2009-01-29 13:05:07

1

一個提示 - 看OnStateChange事件,也許你可以使用

procedure TSomeForm.VTreeStateChange(Sender: TBaseVirtualTree; Enter,Leave: TVirtualTreeStates); 
begin 
    if tsDrawSelecting in Enter then 
    begin 
    // Save position 
    end; 
end; 
+0

有趣,我稍後再看。 :) 謝謝! – PetriW 2009-01-30 12:52:29

相關問題