TVirtualStringTree и вертикальная прокрутка работают неправильно
Я научился использовать TVirtualStringTree, и я нашел его превосходным. У меня есть один пользовательский невизуальный список, называемый PackedList, который заполняется другим потоком. И я хочу показать все содержимое списка в TVirtualStringTree в режиме реального времени. Поэтому я поставил один таймер на mainform для обновления 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
1 ответов
, чтобы перейти к концу дерева, называют ScrollIntoView(GetLast).
для прокрутки до определенного узла элементу управления необходимо добавить высоты всех предыдущих узлов, чтобы определить правильное смещение.
ваши узлы имеют разную высоту. Если вы не инициализируете фактические высоты узлов где-то, то элемент управления использует DefaultNodeHeight свойство для любых неинициализированных узлов. Похоже, что эта высота короче любой фактической высоты узла в вашем дереве, поэтому элемент управления в итоге вычисляется смещение, которое меньше, чем ожидалось, и прокручивается там, а не там, где вы намеревались.
убедитесь, что вы обработки OnMeasureItem событие, и что у вас есть установить в Options.MiscOptions. Если вы этого не сделаете, элемент управления будет просто использовать текущую назначенную высоту для каждого узла и использовать высоту по умолчанию для любого неинициализированного узла.
вы можете получить поведение, которое вы сообщаете здесь, Если вы вручную назначаете NodeHeight вместо toVariableNodeHeight и обработка OnMeasureItem.