Прокрутка TreeView, чтобы держать выделение посередине
procedure TMyForm.TreeChange(Sender: TObject; Node: TTreeNode);
var
i : integer;
pp, cp : TTreeNode;
beginif Assigned(Tree.Selected) thenbegin
cp := Tree.Selected;
pp := cp;
for i := 1 to Round(Tree.Height/30) doif cp <> nilthenbegin
pp := cp;
cp := cp.GetPrevVisible;
end;
Tree.TopItem := pp;
end;
end;
Перевод:
Код, который я предоставил, - это процедура, обрабатывающая событие TreeChange компонента TreeView в Delphi. Это событие триггерируется при изменении выбранного узла.
Цель этой процедуры - автоматически прокрутить TreeView, чтобы текущий выбранный узел был отображен в центре контрола. Вот разбивка на шаги, что код делает:
Он проверяет, есть ли текущий выбранный узел (Tree.Selected) и если есть, то присваивает его переменной cp.
Он initializes another variable pp с тем же значением, что и cp.
Затем он проходит через узлы дерева до высоты контрола, разделенной на 30 (чтобы определить, сколько видимых узлов находится выше центра). Для каждой итерации:
Он проверяет, не является ли текущий узел (cp) nil.
Если это не nil, то присваивает cp переменной pp и затем устанавливает cp в его предыдущий видимый узел с помощью метода GetPrevVisible.
Наконец, он устанавливает верхний элемент 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.