Delphi - задержка/зависание при отображении формы при использовании компонентов GestureManager XE3 + TMS

Я столкнулся с действительно незнакомой ситуацией с неизвестной причиной задержки запуска приложения, так как я впервые использую жесты и GestureManager. (приложение типа VCL)

Кажется, что когда я применяю TGestureManager к свойству Touch.GestureManager формы, когда эта форма вызывается для отображения в первый раз, приложение зависает/задерживается примерно на 5 секунд. Даже если жесты вообще не включены (отмечены). Как только я удаляю свойство Touch.GestureManager из формы, форма немедленно отображается с событием Form.Show. Приложение создает все формы при запуске, поэтому форма уже создана к тому времени, когда я вызываю событие Form.Show.

Сама форма довольно тяжелая (размер разрешения FullHD, на ней размещено довольно много компонентов...), но не показывает никаких проблем со скоростью без использования GestureManager...

До сих пор я мог найти только одну тему в Интернете по этому поводу, но ответ на самом деле не помог (предлагая включить опцию «Планшетный ПК» на ПК. Это уже сделано ...)

Ваше здоровье

Редактировать: В "менее тяжелой" форме (меньше компонентов) задержка немного ниже, но по-прежнему составляет около 2-3 секунд...

Редактировать2-код

Пример, который создает задержку:

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
var
  Form1: TForm1;
implementation
{$R *.dfm}
uses Unit2;
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.show;
end;
end.

Вызывает форму2, которая представляет собой чистую форму с 20 объектами TAdvGlassButton на ней (часть пакета компонентов TMS), и GestureManager, который назначается свойству Form2.Touch.GestureManager. Это создает задержку около 2 секунд при нажатии кнопки Button1 (и должна отображаться форма Form2);


person That Marc    schedule 23.01.2015    source источник
comment
Это приложение VCL или FMX?   -  person SilverWarior    schedule 23.01.2015
comment
Только что провел некоторое тестирование, и я не могу воспроизвести это в FMX, даже если в форме размещено более 100 компонентов, в то время как каждому компоненту назначен GestureManager.   -  person SilverWarior    schedule 23.01.2015
comment
Я только что попробовал с 2000 программно сгенерированными панелями, и, похоже, нет никакой разницы, назначен ли диспетчер жестов форме или любым другим элементам управления. Задержка перед отображением формы в первый раз кажется одинаковой во всех сценариях.   -  person SilverWarior    schedule 23.01.2015
comment
извините, забыл упомянуть. это приложение типа Vcl (сейчас добавлено к исходному вопросу).   -  person That Marc    schedule 23.01.2015
comment
Я назначаю его только форме, а не компонентам, так как у меня в основном есть кнопки, которые не удерживают фокус, поэтому жесты формы работают по всему холсту... ps: задержка кажется одинаковой - значит есть задержка? И как много?   -  person That Marc    schedule 23.01.2015
comment
Можете ли вы предоставить небольшой полный образец приложения, демонстрирующий задержку?   -  person Ken White    schedule 23.01.2015
comment
не бери в голову! только что поместил 20 кнопок типа TAdvGlassButton (часть пакета компонентов TMS, есть исходный код только кнопки, но не думаю, что я могу законно предоставить его здесь ??) на пустой форме, с задержкой 2 секунды. form1 с button1, событие кнопки onclick вызывает form2.show.   -  person That Marc    schedule 23.01.2015
comment
Выяснил это: если я не назначаю GestureManager1 форме в IDE, а делаю это на кнопке этой формы, форма отображается немедленно, но когда я нажимаю кнопку, которая вызывает Console1.Touch.GestureManager:=GestureManager1; все приложение зависает на ту же величину, что и раньше (от 2 до 5 секунд ..) ... Что может быть причиной?   -  person That Marc    schedule 23.01.2015
comment
Для справки в будущем: опубликованный вами образец не воспроизводит проблему, потому что у нас нет form2, который представляет собой чистую форму с 20 объектами TAdvGlassButton и GestureManager. Пример должен быть чем-то, что мы можем скопировать/вставить, скомпилировать и запустить, чтобы воспроизвести проблему. См. Как создать минимальный, полный и проверяемый пример.   -  person Ken White    schedule 23.01.2015
comment
Отмеченный. Хотя, как уже было сказано, я не уверен, что мне разрешено копировать часть условно-бесплатного компонента... ?   -  person That Marc    schedule 23.01.2015


Ответы (1)


Думаю, я только что придумал свой собственный ответ на вопрос «Почему» появляется задержка.

Теперь, "Как это решить", этот вопрос остается открытым, если кто-то соображает...

Что касается «Почему», считается...:

Похоже, что компоненты TMS (я могу это подтвердить) автоматически принимают свойство Touch родительской формы! Таким образом, мне на первый взгляд показалось, что жесты работают по всей форме и элементам управления просто потому, что кнопки на самом деле никогда не фокусируются, но это не так! Жесты не должны работать на них, если они не установлены. Поскольку они были, я решил, что каждому элементу присвоено свойство касания.

Таким образом, это привело к тому, что в форме появилось большое количество элементов, и все они использовали свойство Touch при первом отображении формы, что, очевидно, вызвало задержку, которую я испытал.

Создание панели поверх формы и за всеми элементами управления на самом деле не выглядело так, как будто что-то изменилось, но изменилось -> форма видна сразу, жесты работают только в той области, где панель (фон) видна (позор , было бы неплохо, если бы они работали на всех кнопках, но не с учетом такой большой задержки!), и как-то это соответствует моим потребностям.

Теперь, почему компоненты TMS автоматически принимают свойство формы, это действительно хороший вопрос, а также как отключить эту функцию...

person That Marc    schedule 23.01.2015
comment
Возможно, стеклянные кнопки спроектированы таким образом, что они не блокируют жесты от своего родительского компонента. Теперь, почему это вызывает такую ​​большую задержку, я не уверен. Я попытался назначить диспетчер жестов для каждой из этих процедурно сгенерированных кнопок, чтобы увидеть, может ли это быть причиной задержки, но в моем случае это было не так. Возможно, это было из-за того, что я назначал диспетчер жестов из локальной переменной, но компоненты TMS, вероятно, считывают свойства форм, хранящие информацию о диспетчере жестов, что может быть немного медленнее. - person SilverWarior; 24.01.2015
comment
Я только что провел сравнительный тест о назначении сенсорного менеджера 2000 панелям, напрямую прочитав его из свойств касания форм и назначив его из локальной переменной, и нет заметной разницы. В обоих случаях для завершения потребовалось 1 мс. Поэтому я бы предположил, что TMS Advanced Glass Button выполняет дополнительную обработку после изменения свойства GestureManager. Вы можете проверить это, быстро изменив свойство GestureManager одной кнопки TMS в цикле, чтобы увидеть, занимает ли это больше времени, чем выполнение того же для некоторых стандартных элементов управления VCL, таких как Panel, например. - person SilverWarior; 24.01.2015
comment
Хороший совет/предложение. Я сделаю пример для сравнения времени между ними, как только смогу, и вернусь с результатами. - person That Marc; 24.01.2015