Я научился использовать TVirtualStringTree, и я нашел его превосходным. У меня есть один пользовательский не-визуальный список под названием PackedList, который заполняется другим потоком. И я хочу показать все содержимое списка в TVirtualStringTree в реальном времени. Поэтому я поставил один таймер на основную форму для обновления HexLog (, который является TVirtualStringTree)RootNodeCount каждые 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