Ошибка сегментации класса (11)

Пожалуйста, следуйте инструкциям ниже:

  1. Создать новый Firemonkey Moblie Application
  2. добавлять TGeustureManager компонент к форме
  3. Добавить 2 TButton компоненты к форме

    • Button1.Text: "Button1: сделать что-то..."
    • Button2.Text: "Button2: выход из приложения..."

    Приложение должно выглядеть так

  4. Дважды щелкните на Button2 Component и напишите следующий код для OnClick Событие:

    procedure TForm1.Button2Click(Sender: TObject);
    begin
      if MessageDlg('Are you sure you want to Exit?', TMsgDlgType.mtWarning,
              [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0) = mrYes then
        SharedActivity.finish;
    end;
    
  5. Запустите приложение в режиме отладки.
  6. на устройстве нажмите кнопку 2, затем нажмите "да", чтобы появилось всплывающее сообщение. Появится исключение:

Почему возникает это исключение?

Я думал, что это связано с неиспользованным TGeustureManager составная часть. но НЕТ, это НЕ

  1. Если вы откроете Location Демонстрационный проект, который поставляется с Delphi xe5.
  2. добавлять TButton компонент к Location Пометьте, как показано на рисунке ниже:
  3. Добавьте тот же код, что и выше, OnClick Событие.
  4. Запустите приложение и нажмите на Button5, вы получите то же исключение.

Это ошибка, я должен сообщить? или я что-то не так делаю?

5 ответов

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

Что произойдет, если вы замените:

SharedActivity.finish

с:

uses
  FMX.Helpers.Android;
...
CallOnUIThread(procedure begin SharedActivity.finish end);

[Напечатано из памяти, так что, возможно, потребуется немного настроить]

Я связался с Embarcadero по этому вопросу.

Они сказали, что это потому, что TApplication.Terminate еще не реализован в платформе FireMonkey для мобильных устройств.

Они открывают тикет для реализации TApplication.Terminate в nex hot fix.

Будем надеяться, что это не займет много времени.

Если вы хотите только закрыть приложение и можете попробовать это:

case MessageDlg('Close Application?', System.UITypes.TMsgDlgType.mtInformation,
    [
      System.UITypes.TMsgDlgBtn.mbYes,
      System.UITypes.TMsgDlgBtn.mbNo
    ], 0) of
    { Detect which button was pushed and show a different message }
    mrNo:
      showmessage('');
    mrYes:
      halt;
  end;

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

Delphi XE6, строка 681 в FMX.TextLayout.GPU

Я использую телефон Samsung S4.

procedure TForm_StayTogether.LocationSensor1LocationChanged(Sender: TObject;
  const OldLocation, NewLocation: TLocationCoord2D);
begin
  DistLabel.Text:= FloatToStr(LocationSensor1.Distance);
  AccLabel.Text:= FloatToStr(LocationSensor1.Accuracy);
  LatLabel.Text:= FloatToStr(NewLocation.Latitude);
  LonLabel.Text:= FloatToStr(NewLocation.Longitude);
end;

Я только что испытал нечто похожее, очень маленькое приложение с небольшим кодом, которое выдает ту же ошибку (ошибка сегментации 11) каждый раз, когда я закрываю приложение на устройстве Android (Galaxy Note 2 в моем случае).

Что бы это ни стоило, проблема исчезла, когда я зашел в книгу стилей, которую я ранее надел на форму, и очистил ее. Я думаю, что ранее скопировал эту книгу стилей из другого тестового модуля.

Майк

Другие вопросы по тегам