2012-04-06 42 views
6

Tôi đã học cách sử dụng TVirtualStringTree và tôi đã thấy nó xuất sắc. Tôi có một danh sách không trực quan tùy chỉnh được gọi là PackedList được điền bởi một chuỗi khác. Và tôi muốn hiển thị tất cả nội dung danh sách trong TVirtualStringTree tại thời gian thực. Vì vậy, tôi đặt một bộ đếm thời gian trên mainform để cập nhật HexLog's (đó là TVirtualStringTree) RootNodeCount mỗi 500ms.TVirtualStringTree và Vertical Scroll không hoạt động đúng cách

Tất cả dữ liệu của tôi xuất hiện trên VirtualStringTree và tôi không gặp bất kỳ vấn đề tốc độ nào, rất hay. Nhưng có một vấn đề với thanh cuộn dọc. Khi tôi nhấn Ctrl + End trên điều khiển để nhảy đến cuối danh sách, nó sẽ đi đâu đó ở giữa. Tương tự như vậy khi tôi kéo thanh cuộn đến cuối, nó không đi đến cùng. Nhưng HexLog biết DataCount. Tại sao nó không nhảy đến cùng? Nếu tôi nhấn vài lần để Ctrl + END thì nó sẽ kết thúc.

Thường xuyên hẹn giờ bên trong, tôi muốn nói HexLog để chuyển đến cuối danh sách theo mã. Làm thế nào tôi có thể làm điều này và Làm thế nào để xử lý thanh cuộn dọc đúng cách?

procedure TMainForm.StatusUpdateTimerTimer(Sender: TObject); 
begin 
    if (FirpList.ComOperationCount > 0) and (PacketList.Items.Count <> FirpList.ComOperationCount) then 
    begin 
     HexLog.RootNodeCount := PacketList.Items.Count; 
    end; 
end; 

procedure TMainForm.HexLogMeasureItem(Sender: TBaseVirtualTree; 
    TargetCanvas: TCanvas; Node: PVirtualNode; var NodeHeight: Integer); 
begin 
    if Sender.MultiLine[Node] then 
    begin 
    TargetCanvas.Font := Sender.Font; 
    NodeHeight := HexLog.ComputeNodeHeight(TargetCanvas, Node, 1, FirpList.ComOperations[Node^.Parent^.Index].DataAsHexString(FAppSettings.HexLogColumnCharWidth) + #13#10); 
    end; 
end; 

Appearance of HexLog

đề nghị trả lời bằng TLama không hoạt động đúng, xem ảnh để giải thích: TLama solution is not working

Xem trang liên kết để giải thích hình ảnh chi tiết: http://i43.tinypic.com/1445thi.png

Trả lời

6

Để nhảy tới cuối của cây, hãy gọi ScrollIntoView(GetLast).

Để cuộn đến một nút cụ thể, điều khiển cần thêm chiều cao của tất cả các nút trước để có thể xác định độ lệch phù hợp.

Các nút của bạn có chiều cao khác nhau. Nếu bạn không khởi tạo chiều cao thực tế của các nút ở đâu đó, thì điều khiển sử dụng thuộc tính DefaultNodeHeight cho bất kỳ nút nào chưa được khởi tạo. Có vẻ như chiều cao đó ngắn hơn bất kỳ chiều cao nút thực tế nào trong cây của bạn, do đó, điều khiển kết thúc tính toán độ lệch nhỏ hơn mong đợi và cuộn ở đó thay vì vị trí bạn dự định.

Đảm bảo bạn đang xử lý sự kiện OnMeasureItem và bạn có tùy chọn toVariableNodeHeight được đặt trong Options.MiscOptions. Nếu không, thì điều khiển sẽ chỉ sử dụng chiều cao hiện được gán cho mỗi nút và sử dụng chiều cao mặc định cho bất kỳ nút nào chưa được khởi tạo.

Bạn có thể nhận được hành vi mà bạn báo cáo tại đây nếu bạn gán một cách thủ công NodeHeight thay vì đặt toVariableNodeHeight và xử lý OnMeasureItem.

+0

Xin chào Rob, tôi có trình xử lý trên MeasureItem để tính toán Chiều cao con của MultiLine. toVariableNodeHeight không được đặt trên MiscOptions. Tôi đã làm cho nó đúng và bây giờ ScrollIntoView() nhảy đến cuối cùng đúng cách. Nhưng nó hơi cuộn xuống và mất khoảng 2 giây để đạt đến kết thúc mà không được chấp nhận:/ –

+0

Điều quan trọng cần có thời gian để tính toán bù đắp của nút cuối cùng, ngoài việc tính toán chiều cao của tất cả các nút mới, sẽ là nếu bộ nhớ cache vị trí nút không hợp lệ. Đặt một điểm ngắt trong 'GetDisplayRect' và xem liệu bạn đang ở trạng thái' tsUseCache' khi bạn gọi 'ScrollIntoView'. Khi bộ đệm là hợp lệ, cây có thể tìm thấy vị trí của các nút nhanh hơn nhiều, nhưng việc thay đổi số lượng các nút làm mất hiệu lực bộ nhớ cache. Chuỗi công nhân cần thời gian để xác thực lại nó. Điều kiện –

+0

(tsUseCache trong FStates) trong hàm GetDisplayRect() trả về false khi tôi gọi ScrollIntoView(). Tôi nên làm gì bây giờ? Đối với dự án này, tôi đã sử dụng RichEdit kiểm soát, vì vấn đề tốc độ mà tôi phải đối mặt, tôi đã thay đổi tất cả các thiết kế để sử dụng VirtualStringTree.Bây giờ một lần nữa tôi đang ở cùng một điểm:/Trên thực tế tôi đang phải đối mặt với những khó khăn để hiểu tại sao tôi cần phải tính toán chiều cao của toàn bộ tin nhắn để nhảy đến cuối danh sách. Tôi chỉ muốn hiển thị các tin nhắn cuối cùng cho người dùng mỗi 500ms trong khi giao dịch dữ liệu đang hoạt động. –

Các vấn đề liên quan