Перейти к содержанию
Fire Monkey от А до Я
  • 0

exception 0x00000124 или ошибка при закрытии модальной формы с показанной клавиатурой


Дениска

Вопрос

на OnClose формы делаем так: 

 
procedure TForm2.OnClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := TCloseAction.caFree;
end;
 
и освобождаем форму не Free, а DisposeOf:
 
Form2 := TForm2.Create(nil);
Form2.ShowModal;
Form2.DisposeOf;
Изменено пользователем Дениска
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

DisposeOf для уничтожаемой формы вроде должен нормально отрабатывать. Но в FMX не рекомендуют использовать ShowModal для мобильных платформ.

 

Из документации: We recommend that you not use modal dialogs on either of the mobile platforms (iOS and Android) because unexpected behavior can result. Not using modal dialogs eliminates potential problems in debugging and supporting your mobile apps.

Ссылка на комментарий
  • 0

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

Ссылка на комментарий
  • 0

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

haword, могу ошибаться, но вроде такое поведение относится только к Android.

На iOS в документации лишь не рекомендуют использовать из-за возможного некорректного возврата результата. Я выше выдержку приводил. Там же: Modal dialog boxes are not supported in Android apps. Instead of calling ShowModal, you should call Show, and have the form return and call your event. ...

Возможно я что-то еще упустил. Сам ShowModal по рекомендации не использую.

Ссылка на комментарий
  • 0

думаю так будет наиболее правильно делать везде. 

 

dlg.ShowModal(

procedure(ModalResult: TModalResult)

begin

// Do something.

end

 

Не думаю, что везде - это как-то категорично :-) В одном приложении win32 на XE7 вынужден был отказаться от такого вызова. Это с год назад было, плоховато помню подробности. Так что чтобы не ошибиться не буду подробности описывать. Но какое-то отличие в возврате в отличии от Android получалось. Проще было ветки по платформам разделить и на win использовать ShowModal();

Ссылка на комментарий
  • 0

попробуй заменить DisposeOf на Free

Для наследников TFMXObject на мобильных платформах метод Free не работает. Соответственно, не будет работать и FreeAndNil (в переменную запишется nil, но сам объект уничтожен не будет):

procedure TObject.Free;
begin
// under ARC, this method isn't actually called since the compiler translates
// the call to be a mere nil assignment to the instance variable, which then calls _InstClear
{$IFNDEF AUTOREFCOUNT}
  if Self <> nil then
    Destroy;
{$ENDIF}
end;

Остаются DisposeOf и Release, причем второй вариант правильнее, но бывают исключения, связанные с TCaret (не обязательно с показанной клавиатурой).

К примеру, с помощью Release можно легко удалить кнопку по нажатию на ней же. DisposeOf скорее всего вызовет AV.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...