Tôi đã có cùng một vấn đề làm việc với TVirtualDrawTree của. Bạn phải đảm bảo rằng chiều cao nút được tính toán trước khi cây thực sự cuộn.
Đây là những gì tôi làm:
1. Thêm mã này vào sự kiện OnInitNode để cây biết rằng chiều cao của nút mới phải được tính toán:
Node.States := node.States + [vsMultiline] - [vsHeightMeasured];
2.- trong OnMeasureItem, nếu bạn không thể tính toán chiều cao (ví dụ như nút không được khởi tạo nào), chắc chắn rằng bạn nói cây để lặp lại các cuộc gọi khi cần thiết: trong OnMeasureItem xử lý sự kiện:
If (Node = Nil) Or (Node = tree.RootNode) Then Begin
Exclude(Node.States, vsHeightMeasured);
Exit;
End;
NodeData := tree.GetNodeData(Node);
If (NodeData = Nil) Or (NodeData^.XMLNode = Nil) Then Begin
Exclude(Node.States, vsHeightMeasured);
Exit;
End;
Try
// Code to measure node height here.
Except
Exclude(Node.States, vsHeightMeasured);
End;
Tôi hy vọng nó sẽ giúp bạn.
Nguồn
2010-05-17 14:40:22
Cảm ơn Linas. Có, tôi đang thiết lập chiều cao tùy chỉnh cho mỗi nút trong cơ sở sự kiện OnMeasureItem trên nội dung nút. setting 'tree1.FocusedNode' không hoạt động. Tôi sẽ cố gắng những gì bạn nói về thiết lập chiều cao larges cho tất cả các nút sau đó điều chỉnh các giá trị. –
Hi Linas, Cách tiếp cận thứ hai mà bạn đề xuất hoạt động! Có vẻ như Virtual Treeview sử dụng DefaultNodeHeight khi thực hiện phép tính trong khi thực hiện thao tác cuộn. –
Đúng vậy, Edwin. Việc thay thế sẽ là để kiểm soát khởi tạo mọi nút trong cây, ngay cả những nút chưa được hiển thị. Điều đó có thể tốn thời gian. –