가상 트리 뷰 컨트롤은 어떻게 항상 줄로 스크롤하도록 만들 수 있습니까?

StackOverflow https://stackoverflow.com/questions/929600

  •  06-09-2019
  •  | 
  •  

문제

Virtual TreeView는 표준 Delphi 그리드와는 달리 픽셀로 수직으로 스크롤됩니다. TListView 그리고 TTreeView (또는 내가 알고있는 다른 컨트롤의 대부분) 라인별로 스크롤하고 항상 컨트롤 상단에 전체 라인을 보관합니다. 커서 키를 사용하여 탐색 할 때, 방향에 따라 첫 번째 또는 마지막 줄이 완전히 보입니다. 마우스로 스크롤 할 때는 정렬이 없습니다.

이 동작은 예를 들어 Delphi 2007 및 2009의 구조 창으로 관찰 될 수 있습니다.

표준 Windows 컨트롤의 동작을 갖도록 많은 속성을 설정하는 방법이 있습니까? 아니면 이것을 달성하기 위해 어딘가에 패치 세트가 있습니까?

도움이 되었습니까?

해결책

tbasevirtualtree.onscroll 이벤트를 가로 채고 Textheight에 대한 가상 트리 뷰의 캔버스의 반환 값 ( 'm')을 tbasevirtualtree.offsety를 증가시키기 위해 (스크롤) 또는 감소 (스크롤 아래)를 변경하는 금액으로 사용할 수 있습니다. 또한 사전 스크롤 위치 모듈러스 Textheight ( 'M')가 0이되도록 테스트 할 수 있습니다 (잘못된 위치에서 올바른 양으로 스크롤을 피하기 위해).

대안 적으로, 이 게시물 Virtual TreeView 포럼에서는 또 다른 접근법을 제안합니다. VCL 스크롤 막대가있는 Virtual TreeView의 기본 스크롤 막대를 숨긴 다음 스크롤을 직접 수행합니다 (VCL 스크롤 이벤트를 트래핑하고 가상 트리 뷰를 프로그래밍적으로 스크롤).

다른 팁

이것이 내가 Argalatyr의 도움으로 생각해 낸 것입니다.

procedure TForm1.FormCreate(Sender: TObject);
begin
  VirtualStringTree1.ScrollBarOptions.VerticalIncrement :=
    VirtualStringTree1.DefaultNodeHeight;
end;

procedure TForm1.VirtualStringTree1Resize(Sender: TObject);
var
  DY: integer;
begin
  with VirtualStringTree1 do begin
    DY := VirtualStringTree1.DefaultNodeHeight;
    BottomSpace := ClientHeight mod DY;
    VirtualStringTree1.OffsetY := Round(VirtualStringTree1.OffsetY / DY) * DY;
  end;
end;

procedure TForm1.VirtualStringTree1Scroll(Sender: TBaseVirtualTree; DeltaX,
  DeltaY: Integer);
var
  DY: integer;
begin
  if DeltaY <> 0 then begin
    DY := VirtualStringTree1.DefaultNodeHeight;
    VirtualStringTree1.OffsetY := Round(VirtualStringTree1.OffsetY / DY) * DY;
  end;
end;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top