Евгений Корепов

Пользователи
  • Публикаций

    575
  • Зарегистрирован

  • Посещение

  • Победитель дней

    62

Весь контент Евгений Корепов

  1. Намучавшись с не работающим FilterChar и кучей способов ввода по маске, сделал свой способ. По моему мнению самый простой. Код позволяет вводить только числа, включая дробные и отрицательные. procedure TFormMain.Edit1ChangeTracking(Sender: TObject); Var FEdit : TEdit; FFloat : Single; begin If Not (Sender is TEdit) Then // Защитимся от не выспавшегося самого себя Exit; FEdit:=(Sender as TEdit); // Для удобства... FEdit.Text:=FEdit.Text.Replace(' ',''); // Убираем случайные пробелы if FEdit.Text.IsEmpty then // Если пусто (ничего не введено или все удалено), ничего не делаем Exit; FEdit.Text:=FEdit.Text.Replace('.',','); // Заменяйм точку запятой if FEdit.Text.Equals(',') then // Если введен разделитель, добавляем перед ним ноль для красоты (не обязательно) begin FEdit.Text:='0,'; FEdit.CaretPosition:=FEdit.CaretPosition+1; // без этого курсор останется между нулём и запятой end; if FEdit.Text.Equals('-') then // Если введен только минус, не пытамся его драконить Exit; if TryStrToFloat(FEdit.Text,FFloat) Then // Пробуем преобразовать в число FEdit.TagString:=FEdit.Text // Если удалось, сохраняем в временном хранилище Else FEdit.Text:=FEdit.TagString; // Если не удалось, восстанавливаем из временного хранилища end; В качестве временного хранилища использовано TagString, дабы не разводить глобальных переменных. Возможно понадобиться очистка временного хранилища при многократном использовании: procedure TFormMain.Edit1Enter(Sender: TObject); begin If Not (Sender is TEdit) Then Exit; (Sender as TEdit).TagString:=''; end; Буду рад услышать замечания и предложения.
  2. Евгений Корепов

    Ввод числа - самый простой способ фильтрации

    Хм, а можно подробнее? С наскока нагуглить ничего не удалось, а собственные знания у меня пока в зачаточном состоянии :-)
  3. Евгений Корепов

    Ввод числа - самый простой способ фильтрации

    Посмотрел на код и решил еще на пару строк сократить, совместил проверку на "пусто" и минус в одном условии procedure TFormMain.Edit1ChangeTracking(Sender: TObject); Var FEdit : TEdit; FFloat : Single; begin If Not (Sender is TEdit) Then // Защитимся от не выспавшегося самого себя Exit; FEdit:=(Sender as TEdit); // Для удобства... FEdit.Text:=FEdit.Text.Replace(' ',''); // Убираем случайные пробелы if (FEdit.Text.IsEmpty) or (FEdit.Text.Equals('-')) then // Если пусто (ничего не введено или все удалено) или только минус, ничего не делаем Exit; FEdit.Text:=FEdit.Text.Replace('.',','); // Заменяйм точку запятой if FEdit.Text.Equals(',') then // Если введен разделитель, добавляем перед ним ноль для красоты (не обязательно) begin FEdit.Text:='0,'; FEdit.CaretPosition:=FEdit.CaretPosition+1; // без этого курсор останется между нулём и запятой end; if TryStrToFloat(FEdit.Text,FFloat) Then // Пробуем преобразовать в число FEdit.TagString:=FEdit.Text // Если удалось, сохраняем в временном хранилище Else FEdit.Text:=FEdit.TagString; // Если не удалось, восстанавливаем из временного хранилища end;
  4. Евгений Корепов

    Delphi XE8 автозагрузка приложения в Android

    Т.е. средствами Delphi это не сделать? Только отдельный класс на java и морока с модификацией classes.dex? Я надеялся что мне поможет компонент турецкого коллеги http://brsatalay.blogspot.com.tr/2014/10/delphi-android-broadcast-receiver.html . По крайней мере с другими броадкастами он отлично справляется. А почему тогда получаю ошибку "В приложении Таком-то произошла ошибка"? Или это просто симптом отсутствия обработчика BOOT_COMPLETED?
  5. Евгений Корепов

    FilterChar в XE8 Update 1 на Андроид так и не работает?

    Ответ по Update1: Ответ по FilterChar
  6. Евгений Корепов

    FilterChar в XE8 Update 1 на Андроид так и не работает?

    Согласно http://edn.embarcadero.com/article/44358 проблему http://qc.embarcadero.com/wc/qcmain.aspx?d=122372 пофиксили. Но сейчас проверил - ничего не изменилось. FilterChar как не работал на андроиде, так и не работает. Или я туплю? Delphi XE8 с установленным Update 1? в окне About, раздел Installed Updates вообще должно писать что то? Или эмбаркадеро больше не утруждает себя такими мелочами?
  7. Евгений Корепов

    FilterChar в XE8 Update 1 на Андроид так и не работает?

    что то я суть потерял, какой поиск? ты о чем? Когда накатывается Update1, он просто заменяет файлы в папке "Embarcadero\Studio\16.0", старому файлу добавляется расширение "bak". К примеру в папке "Embarcadero\Studio\16.0\source\rtl\common" новый файл System.RegularExpressionsAPI.pas, старый соответственно System.RegularExpressionsAPI.pas.bak.
  8. Евгений Корепов

    FilterChar в XE8 Update 1 на Андроид так и не работает?

    Сейчас сделал поиск по файлам "*.bak", и единственное что изменил Update1 для Андроид, это System.RegularExpressionsAPI в "Embarcadero\Studio\16.0\lib\android" и "Embarcadero\Studio\16.0\source\rtl\common". Все, остальной список изменений остался виртуальным. Я что то делаю не так?
  9. Евгений Корепов

    FilterChar в XE8 Update 1 на Андроид так и не работает?

    Именно на Андроид? На каких версиях и устройствах? У меня на Samsung GT-I9100 (4.1.2) и HTC One M7 (5.0.2) не работает. P.S. Устал уже, вместо создания приложений, бороться с глюками среды. Большая часть времени уходит на костылинг :-(
  10. Евгений Корепов

    FilterChar в XE8 Update 1 на Андроид так и не работает?

    у меня написано update 1 Хм, странно. У меня пишет "No Updates Installed". А повторная попытка установки "delphicbuilder_xe8_update1_general.exe" выдаёт "All files successfully updated. Press "Finish" to exit the installer."
  11. Евгений Корепов

    Обновление Update1 Delphi XE8

    Подскажите Delphi XE8 с установленным Update 1, в окне About, раздел Installed Updates вообще должно писать что то? А то не обнаруживаю у себя обещанных исправлений этого обновления :-(
  12. Евгений Корепов

    Обновление Update1 Delphi XE8

    Огласите ценник в рублях
  13. Наступил на грабли, может кому поможет информация. Следующий код перехватывает в Windows глобальный фокус рабочего стола в не зависимости от состояния окна. Т.е. Если окно активно, свернуто, скрыто, скрыто из панели задач (в моём случае висело в системном трее), то фокус перехватывается 100%. Особенно много гневных отзывов получил от клиентов играющих в игрушки - выбрасывало из игры на рабочий стол ;-) Application.Title:='trololo'; FormMain.Caption:='trololo'; FormMain.Border.StyleChanged; Досконально разбираться было некогда, основной подозреваемый - "FormMain.Border.StyleChanged;"
  14. Евгений Корепов

    TetheringManager

    Вы используете два вложенных цикла с непредсказуемым временем выполнения - этим и замораживаете приложение. Попробуйте к примеру Application.ProcessMessages внутри циклов. И TetheringAppProfile1 отправляет в отдельном потоке, он здесь не при чём.
  15. Евгений Корепов

    Сообщения чата в виде сообщений в iphone.

    Для одного проекта писал такое пару месяцев назад, пользуйтесь.Под windows, при клике на сообщение, оно превращается в readonly TMemo - дабы можно было скопировать нужное из сообщения. При наличии URL в сообщении, сбоку появляется кнопка открыть - лучше ничего для открытия ссылок не придумал. Надо бы сделать диалог выбора для открытия одной из нескольких ссылок, но руки пока не доходят. Пощупать чат вживую можно в приложении https://play.google.com/store/apps/details?id=ru.flintnet.InternetAgent , для активации и загрузки примера чата отсканируйте приложением qr-код с страницы http://internetagent.flintnet.ru/ unit ChatBox; interface uses System.SysUtils, System.Classes, FMX.Types, FMX.Controls, FMX.Layouts,System.Types, FMX.StdCtrls,FMX.Edit,FMX.Memo,FMX.TextLayout,System.UITypes,FMX.Graphics,FMX.Objects, FMX.Effects,FMX.Styles.Objects; type TMessagePos = (msgLeft,msgRight); TEventText = procedure(PURL: String) of object; TChatBox = class(TVertScrollBox) private FTextLyout : TTextLayout; FLastMessageId : Integer; FMsgWidthPercentage : Integer; FOnURLButtonClick : TEventText; FCalloutLength : Single; FCalloutXRadius : Single; FCalloutYRadius : Single; FMessageFontSize : Single; FMemo : TMemo; procedure ButtonClick(Sender: TObject); procedure MyMsgContainerOnClick(Sender: TObject); procedure MyMsgContainerOnExit(Sender: TObject); function FCreateMsgBlock(AOwner: TComponent; PMessageId : Integer; PDate, PAutor, PMessage : String; PMessagePos : TMessagePos) : TLayout; function CalculateTextItemHeight(Sender: TObject) : Single; procedure LayoutResize(Sender: TObject); function ExtractURL(pString : String) : String; procedure Memo1ApplyStyleLookup(Sender: TObject); public property LastMessageId : Integer read FLastMessageId; property MsgWidthPercentage : Integer read FMsgWidthPercentage write FMsgWidthPercentage default 80; constructor Create(AOwner: TComponent); override; destructor Destroy; override; Procedure AddMessage(pMessageId : Integer; PDate, PAutor, PMessage : String; PMessagePos : TMessagePos); procedure ClearChildren(AChatBox: TChatBox); procedure ScrollBottomSmoothly; procedure ScrollBottom; published property OnURLButtonClick : TEventText read FonURLButtonClick write FonURLButtonClick; property CalloutLength : Single read FCalloutLength write FCalloutLength; property CalloutXRadius : Single read FCalloutXRadius write FCalloutXRadius; property CalloutYRadius : Single read FCalloutYRadius write FCalloutYRadius; property MessageFontSize : Single read FMessageFontSize write FMessageFontSize; end; TOpenChatBox = class(TChatBox); Procedure Register; implementation procedure Register; begin RegisterComponents('EKorepov', [TChatBox]); end; constructor TChatBox.Create(AOwner: TComponent); begin inherited create(Aowner); FLastMessageId:=-1; FTextLyout := TTextLayoutManager.DefaultTextLayout.Create; FMemo:=TMemo.Create(Aowner); FMemo.TextSettings.WordWrap:=True; FMemo.ReadOnly:=True; FMemo.Align:=TAlignLayout.Client; FMemo.OnExit:=MyMsgContainerOnExit; FMemo.OnApplyStyleLookup:=Memo1ApplyStyleLookup; FMemo.StyledSettings:=FMemo.StyledSettings-[TStyledSetting.Size]; With Self as TVertScrollBox do begin AniCalculations.Animation := True; AniCalculations.BoundsAnimation := True; AniCalculations.TouchTracking := [ttVertical]; end; end; destructor TChatBox.Destroy; begin FreeAndNil(FMemo); FreeAndNil(FTextLyout); inherited Destroy; end; procedure TChatBox.ScrollBottomSmoothly; begin AniCalculations.MouseWheel(0, ContentBounds.Height+5); end; procedure TChatBox.ScrollBottom; begin ScrollBy(0, -ContentBounds.Height); end; procedure TChatBox.ButtonClick(Sender: TObject); Var URL : String; begin URL:=TButton(Sender).HelpKeyword; if Assigned(FonURLButtonClick) then FonURLButtonClick(URL); end; procedure TChatBox.Memo1ApplyStyleLookup(Sender: TObject); begin end; procedure TChatBox.MyMsgContainerOnClick(Sender: TObject); begin FMemo.TextSettings:=TLabel(Sender).TextSettings; FMemo.Lines.Text:=TLabel(Sender).Text; TLabel(Sender).AddObject(FMemo); end; procedure TChatBox.MyMsgContainerOnExit(Sender: TObject); begin if (Sender is TMemo) then if Assigned(TMemo(Sender).Parent) then if (TMemo(Sender).Parent is TLabel) then TLabel(TMemo(Sender).Parent).RemoveObject(TMemo(Sender)); end; procedure TChatBox.ClearChildren(AChatBox: TChatBox); begin Assert(AChatBox <> nil); TOpenChatBox(AChatBox).Content.DeleteChildren; AChatBox.Repaint; end; function TChatBox.CalculateTextItemHeight(Sender: TObject) : Single; var Item: TLabel; begin Result:=0; if (Sender is TLabel) then begin Item := TLabel(Sender); FTextLyout.BeginUpdate; try FTextLyout.Text := Item.Text; FTextLyout.MaxSize := TPointF.Create(Item.Width-Item.Margins.Left-Item.Margins.Right-10, 1000); FTextLyout.Font := Item.Font; FTextLyout.WordWrap:= Item.WordWrap; FTextLyout.HorizontalAlign:= Item.TextSettings.HorzAlign; FTextLyout.VerticalAlign:= Item.TextSettings.VertAlign; finally FTextLyout.EndUpdate; end; Result:= FTextLyout.Height+10; end; end; procedure TChatBox.LayoutResize(Sender: TObject); Var Item : TLabel; CalloutRectangle : TCalloutRectangle; Layout : TLayout; I : Integer; begin Layout:=TLayout(Sender); for I := 0 to Layout.Children.Count-1 do begin If Layout.Children.Items[I] is TCalloutRectangle Then begin CalloutRectangle:=TCalloutRectangle(Layout.Children.Items[I]); Item:=TLabel(CalloutRectangle.Children.Items[0]); CalloutRectangle.Width:=(Layout.Width / 100) * FMsgWidthPercentage; Layout.Height:=CalculateTextItemHeight(Item); end; If Layout.Children.Items[I] is TButton Then begin TButton(Layout.Children.Items[I]).Width:=(Layout.Width / 100) * (100-FMsgWidthPercentage-5); end; end; end; Procedure TChatBox.AddMessage(pMessageId : Integer; PDate, PAutor, PMessage : String; PMessagePos : TMessagePos); Var lcLayout : TLayout; begin PDate:=Trim(PDate); PAutor:=Trim(PAutor); PMessage:=Trim(PMessage); FLastMessageId:=PMessageId; lcLayout:=FCreateMsgBlock((Self as TVertScrollBox), PMessageId, PDate, PAutor, PMessage, PMessagePos); Self.AddObject(lcLayout); end; function TChatBox.FCreateMsgBlock(AOwner: TComponent; PMessageId : Integer; PDate, PAutor, PMessage : String; PMessagePos : TMessagePos) : TLayout; Var lcLayout,lcLayout2 : TLayout; Item : TLabel; Button : TButton; CalloutRectangle : TCalloutRectangle; lcHeight : Single; URL : String; begin lcLayout:=TLayout.Create(AOwner); lcLayout.Tag:=pMessageId; lcLayout.Align:=TAlignLayout.Top; lcLayout.Width:=200; lcLayout.Position.X:=0; lcLayout.Position.Y:= ((AOwner as TVertScrollBox).ContentBounds.Height+10); lcLayout.Margins.Bottom:=10; CalloutRectangle:=TCalloutRectangle.Create(lcLayout); CalloutRectangle.XRadius:=FCalloutXRadius; CalloutRectangle.YRadius:=FCalloutYRadius; CalloutRectangle.CalloutWidth:=10; CalloutRectangle.CalloutOffset:=-3-FCalloutYRadius-CalloutRectangle.CalloutWidth; CalloutRectangle.Width:=((AOwner as TVertScrollBox).Width / 100) * FMsgWidthPercentage; CalloutRectangle.HitTest:=False; case PMessagePos of msgRight : begin CalloutRectangle.Align:=TAlignLayout.Right; CalloutRectangle.CalloutPosition:=TCalloutPosition.Right; CalloutRectangle.Padding.Right:=CalloutRectangle.CalloutLength+CalloutRectangle.XRadius; CalloutRectangle.Padding.Left:=CalloutRectangle.XRadius; end; msgLeft : begin CalloutRectangle.Align:=TAlignLayout.Left; CalloutRectangle.CalloutPosition:=TCalloutPosition.Left; CalloutRectangle.Padding.Left:=CalloutRectangle.CalloutLength+CalloutRectangle.XRadius; CalloutRectangle.Padding.Right:=CalloutRectangle.XRadius; end; end; CalloutRectangle.Padding.Top:=1; CalloutRectangle.Padding.Bottom:=1; lcLayout.AddObject(CalloutRectangle); Item:=TLabel.Create(CalloutRectangle); Item.TextSettings.Font.Size:=MessageFontSize; CalloutRectangle.AddObject(Item); Item.Align:=TAlignLayout.Client; {$IFDEF MSWINDOWS} Item.OnClick:=MyMsgContainerOnClick; {$ENDIF MSWINDOWS} Item.Text:=PDate+' '+PAutor+#10+PMessage; Item.HitTest:=True; Item.WordWrap:=True; lcHeight:=CalculateTextItemHeight(Item); lcLayout.Height:=lcHeight; URL:=ExtractURL(pMessage); Item.StyledSettings:=Item.StyledSettings- [TStyledSetting.Size,TStyledSetting.Style]; if Not URL.IsEmpty then begin lcLayout2:=TLayout.Create(lcLayout); lcLayout2.Align:=TAlignLayout.Client; lcLayout2.Margins.Left:=5; lcLayout2.Margins.Right:=5; lcLayout.AddObject(lcLayout2); Button:=TButton.Create(lcLayout2); Button.Text:='Открыть'; Button.Align:=TAlignLayout.Center; Button.HelpKeyword:=URL; Button.OnClick:=ButtonClick; lcLayout2.AddObject(Button); end; lcLayout.OnResize:=LayoutResize; Result:=lcLayout; end; function TChatBox.ExtractURL(pString : String) : String; Var S : String; begin Result:=''; if Not pString.Contains('http') then Exit; S:=pString.Substring(Pos('http',pString)-1); S:=S.Remove(S.IndexOfAny([' ',','])); Result:=S.TrimRight(['.']); end; end.
  16. Евгений Корепов

    TServerSocket TClientSocket в FireMonkey

    Как то так? Var mes : TIdBytes; begin SetLength(mes,3); mes[0] = 0x0A; mes[1] = 0x23; mes[2] = 0xBC; ifTCPClient.Connect(IP,Port); if ifTCPClient.Connected Then idTCPClient.IOHandler.Write(mes,Length(mes)); ... Код "mes[0] = 0x0A;" не стал менять для наглядности, а TIdBytes = array of Byte;
  17. Евгений Корепов

    Обновление Update1 Delphi XE8

    Багов хватает, полностью согласен. Последней версии без багов была Delphi7 наверное ;-) Но кроме исправления багов в новых версиях, есть и новые фичи. Кстати было бы не плохо, если бы Embarcadero платила за багрепорты символические деньги, список исправлений Update1 просто смехотворный. За последние пару месяцев, только мой личный список исправления исходного кода близок к десятку. Но писать багрепорты лениво и к тому же тоскливо - хостинг Embarcadero, по старой силиконовой традиции, располагается на арифмометре устаревшей модели в гараже одного из владельцев. Загрузка страниц по несколько минут это жесть (интернет канал у меня 800 мегабит).
  18. Евгений Корепов

    Обновление Update1 Delphi XE8

    А мне принцип подписки нравится. Да и цены не такие уж большие. Не забывайте что скорость и эффективность разработки выше на порядок, чем у большинства инструментов. Я в этом году потратил чуть больше тысячи долларов на обновления, наконец то купил Mobile Addon (давно хотелось попробовать мобильные платформы освоить). Результат не заставил себя ждать - только одно приложение под андроид, на которое я потратил 2 недели не рабочего времени (около 50 часов), приносит сейчас около $10 ежедневно. За месяц 25% затрат отбил. По скорости и эффективности приведу яркий пример - коллеги пишут приложение на java уже больше 10 лет (вдумайтесь в эти цифры), результат вот http://www.netup.ru/UTM5/utm5_tray.php . Довольно убогий, скажу прямо, результат. Полтора месяца, потраченные мной на написание того же инструмента, выглядят так http://www.netup.ru/phpbb/viewtopic.php?t=9846 К тому же Embarcadeo довольно милая контора. К моей лояльности добавилось 500 пунктов после того как купил обновление с XE5 на XE7 за неделю до выхода XE8, а 30 апреля этого года получил приятный сюрприз: Your purchase of RAD Studio, Delphi or C++Builder XE7 earlier this year qualified you for a free XE8 license. YOUR FREE XE8 LICENSE IS ONLY AVAILABLE UNTIL APRIL 30, 2015. DOWNLOAD YOUR LICENSE TODAY! Вот еще бы компилятор под никсы, тогда счастью моему не будет предела, да и деньгам тоже ;-)
  19. Евгений Корепов

    TIdTCPClient не работает на Android 4.1

    Delphi XE8 Столкнулся с странным глюком. TCPClient.IOHandler.Write(SendBuffer,SendBufferLength) ничего не отсылает при запуске на Android 4.1. На Android 5 этот же самый код работает нормально. Трассировка показала что на Android 5 выполнение приводит к TIdStackBSDBase.WSSend(ASocket: TIdStackSocketHandle; const ABuffer; const ABufferLength, AFlags: Integer): Integer; virtual; abstract; а на Android 4.1 к TIdStackVCLPosix.WSSend(ASocket: TIdStackSocketHandle; const ABuffer; const ABufferLength, AFlags: Integer): Integer; Во втором случае снифер не обнаруживает никакой сетевой активности от приложения, хотя процедура вроде как выполняется и исключений не возбуждает. Кто нибудь сталкивался с такой проблемой?
  20. Евгений Корепов

    Хранения набора данных

    Если структура JSON не меняется, то можно так: TUserData = record ID : Integer; VNAME : String; VPASSWORD : String; ... end; TUserDataArray = TArray<TUserData>; И написать функции добавления, удаления, поиска и еще чего надо, для массива это по паре строк кода на функцию. Можно это все в отдельный класс завернуть. Я обычно так поступаю для временного хранения и обработки данных разумных размеров. Быстро, удобно и не надо тащить в приложение мегабайты кода дополнительных компонентов.
  21. Евгений Корепов

    Реклама Appodeal интеграция с Delphi

    Набрел на хабре на интересную статью о новом сервисе Appodeal (Внимание! Ссылка реферальная, вам все равно, а мне приятно ;-) ). Если крато, то это агрегатор/оптимизатор рекламы в мобильных приложениях, с гибкими выплатами на Яндекс.Деньги, WebMoney и т.п. Но SDK только Java. Самостоятельно интеграцию не осилю. А их заинтересовать в создании компонентов для Delphi в одиночку не могу. Если кому интересно, пните их вопросом о интеграции с Delphi, или напишите ее сами ;-) Готов даже заплатить разумную сумму за готовый компонент. P.S. Не сочтите за рекламу, к Appodeal никакого отношения не имею.
  22. Евгений Корепов

    Ошибка в FMX.Graphics.Android

    [Delphi XE8, Android] Ошибка в Studio\16.0\source\fmx\FMX.Graphics.Android.pas и соответственно в Studio\16.0\lib\android\release\FMX.Graphics.Android.o и Studio\16.0\lib\android\debug\FMX.Graphics.Android.o Строка 258 function GetTmpFileName: String; Выглядит так: function GetTmpFileName: String; begin Result := TPath.GetTempPath + 'TmpBitmapStream' end; Подозреваю что выглядеть должна вот так: function GetTmpFileName: String; begin Result := TPath.Combine(TPath.GetTempPath, 'TmpBitmapStream'); end; Из за этой ошибки временный файл создается не в '/storage/emulated/0/Android/data/<application ID>/files/tmp' (TPath.GetTempPath), а в '/storage/emulated/0/Android/data/<application ID>/files' (TPath.GetSharedDocumentsPath).
  23. Евгений Корепов

    Ошибка в FMX.Graphics.Android

    Так с TPath.GetCachePath работает без разрешения на чтение/запись внешнего хранилища? Или все таки глючит? P.S. Зачем вообще сохранять эту картинку? Ради этого глюка приходится давать лишние разрешения приложению и терять параноидальную часть аудитории :-( Вот кстати и картинка:
  24. Евгений Корепов

    Ошибка в FMX.Graphics.Android

    TPath.Combine (http://docwiki.embarcadero.com/Libraries/XE8/en/System.IOUtils.TPath.Combine) как раз этим и занимается в моем исправлении. В первом варианте не я определяю такой путь сохранения файла, а программисты Embarcadero.
  25. Евгений Корепов

    TTetheringManager EIdSocketError

    Delphi XE8, Android. Не могу перехватить исключение при попытке активировать TTetheringManager, при отладке появляется EIdSocketError "Socket Error #101 Network is unreachable". Если игнорировать или запускать приложение отдельно - глухой висяк. Код простой: procedure TForm1.Button1Click(Sender: TObject); begin try TM.Enabled:=True; except on E : EIdSocketError do ShowMessage(E.Message) ; end; if TM.Enabled then TAP.Enabled:=True; end; Исключение не перехватывается. Возникает судя по всему уже в отдельном потоке и приводит к неработоспособности приложения при попытке запустить с выключенным wifi или интернетом. Конечно можно обвесить каждое телодвижение внешними проверками на наличие связи, но подозреваю есть путь проще. Буду благодарен за помощь