2009-01-29 28 views
6

Tôi cần phải thêm chức năng để sao chép một lựa chọn hình chữ nhật của các nút và cột, nhưng tôi không thể tìm thấy bất kỳ cách nào để thực sự chọn nhiều cột trong một Treeview ảo (bên cạnh toFullRowSelect).Có thể chọn nhiều cột trong Virtual Treeview không?

Tôi chỉ thiếu một cái gì đó? Và nếu không, có một hậu duệ ra khỏi đó với nhiều cột giống như lưới điện chọn hỗ trợ không?

Trả lời

6

Vì vậy, sau khi một số thử nghiệm tôi đã đưa ra những điều sau đây, cảm ơn DiGi cho đẩy thêm. DrawSelection sẽ không hoạt động với giải pháp này vì vậy nó cần phải được vô hiệu hóa. Vì tôi không nghĩ rằng tôi sẽ cần phải làm điều này một lần nữa sớm, tôi đã không viết một hậu duệ.

Đặt thànhDisableDrawSelection, toExtendedFocus và toMultiSelect thành True.

Khai báo các biến/thuộc tính sau đâu đó phù hợp:

StartSelectedColumn: integer; 
FirstSelectedColumn: integer; 
LastSelectedColumn: integer; 
Selecting: boolean; 

Cập nhật các sự kiện sau đây:

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; 

On 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

Bạn có thể thử bật/thêm vàoGridExtensions trong TreeOptions.MiscOptions. Nó cho phép di chuyển tự do trong các cột bằng các phím con trỏ, nhưng VT vẫn bỏ chọn cột khi rời khỏi. Nhưng tôi chắc chắn rằng có thể "sửa" nó bằng cách vẽ tùy chỉnh và ghi nhớ nút và cột bắt đầu.

+0

Tôi đã đã thử điều này và nó không hoạt động tốt khi bạn muốn sử dụng chuột. Tuy nhiên nó "giải quyết" vấn đề để upvote. :) – PetriW

1

Thêm một mũi - nhìn vào OnStateChange sự kiện, có thể bạn có thể sử dụng

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

Thú vị, tôi sẽ xem xét sau. :) Cảm ơn! – PetriW

Các vấn đề liên quan