Я научился использовать TVirtualStringTree, и мне это понравилось. У меня есть один настраиваемый невизуальный список под названием PackedList, который заполняется другим потоком. И я хочу отображать все содержимое списка в TVirtualStringTree в реальном времени. Поэтому я установил один таймер на главную форму для обновления значения RootNodeCount HexLog (который является TVirtualStringTree) каждые 500 мс.
Все мои данные отображаются в VirtualStringTree, и у меня нет проблем со скоростью, очень хорошо. Но есть одна проблема с вертикальной полосой прокрутки. Когда я нажимаю Ctrl + End на элементе управления, чтобы перейти к концу списка, он попадает где-то посередине. Точно так же, когда я перетаскиваю полосу прокрутки до конца, она не доходит до конца. Но HexLog знает DataCount. Почему не до конца? Если я пару раз нажму Ctrl + END, он дойдет до конца.
Внутри подпрограммы таймера я хочу сказать HexLog, чтобы перейти к концу списка по коду. Как я могу это сделать и как правильно обрабатывать вертикальную полосу прокрутки?
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;
Предлагаемый ответ TLama не работает должным образом, см. Изображение для объяснения:
См. Ссылку для подробного объяснения изображения: http://i43.tinypic.com/1445thi.png