• 0
TTTimon

Анимация пока создается форма

Вопрос

В проекте несколько форм: есть главная (меню) + ИСТОРИЯ (достаточно тяжелая форма) + другие

Задача:

по нажатию в МЕНЮ на кнопку, начинается создание ИСТОРИИ и в это время проигрывается FloatAnimation для вращения индикатора (это круг с изображением).

нужно по завершению создания формы прекратить анимацию и показать форму

 

Как делаю:

  • на главной форме есть F: TForm;
  • при создании формы: F := nil;
  • при нажатии на кнопку: 1) стартует анимация 2) F := TF_History.Create(nil);
  • в процессе проверяю создание формы (если создалась, то стоп)

procedure TF_Main.FloatAnimation1Process(Sender: TObject);
begin
  if Assigned(F) then FloatAnimation1.Stop;
end;

  • в стопе показываю форму

procedure TF_Main.FloatAnimation1Finish(Sender: TObject);
begin
  F.Show;
end;

 

Ошибка: приложение вылетает с ошибкой "stack overflow"!

P.S. Не совсем понимаю где копать, да и если у кого есть решение получше, буду только рад!)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

4 ответа на этот вопрос

  • 0

Добрый день!

1. Посмотрите стек при возникновении "stack overflow", та будет видно, что привело к проблеме.

2. Анимации не будет. Анимация работает в основном потоке приложения. Создание формы тоже происходит в основном потоке, т.е на время создания формы анимация остановиться.

TTTimon и Anatoliy понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

отсюда еще раз мораль. не нужно длительные действия выполнять в основном потоке.

FormCreate должна всего лишь запускать поток, который считывает и подготавливает все что нужно. А при завершении потока заполняем компоненты на форме.

Так что крутить анимацию должна уже вторая форма в то время пока данные готовятся.

Изменено пользователем krapotkin
TTTimon и Anatoliy понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

спасибо за ответы, правда обошел проблему другим путем) однако, если у кого-нибудь есть пример решения подобной проблемы, буду благодарен!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

