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

Синхронизация прокрутки элементов `TVirtualStringTree` различной высоты

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

Синхронизация прокрутки элементов TVirtualStringTree различной высоты

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

Проблема

Пользователь столкнулся с проблемой синхронизации прокрутки двух компонентов TVirtualStringTree, расположенных один над другим с использованием TSplitter. При стандартной синхронизации по OffsetY прокрутка работает корректно только в случае, если высота компонентов одинакова. Если же высота компонентов различна, то прокрутка одного из них достигает конца, в то время как другой ещё имеет непрокрученные элементы.

Решение

Решением проблемы является использование свойства RangeY компонента TVirtualStringTree, которое содержит полный диапазон прокрутки. Используя это свойство, можно корректно рассчитать и применить значение OffsetY для синхронизации прокрутки между компонентами различной высоты.

Пример кода

type
  TForm1 = class(TForm)
  ...
  private
    FScrolling: boolean;
    procedure SyncScroll(Sender, Target: TBaseVirtualTree);
  end;

...
type
  TCustomVirtualStringTreeAccess = class(TCustomVirtualStringTree);

procedure TForm1.SyncScroll(Sender, Target: TBaseVirtualTree);
var
  SenderMaxOffsetY, TargetMaxOffsetY: Integer;
  DY: Extended;
begin
  if FScrolling then Exit; // Избегаем рекурсии, если Target вызовет обратный вызов
  SenderMaxOffsetY := Sender.ClientHeight - Integer(TCustomVirtualStringTreeAccess(Sender).RangeY);
  TargetMaxOffsetY := Target.ClientHeight - Integer(TCustomVirtualStringTreeAccess(Target).RangeY);
  if SenderMaxOffsetY = 0 then Exit;
  DY := Sender.OffsetY / SenderMaxOffsetY;
  FScrolling := True;
  try
    Target.OffsetY := Round(TargetMaxOffsetY * DY);
  finally
    FScrolling := False;
  end;
end;

procedure TForm1.VST1Scroll(Sender: TBaseVirtualTree; DeltaX, DeltaY: Integer);
begin
  SyncScroll(Sender, VST2);
end;

procedure TForm1.VST2Scroll(Sender: TBaseVirtualTree; DeltaX, DeltaY: Integer);
begin
  SyncScroll(Sender, VST1);
end;

Комментарии

Этот код позволяет синхронизировать прокрутку двух компонентов TVirtualStringTree даже в случае, когда они имеют различную высоту. Использование свойства RangeY является ключом к решению проблемы.

Заключение

Синхронизация прокрутки компонентов TVirtualStringTree различной высоты возможна с помощью корректного расчета и применения OffsetY на основе свойства RangeY. Это позволяет обеспечить плавную и согласованную прокрутку данных в обоих компонентах, что значительно улучшает пользовательский опыт.

Создано по материалам из источника по ссылке.

Приведен пример кода для синхронизации прокрутки элементов `TVirtualStringTree` различной высоты в Delphi, используя свойство `RangeY` для корректной работы прокрутки при неодинаковых размерах компонентов.


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 14:28:11/0.0031309127807617/0