Delphi - забавяне/замразяване на показване на формуляр при използване на GestureManager XE3 + TMS компоненти

Изправен съм пред наистина непозната ситуация с неизвестна причина за забавяне на изпълнението на приложението, тъй като за първи път използвам жестове и GestureManager. (приложение тип VCL)

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

Самата форма е доста тежка (размер на FullHD резолюция, с доста компоненти, поставени върху нея...), но не показва никакви проблеми със скоростта без използване на GestureManager...

Досега успях да намеря само една тема в мрежата по този въпрос, но отговорът не беше особено полезен (предлага се да се включи опцията „Tablet PC“ на компютър. Това вече е направено...)

наздраве

Редактиране: При „по-малко тежка“ форма (по-малко компоненти в нея), забавянето е малко по-ниско, въпреки това около 2-3 секунди...

Edit2-code

Пример, който създава забавяне:

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.

Извиква form2, който е чиста форма с 20 обекта TAdvGlassButton върху него (част от TMS Component pack) и 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
Отбелязано. Въпреки че, както казах, не съм сигурен дали ми е позволено да копирам единицата на компонента, който е Shareware... ?   -  person That Marc    schedule 23.01.2015


Отговори (1)


Предполагам, че току-що измислих своя собствен отговор на въпроса „Защо“ се появява забавянето.

Сега, „Как да го решим“, този въпрос остава отворен, ако някой се сети...

Що се отнася до „Защо“...:

Изглежда, че TMS компонентите (мога да потвърдя за тях) автоматично приемат свойството Touch на родителския формуляр! Затова на пръв поглед ми се стори, че жестовете работят навсякъде във формуляра и контролите, просто защото бутоните всъщност не заемат фокус в нито един момент, но това не беше така! Жестовете не трябва да работят върху тях, освен ако не бъдат убити. Тъй като бяха, реших, че на всеки елемент е присвоено свойството touch.

И така, това доведе до наличието на голямо количество елементи във формуляр, като всички те приемаха свойството Touch, когато формулярът се показва за първи път, което очевидно причини забавянето, което изпитах.

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

Сега, защо TMS компонентите автоматично вземат свойството на формуляра е наистина добър въпрос, както и как да деактивирате тази функция...

person That Marc    schedule 23.01.2015
comment
Възможно е стъклените бутони да са проектирани по този начин, така че да не блокират жестове от техния родителски компонент. Защо това причинява толкова много забавяне, не съм сигурен. Опитах се да присвоя диспечера на жестовете на всеки от тези процедурно генерирани бутони, за да видя дали това може да е причината за забавянето, но не беше в моя случай. Може би това беше така, защото присвоявах диспечера на жестове от локална променлива, но TMS компонентите вероятно четат свойството на формуляри, съхранявайки информация за диспечера на жестове, което може да бъде малко по-бавно. - person SilverWarior; 24.01.2015
comment
Току-що направих сравнителен тест за присвояване на сензорен мениджър на 2000 панела, като го прочетох директно от свойството за докосване на формуляри и като го присвоих от локална променлива и няма забележима разлика. И в двата случая завършването отне 1 ms. Така че бих предположил, че TMS Advanced Glass Button извършва някаква допълнителна обработка, след като неговото свойство GestureManager е променено. Можете да тествате това, като промените бързо свойството GestureManager от един TMS бутон в lop, за да видите дали отнема повече време, отколкото да направите същото за някои стандартни VCL контроли като Panel например. - person SilverWarior; 24.01.2015
comment
Добър съвет/предложение. Ще направя пример за сравнение на времената между двете веднага щом мога и ще се върна с резултатите. - person That Marc; 24.01.2015