Синхронизация прокрутки элементов 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.