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;

Appearance of HexLog

предложенный ответ TLama не работает должным образом, см. изображение для объяснения: TLama solution is not working

см. эту ссылку для подробного объяснения изображения:http://i43.tinypic.com/1445thi.png

1 ответов


, чтобы перейти к концу дерева, называют ScrollIntoView(GetLast).

для прокрутки до определенного узла элементу управления необходимо добавить высоты всех предыдущих узлов, чтобы определить правильное смещение.

ваши узлы имеют разную высоту. Если вы не инициализируете фактические высоты узлов где-то, то элемент управления использует DefaultNodeHeight свойство для любых неинициализированных узлов. Похоже, что эта высота короче любой фактической высоты узла в вашем дереве, поэтому элемент управления в итоге вычисляется смещение, которое меньше, чем ожидалось, и прокручивается там, а не там, где вы намеревались.

убедитесь, что вы обработки OnMeasureItem событие, и что у вас есть установить в Options.MiscOptions. Если вы этого не сделаете, элемент управления будет просто использовать текущую назначенную высоту для каждого узла и использовать высоту по умолчанию для любого неинициализированного узла.

вы можете получить поведение, которое вы сообщаете здесь, Если вы вручную назначаете NodeHeight вместо toVariableNodeHeight и обработка OnMeasureItem.