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

Raise убивает программу для Android


haword

Вопрос

например raise EArgumentOutOfRangeException.CreateRes(@SArgumentOutOfRange) полностью закрывает приложение на Android. Можно как ни будь отловить вообще любой вызов raise и не дать программе закрыться? 

До Application.OnException не доходит. 

Изменено пользователем haword
Ссылка на комментарий

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

  • 0

разработчики? кто ни будь что ни будь скажет по этому поводу? Можно же как то переписать FM что бы при ошибке не просто закрывалась программа а хотя бы в лог Android писала причину своего закрытия? Ибо под Win програма не закрывается а сообщает об ошибке. А под Android просто схлопывается и все. В отладке ошибки уперся в процедуру SignalConverter в System.Internal.ExcUtils после нее идет циклическая ошибка, я так понял сама процедура вызывает ошибку, вызывает саму себя и так по кругу в отладчике а потом схлопывается. 

 

На все остальные глюки FM можно было бы закрыть глаза если бы программы от ошибок не закрывались молча. 

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

На сколько я заметил, программа "схлопывается" молча тогда, когда ошибка возникает в момент когда ее нельзя отобразить на экране. Что мешает поместить блок в try finally/except?

Изменено пользователем xenon54
Ссылка на комментарий
  • 0

в том то и дело что возникла ошибка внутри компонента ListView, в XE7 происходит ошибка если крутнуть список в ListView и пока он едет что то ввести в поле фильтра SearchBox. То есть эту ситуацию не обработать try except, я пытался даже перехватить через Application.OnException но ошибка валит программу до того как туда что то перейдет. В этом то вся проблема. 

 

Да и почему ее нельзя отобразить на экране было? В контексте Application можно запросто вызвать ShowMessage. Говорю что ошибка происходит внутри самих процедур которые должны показать ошибку, идет рекурсивный вызов а потом схлопывается программа. 

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

В ХЕ8 это исправили. Я это исправление перенес в XE7.

 

Но в XE8 я уперся в другой баг, не с того не с сего подвисала форма. вешалась мертво ничего не сделать и процессор на планшете в 100% уходил. в XE7 тот же код работал НО иногда вываливал Access Violation причем ошибка то есть то нет. Но не подвисала форма со 100% загрузкой процессора. Под Вин все нормально было. Так что ждем-с XE8 SP1 :) и попробую заново. 

Ссылка на комментарий
  • 0
У кого убивается, а у кого висит черный экран ))) (XE7)

 

 

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

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

ничего  в XE8 не исправили, или не для всех
 

try

raise exception.create('bla-bla-bla');

exception

end;

вышибает программу. Но, опять же, не на всех устройствах. Xiaomi Redmi 3S валит, LG L50 - отрабатывает и едет дальше

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

У Эмбы есть описание подобной проблемы: http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Migrating_Delphi_Code_to_Mobile_from_Desktop, раздел Use a Function Call in a try-except Block to Prevent Uncaught Hardware Exceptions

условно говоря, код, который может вызвать аппаратное исключение, нужно вызывать из другой процедуры, и исключение ловить уже там. Это справедливо не только для iOS, но для андроида тоже.

пример:

procedure InternalG1;
begin 
  try
    // что то, приводящее к исключению
  except
    // здесь обработчик по факту игнорируется
  end;
end;

procedure G1;
begin
  try
    InternalG1;
  except
    // здесь обработчик корректно обработает исключение
  end;
end;

А вообще у Grijjy team есть хорошая библиотека обработки необработанных исключений для андроида и иоса.

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

Просто возьмите это под свой контроль - не используйте встроенный SearchBox, а создайте отдельное поле TEdit, а фильтрацию обрабатывайте руками.

  TListViewFilterEx = record
    Category : String;
    Name : String;
    Cart : String;
  end;

procedure TFormMain.SearchBoxChangeTracking(Sender: TObject);
begin
  Setting.Filter.Name:=SearchBox.Text;
  ListViewFilterEx(ListViewAction, Setting.Filter);
  LoadVisibleListViewItem(ListViewAction);
end;

procedure TFormMain.ListViewFilterEx(AListView : TListView; AFilter : TListViewFilterEx);
begin
  AListView.Items.FilterEx:=
    function(X: TListItem): Boolean
    begin
      Result:=
        (AFilter.Category.IsEmpty or TListViewItem(X).Data['Category'].AsString.ToLower.Contains(AFilter.Category.ToLower)) And
         ((AFilter.Name.IsEmpty or TListViewItem(X).Data['Name'].AsString.ToLower.Contains(AFilter.Name.ToLower)) or
         (AFilter.Name.IsEmpty or TListViewItem(X).Data['Detail'].AsString.ToLower.Contains(AFilter.Name.ToLower)));
    end;
end;

procedure TFormMain.LoadVisibleListViewItem(const AListView : TListView; ATopItemIndex : Integer = -1);
Var LTopItemIndex, I : Integer;
begin
  if Setting.Flags.ListViewActionLoaded then
  begin
    if ATopItemIndex=-1 then
      LTopItemIndex:=GetListViewTopItemIndex(AListView)
    else
      LTopItemIndex:=ATopItemIndex;
    for I := LTopItemIndex to LTopItemIndex + LoadVisibleListViewItemCount do
      if I<=AListView.ItemCount-1 then
      begin
        AListView.Adapter.ResetView(AListView.Items.Item[I]);
      end;
  end;
end;

Суффикс Ex в AListView.Items.FilterEx игнорируйте, используйте AListView.Items.Filter. Это я для нормального поиска (по всем полям и Data, а не только по Text) переписывал исходники ListView...

С таким кодом возможно у вас будет больше возможностей для перехвата исключения. Ну или игнорирования поиска пока работает скролл ListView.

Изменено пользователем Евгений Корепов
Ссылка на комментарий

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

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

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

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

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

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

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

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

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...