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
.