При работе с компонентом TListView в FireMonkey, пользователи могут столкнуться с проблемой, когда полоса прокрутки отображается не всегда, а зависит от наличия сенсорного экрана на системе. В этой статье мы рассмотрим, как можно переопределить это поведение и показать полосу прокрутки всегда, когда места на списке не хватает для отображения всех элементов.
Оригинальная проблема
Вопрос, заданный на форуме, заключается в том, как переопределить поведение видимости полосы прокрутки в TListView из FireMonkey, чтобы она отображалась всегда, когда места на списке не хватает для отображения всех элементов. Пользователь отметил, что в методе TListViewBase.Create видимость полосы прокрутки зависит от результата функции HasTouchTracking, которая, в свою очередь, зависит от значения TScrollingBehaviour.TouchTracking, полученного из SystemInformationService.GetScrollingBehaviour. Пользователь просит подсказок, как переопределить это поведение.
Альтернативный ответ
Одним из предложенных решений было создание отдельного юнита для переопределения поведения полосы прокрутки на конкретных платформах. В качестве примера был представлен код для переопределения поведения на Windows. В этом коде создается новый сервис, который удаляет установленный сервис и сохраняет ссылку на него для частей, которые не переопределяются, а затем заменяет его своим собственным.
unit DW.ScrollingBehaviourPatch.Win;
interface
implementation
uses
FMX.Platform;
type
TPlatform = class(TInterfacedObject, IFMXSystemInformationService)
private
class var FPlatform: TPlatform;
FSysInfoService: IFMXSystemInformationService;
public
{ IFMXSystemInformationService }
function GetScrollingBehaviour: TScrollingBehaviours;
function GetMinScrollThumbSize: Single;
function GetCaretWidth: Integer;
function GetMenuShowDelay: Integer;
public
constructor Create;
destructor Destroy; override;
end;
{ TPlatform }
constructor TPlatform.Create;
begin
inherited;
if TPlatformServices.Current.SupportsPlatformService(IFMXSystemInformationService, FSysInfoService) then
TPlatformServices.Current.RemovePlatformService(IFMXSystemInformationService);
TPlatformServices.Current.AddPlatformService(IFMXSystemInformationService, Self);
FPlatform := Self;
end;
destructor TPlatform.Destroy;
begin
inherited;
end;
function TPlatform.GetCaretWidth: Integer;
begin
Result := FSysInfoService.GetCaretWidth;
end;
function TPlatform.GetMenuShowDelay: Integer;
begin
Result := FSysInfoService.GetMenuShowDelay;
end;
function TPlatform.GetMinScrollThumbSize: Single;
begin
Result := FSysInfoService.GetMinScrollThumbSize;
end;
function TPlatform.GetScrollingBehaviour: TScrollingBehaviours;
begin
Result := [TScrollingBehaviour.Animation, TScrollingBehaviour.TouchTracking];
end;
initialization
TPlatform.Create;
end.
Подтвержденный ответ
Для решения проблемы, предложенного в альтернативном ответе, пользователь может отключить отслеживание прикосновений, переопределив функцию GetScrollingBehaviour, как показано ниже:
function TPlatformListViewWorkaround.GetScrollingBehaviour: TScrollingBehaviours;
begin
result := fSysInfoService.GetScrollingBehaviour - [TScrollingBehaviour.TouchTracking];
end;
Однако, следует учитывать, что с этим решением список на сенсорных системах больше не будет поддерживать прокрутку пальцем.
Из-за этих ограничений было предложено открыть заявку на изменение в Embarcadero Quality Central, чтобы расширить TListView новым свойством SuppressScrollBarOnTouchSystems. Это свойство позволило бы пользователям управлять поведением полосы прокрутки в соответствии с их потребностями, не жертвуя функциональностью на сенсорных системах.
В заключение, пользователи FireMonkey могут изменить поведение полосы прокрутки в TListView, чтобы она отображалась всегда, когда места на списке не хватает для отображения всех элементов. Это можно сделать, переопределив поведение полосы прокрутки или используя предложенное расширение свойства SuppressScrollBarOnTouchSystems.
В статье описывается проблема с полосой прокрутки в компоненте TListView из FireMonkey, когда она не отображается всегда, а зависит от наличия сенсорного экрана на системе, и предлагаются способы переопределения этого поведения для отображения полосы прок
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.