문제

노드와 열의 직사각형 선택을 복사하려면 기능을 추가해야하지만 가상 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;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top