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;
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