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;
đề nghị trả lời bằng TLama không hoạt động đúng, xem ảnh để giải thích:
Xem trang liên kết để giải thích hình ảnh chi tiết: http://i43.tinypic.com/1445thi.png
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:/ –
Đ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 –
(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. –