Ошибка сегментации класса (11)
Пожалуйста, следуйте инструкциям ниже:
- Создать новый
Firemonkey Moblie Application
- добавлять
TGeustureManager
компонент к форме Добавить 2
TButton
компоненты к форме- Button1.Text: "Button1: сделать что-то..."
- Button2.Text: "Button2: выход из приложения..."
Дважды щелкните на 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;
- Запустите приложение в режиме отладки.
на устройстве нажмите кнопку 2, затем нажмите "да", чтобы появилось всплывающее сообщение. Появится исключение:
Почему возникает это исключение?
Я думал, что это связано с неиспользованным TGeustureManager
составная часть. но НЕТ, это НЕ
- Если вы откроете
Location
Демонстрационный проект, который поставляется с Delphi xe5. - добавлять
TButton
компонент кLocation
Пометьте, как показано на рисунке ниже: - Добавьте тот же код, что и выше,
OnClick
Событие. - Запустите приложение и нажмите на 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 в моем случае).
Что бы это ни стоило, проблема исчезла, когда я зашел в книгу стилей, которую я ранее надел на форму, и очистил ее. Я думаю, что ранее скопировал эту книгу стилей из другого тестового модуля.
Майк