Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Прокрутка TreeView, чтобы держать выделение посередине

Delphi , Компоненты и Классы , TTreeView

Прокрутка TreeView, чтобы держать выделение посередине


 procedure TMyForm.TreeChange(Sender: TObject; Node: TTreeNode);
 var
   i : integer;
   pp, cp : TTreeNode;
 begin
   if Assigned(Tree.Selected) then
     begin
       cp := Tree.Selected;
       pp := cp;
       for i := 1 to Round(Tree.Height/30) do
         if cp <> nil then
           begin
             pp := cp;
             cp := cp.GetPrevVisible;
           end;
       Tree.TopItem := pp;
     end;
 end;

Перевод:

Код, который я предоставил, - это процедура, обрабатывающая событие TreeChange компонента TreeView в Delphi. Это событие триггерируется при изменении выбранного узла.

Цель этой процедуры - автоматически прокрутить TreeView, чтобы текущий выбранный узел был отображен в центре контрола. Вот разбивка на шаги, что код делает:

  1. Он проверяет, есть ли текущий выбранный узел (Tree.Selected) и если есть, то присваивает его переменной cp.
  2. Он initializes another variable pp с тем же значением, что и cp.
  3. Затем он проходит через узлы дерева до высоты контрола, разделенной на 30 (чтобы определить, сколько видимых узлов находится выше центра). Для каждой итерации:
    • Он проверяет, не является ли текущий узел (cp) nil.
    • Если это не nil, то присваивает cp переменной pp и затем устанавливает cp в его предыдущий видимый узел с помощью метода GetPrevVisible.
  4. Наконец, он устанавливает верхний элемент TreeView в pp, что эффективно прокручивает контрол, чтобы pp был на верху.

Реализация кода основана на следующем:

  • Итерация через узлы до высоты контрола, разделенной на 30, позволяет найти узел, который будет отображен в центре контрола, если он был прокручен наверх.
  • Установка верхнего элемента в этот узел (pp) эффективно прокручивает контрол, чтобы pp был на верху.

Однако, есть небольшая проблема с этой реализацией. Логика итерации может не всегда найти правильный узел в центре контрола, особенно если дерево имеет большое количество узлов или высоты узлов не равны. Более надежная реализация должна включать расчет exact позиции выбранного узла и прокрутку контрола соответственно.

Вот альтернативное решение:

procedure TMyForm.TreeChange(Sender: TObject; Node: TTreeNode);
var
  rect: TRect;
begin
  if Assigned(Node) then
  begin
    Tree.GetNodeRect(Node, rect);
    Tree.TopItem := Node;
    Tree.ScrollRectToVisible(rect);
  end;
end;

В этом реализации мы используем метод GetNodeRect для получения прямоугольника ограничения выбранного узла. Затем мы устанавливаем верхний элемент в выбранный узел и вызываем ScrollRectToVisible, чтобы прокрутить контрол, чтобы узел был видимым в его оригинальной позиции.

Эта реализация должна быть более точной и надежной, особенно для больших деревьев или не равных высот узлов.

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


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TTreeView ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:53:34/0.0055670738220215/1