я-то думал, что ответил на вопрос ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: dammit
      Друзья, столкнулся  с проблемой, описанной в посте 
      Хочу предложить свое решение (может кому пригодится).
      Чтобы центр масштабирования был именно в центре объекта (в моем случае это TImage), необходимо после масштабирования установить свойство Align = TAlignLayout.Center, причем до этого нужно установить его в TAlignLayout.None !
      Примерно вот так:
        Image1.Scale.X:= 1.3;
        Image1.Scale.Y:= 1.3;
        Image1.Align:= TAlignLayout.None;
        Image1.Align:= TAlignLayout.Center;
      В этом случае будет эффект увеличения объекта из центра. Если убрать строчку "Image1.Align:= TAlignLayout.None;" - увеличение будет из левого верхнего угла. На мой взгляд некорректное поведение платформы. Возможно в будущих релизах это поправят.
      Embarcadero® Delphi 10.1 Berlin Update 2 Version 24.0.25048.9432  
    • Автор: Вячеслав
      Всем добрый день. Как правильно переопределить родителя для аниматора и тем самым использовать один аниматор для нескольких объектов?
      Пытаюсь реализовать следующий принцип: на форме несколько прямоугольников и один аниматор. При клике по конкретному прямоугольнику он начинает менять координату. Вот чаcть кода:
      procedure TForm2.MoveRect(Rect: TRectangle); begin //задаем родителя для аниматора Rect.AddObject(AniMoveRect); //Анимируем координату Y прямоугольника AniMoveRect.PropertyName:='Position.Y'; AniMoveRect.Inverse:=False; AniMoveRect.StopValue:=0; AniMoveRect.Start; end; procedure TForm2.RectangleClick(Sender: TObject); begin MoveRect(Sender as TRectangle); end; В итоге анимируется только один прямоугольник - тот, на который кликнули в первый раз. Не могу понять, в чем проблема.
      Данную тему читал, но в ней, насколько я понял, речь идет об одновременном использовании аниматора для двух объектов. 
      AniRects.zip
    • Автор: Garrincha
      Доброго времени суток.
      Требовалось в мой проект добавить немного анимации чтобы пользователи не скучали. По такому случаю решил использовать TFloatAnimation FireMonkey т.к. все говорили что это просто и очень красиво получается. Но возникла проблема с количеством кадров в секунду.
      Приведу конкретный пример.
      Нужно на OnMouseEnter чтобы кнопка увеличивалась по высоте в 2 раза (с 25 до 50). Так вот, если на свойство Height повесить TFloatAnimation то за 0,5 секунды картинка обновится
      на компе Celeron 2,2GHz 2Гб ОЗУ всего 2-3 раза 
      на компе Intel i3 2,53Ghz 4 Гб ОЗУ быстрее где-то раза в 3, но все равно не так плавно как хотелось бы.
      Но если я по-старинке напишу такой код на OnMouseEnter
      while but.Height < 50 do begin     but.Height := but.Height + 1;     Application.ProcessMessages;     sleep(5);   end; И аналогичное на OnMouseLeave то даже на первом менее мощном компьютере все очень быстро и красиво отрабатывает. Просто супер как отрабатывает.
      Это нормально для FireMonkey? Неужели все программируют под хорошие, относительно мощные компьютеры, а на старом железе нормальную анимацию на FireMonkey не написать?
      Все видео что я видел в интернете про анимацию в FireMonkey отличное, анимация правда хорошая. Это меня удивляет.
      Нигде не нашел информацию о том на какою дельту изменяется свойство объекта в TFloatAnimation и как определяется задержка между кадрами. Может при установке RAD?
      Может кто-то сталкивался и такой проблемой и решил ее?
       
      Заранее благодарен.
       
    • Автор: estra

       
      Редактирую стиль, добавляю к нему компонент TImage и для свойства RotateAngle создаю FloatAnimation (параметры анимации на скрине). Но при запуске никакой анимации нет. Почему? И как все же добиться работоспособности анимации для элемента стиля?
    • Автор: Вячеслав
      Добрый день! Хочу заанимировать Lable таким образом, чтобы параметр Scale.X линейно увеличивался. Но при этом необходимо, чтобы центр компонента оставался на своем месте. А параметр Scale.X за начало отсчета принимает верхний левый угол лейбла. Есть ли возможность изменить центр масштабирования компонента? Я данную задачу уже решил путем добавления анимации смещения влево, но этот способ мне кажется топорным и неоптимальным.
    • Автор: antarey
      Придумал как реализовать эфект Анимация смены TabItem в TabControl , но есть вопрос - можно ли для двух объектов использовать один TFloatAnimation? или реализовывать через TTimer?
    • Автор: NesDmitrijj
      Здравствуйте!
       
      Как можно реализовать простой эффект плавного исчезновения текста (TLabel) с последующим его плавным появлением без глюков?
      Пример:
      Кидаю на форму Label Создаю FloatAnimation для свойства Opacity У FloatAnimation делаю StartValue = 1, StopValue = 0 Кидаю на форму кнопку и в OnClick пишу: FloatAnimation1.Start;
      Результат: При нажатии кнопки текст плавно исчезает и по завершению анимации текста не видно. У FloatAnimation делаю AutoReverse = true; Результат: При нажатии кнопки текст плавно исчезает, а затем плавно появляется. По завершению анимации текст виден. Но при повторном нажатии всё начинает глючить.
       
      Вопрос: как исправить?
    • Автор: Egorius
      Как запустить анимацию с кнопки для другого компонента?

      К примеру с Button  кликом запустить анимация для вызова например анимированного объекта Panel?
    • Автор: krapotkin
      TFloatAnimation использует ProcessMessages 
       
      Это чревато возникновением всяких событий, и даже закрытию формы во время анимации, что приводит к AV
      очень хочется иметь Repaint без ProcessMessages.
      Это возможно?
    • Автор: 97mik
      Как сделать эффект вспышки? То есть чтобы например Panel переходила из Opasity=0 в Opasity=1 и потом обратно, за 500мс..
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу