가상 트리 뷰 컨트롤은 어떻게 항상 줄로 스크롤하도록 만들 수 있습니까?
-
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;