dervish00 Posted May 24, 2021 Posted May 24, 2021 (edited) Скрытый текст class procedure TfgAnimationHelper.HideForm(const AForm: TObject; const AOptions: TfgAnimationOptions; const ADuration: Integer; const AFinishCallback: TfgCallback); var LDuration: Integer; LForm: TfgCustomForm; {$IFDEF IOS} LAnimation: TfgAnimation; LNewTopForm: TfgCustomForm; {$ENDIF} begin TfgAssert.IsNotNil(AForm, 'AForm'); TfgAssert.IsClass(AForm, TfgCustomForm); LForm := TfgCustomForm(AForm); if LForm <> TfgFormManager.Current.TopMost then begin LForm.Hide; if Assigned(AFinishCallback) then AFinishCallback; Exit; end; if ADuration = PlatformDuration then LDuration := TfgAnimationManager.ShortAnimationDuration else LDuration := ADuration; {$IFDEF IOS} LNewTopForm := TfgFormManager.Current.PreviousTopMost; LAnimation := LForm.AnimationManager.AddTranslationAnimation(TPointF.Zero, TPointF.Create(LForm.Width, 0), LDuration); LAnimation.Options := AOptions + [TfgAnimationOption.ReleaseAnimationOnFinish]; LAnimation.OnFinishCallback := procedure begin LForm.Hide; if Assigned(AFinishCallback) then AFinishCallback; end; LAnimation.Start; if LNewTopForm <> nil then begin LAnimation := LNewTopForm.AnimationManager.AddTranslationAnimation(TPointF.Create(-LNewTopForm.Width / 3, 0), TPointF.Zero, LDuration); LAnimation.Options := [TfgAnimationOption.ReleaseAnimationOnFinish]; LAnimation.Start; end; {$ELSE} LForm.Show; &Out(LForm, TfgAnimationInOutMode.LeftToRight, AOptions, LDuration, procedure begin LForm.Hide; if Assigned(AFinishCallback) then AFinishCallback; end); {$ENDIF} end; При вызове процедуры HideForm из-за вызова LForm.Show (после {$ELSE}) у меня крашится приложение с ошибкой "Component with name ... already exist", т.к. на форме есть компоненты, которые создаются в рантайме в обработчике формы OnShow. На предыдущей версии библиотеки этого не было. Сделал копию файла FGX.Animation с закомментированным вызовом LForm.Show - всё работает. Edited May 24, 2021 by dervish00
Administrators Yaroslav Brovin Posted May 24, 2021 Administrators Posted May 24, 2021 Добрый день, Какая платформа? Какая версия IDE используется? Демо проект? В каком месте вы создаете компоненты в рантайме? Спасибо
dervish00 Posted May 24, 2021 Author Posted May 24, 2021 1. Android 2. 10.4 3. Демо проект практически нереально - очень много времени понадобится. 4. Создаются кнопки в обработчике OnShow
Administrators Yaroslav Brovin Posted May 24, 2021 Administrators Posted May 24, 2021 3 минуты назад, dervish00 сказал: 4. Создаются кнопки в обработчике OnShow При каждом отображении формы вызывается ее обработчик OnShow. Собственно, если вы кнопки создаете в OnShow, то вы их создаете на каждого отображение формы. Что не верно. Их надо создать один раз, например в конструкторе или в событии OnCreate.
Administrators Yaroslav Brovin Posted May 24, 2021 Administrators Posted May 24, 2021 Хотя, я понял в чем дело. Посмотрим. Как минимум не должно быть вызова отображения формы при ее скрытии. Разберемся с этим. Но и создание компонентов в любом случае не надо делать в OnShow.
dervish00 Posted May 24, 2021 Author Posted May 24, 2021 Это фрейм. Он каждый раз уничтожается и показывается, когда необходим. Т.е. нет ситуации, когда он мог бы показываться без уничтожения. Я HideForm вызываю с опцией ReleaseControlOnFinish
Administrators Yaroslav Brovin Posted May 24, 2021 Administrators Posted May 24, 2021 Ok, посмотрим к следующему релизу.
Administrators Viktor Akselrod Posted May 25, 2021 Administrators Posted May 25, 2021 Исправлено в 1.11.1.0.
Recommended Posts