Virtual TreeView에서 여러 열을 선택할 수 있습니까?
-
20-08-2019 - |
문제
노드와 열의 직사각형 선택을 복사하려면 기능을 추가해야하지만 가상 TreeView (TofullRowSelect 옆)에서 여러 열을 실제로 선택할 수있는 방법을 찾을 수 없습니다.
난 그냥 뭔가를 놓치고 있습니까? 그렇지 않다면 그리드와 같은 멀티 컬럼 선택 지원이있는 후손이 있습니까?
해결책
그래서 약간의 테스트 후 나는 다음을 생각해 냈습니다. 추가 푸시에 감사드립니다. DrawSelection 은이 솔루션에서 작동하지 않으므로 비활성화해야합니다. 나는 곧 다시 할 필요가 없다고 생각하기 때문에 나는 후손을 쓰지 않았다.
TodisabledRawselection, 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;
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;
다른 팁
활성화/추가를 시도 할 수 있습니다 Togidextensions 안에 Treeoptions.miscoptions. 커서 키에 의해 열에서 무료로 이동할 수 있지만 VT는 여전히 떠날 때 열을 선택 해제합니다. 그러나 나는 그것이 맞춤 드로우와 시작 노드와 열을 기억하여 그것을 "고정"할 수 있다고 확신합니다.
하나 더 팁 - 봐 onstatechange 이벤트, 아마도 사용할 수 있습니다
procedure TSomeForm.VTreeStateChange(Sender: TBaseVirtualTree; Enter,Leave: TVirtualTreeStates);
begin
if tsDrawSelecting in Enter then
begin
// Save position
end;
end;
제휴하지 않습니다 StackOverflow