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

[Android] Планшеты близнецы - разные проблемы


Rusland

Вопрос

Есть два планшета Lenovo Tab 2 A7-30DC (назовем их A и Б). Есть написанная на Berlin программа с MapView.

По умолчанию у обоих стояла ОС Android 4.4.2. На A я обновил операционку до максимальной официальной версии 5.0.1, на Б оставил 4.4.2

На Б программа худо-бедно работает, но на MapView не показывает синюю точку - текущее местоположение (сторонние программы GPS Status, Яндекс Навигатор GPS координаты ловят нормально). Пробовал компилировать на Seattle - тоже самое. LocationSensor сначала неправильно показал координаты, ошибся на 300км, но после перезапуска программы стал показывать правильно. Почему MapView не показывает, не понимаю.

На А программа зависает при попытке поставить метку на MapView или нарисовать маршрут получаю Segmentation fault.

Вот, например:

procedure TFrmMain.SetMarkerOnMap(Id:integer;NaimObj,AdrObj:String;Lat,Lon:Double);
var
  Descrip: TMapMarkerDescriptor;
  MyLocation: TMapCoordinate;
begin 
  TThread.Queue(TThread.CurrentThread, procedure
  begin
    try
      if (MapView.Visible) then
      begin
        MyLocation:=TMapCoordinate.Create(Lat,Lon);
        Descrip:=TMapMarkerDescriptor.Create(MyLocation);
        Descrip.Icon:=ImObjBlueMarker.Bitmap;
        Descrip.Draggable:=False;
        Descrip.Title:=NaimObj;
        Descrip.Snippet:='['+Id.ToString+'] ';
        if (AdrObj<>'') then Descrip.Snippet:=Descrip.Snippet+AdrObj;
        MyMarker:=MapView.AddMarker(Descrip); // тут Segmentation fault
        LMarkers.Add(MyMarker);
      end; 
    except
    end;
  end);
end;

Как решить проблему?

 

 

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

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

  • 0

Решилась проблема на планшете Б - в настроках Местоположение -> Режим определения нужно было выставить Максимальная точность (а было Только по GPS). 

Осталось определить почему зависает планшет А. Есть какие-нибудь идеи?

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

Вот код постройки маршрута

procedure TFrmMain.MakeRoute(ALat,ALon,BLat,BLon:Double; ObjectName:String); // построение маршрута
var
  MC: TMapCoordinate;
begin
{$IFDEF ANDROID}
  TTask.Run(
    procedure
    begin
      mEnginel.SetOptionsGoogleDistance('AIz...IJg'); 
      mEnginel.GoogleDistance(TMapCoordinate.Create(ALat,ALon),
        TMapCoordinate.Create(BLat,BLon), mRoutePoints, mRouteInfo); 

      TThread.Synchronize(TThread.CurrentThread, 
        procedure
        var
          RoutePoints: TMapPolylineDescriptor;
        begin
          if Assigned(mPolyLine) then
            mPolyLine.Remove; // выдает Invalid class typecast

          ToastMsg('Маршрут проложен '+ObjectName+#13#10#13#10+
               '    Расстояние: ' + mRouteInfo.DistanceAsString +#13#10+
               '    Расчетное время: ' + mRouteInfo.DurationAsString);

          // рисуем маршрут
          RoutePoints := TMapPolylineDescriptor.Create(mRoutePoints);
          RoutePoints.StrokeWidth:=6;
          RoutePoints.StrokeColor:=TAlphaColorRec.Red;
          mPolyLine := MapView.AddPolyline(RoutePoints);
        end);
    end);
{$ENDIF}
end;

 

 

У меня подозрение, что ошибка происходит при обращении внутри конструкции

  TTask.Run(
    procedure
    begin

      TThread.Synchronize(TThread.CurrentThread, 
        procedure
        begin
          // тут
        end);
    end);

к глобальным переменным.
 

mPolyLine:   TMapPolyline;
MyMarker: TMapMarker;
LMarkers: TList<TMapMarker>;

это все глобальные переменные.

 

Что я делаю не так?

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

а зачем такая сложная конструкция

я делаю старорежимно

procedure TMyThread.execute();
begin
  вызов долгой операции
end;
..
th:=TMyThreadCreate(...);
th.OnTerminate:=AfterTerminate;
th.Start;
...
procedure TFrom1.AfterTerminate(...);
begin
  тут все происходит в главном потоке
end;

интуитивно вроде одно и то же, но тут мне кажется сильно понятнее

Ссылка на комментарий
  • 0
11 час назад, zairkz сказал:

Попробуй вынести до потока


if Assigned(mPolyLine) then
            mPolyLine.Remove; // выдает Invalid class typecast

Вынес из потока 

  if Assigned(mPolyLine) then
    mPolyLine.Remove; 
{$IFDEF ANDROID}
  TTask.Run(
    procedure
    begin
      mEnginel.SetOptionsGoogleDistance('AIz...Jg');
      mEnginel.GoogleDistance(TMapCoordinate.Create(ALat,ALon),
        TMapCoordinate.Create(BLat,BLon), mRoutePoints, mRouteInfo); // построение маршрута

      TThread.Synchronize(TThread.CurrentThread,
        procedure
        var
          RoutePoints: TMapPolylineDescriptor;
          mPolyLineTmp:   TMapPolyline;
        begin

          ToastMsg('Маршрут проложен '+ObjectName+#13#10#13#10+
               '    Расстояние: ' + mRouteInfo.DistanceAsString +#13#10+
               '    Расчетное время: ' + mRouteInfo.DurationAsString);

          // рисуем маршрут
          RoutePoints:=TMapPolylineDescriptor.Create(mRoutePoints);
          RoutePoints.StrokeWidth:=6; 
          RoutePoints.StrokeColor:=TAlphaColorRec.Indigo; 
          mPolyLineTmp:=MapView.AddPolyline(RoutePoints); 
          mPolyLine:=mPolyLineTmp; // ошибка перешла сюда

        end);
    end);
{$ENDIF}

mPolyLine в паблик секции

  public
    { Public declarations }
    mPolyLine:   TMapPolyline;

Почему при записи в глобальную переменную происходит ошибка?

 

 

12 часа назад, krapotkin сказал:

а зачем такая сложная конструкция

я делаю старорежимно


procedure TMyThread.execute();
begin
  вызов долгой операции
end;
..
th:=TMyThreadCreate(...);
th.OnTerminate:=AfterTerminate;
th.Start;
...
procedure TFrom1.AfterTerminate(...);
begin
  тут все происходит в главном потоке
end;

интуитивно вроде одно и то же, но тут мне кажется сильно понятнее

krapotkin, при старорежимной конструкции можно ли будет записывать в глобальную переменную? Вы пробовали?

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

так я же говорю, OnTerminate выполняется в главном потоке. Все что нужно писать в картинки, переменные и т.д., можно делать там

синхронизация получается автоматическая

Ссылка на комментарий
  • 0
  • Модераторы
2 часа назад, haword сказал:

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

это миллион раз обсуждалось, привет хелперам

15 часов назад, krapotkin сказал:

а зачем такая сложная конструкция

это разве сложная?

я очень активно использую TTask.Run, на всех платформах работает отлично (правда дебага нет в потоке)

2016-06-16_16-25-16.png

 

Ссылка на комментарий
  • 0
16 минут назад, ZuBy сказал:

это разве сложная?

я очень активно использую TTask.Run, на всех платформах работает отлично (правда дебага нет в потоке)

При обращении к глобальным переменным все нормально на всех устройствах?

Ссылка на комментарий
  • 0
  • Модераторы
9 минут назад, Rusland сказал:

При обращении к глобальным переменным все нормально на всех устройствах?

да, все корректно.

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

ZuBy, насколько помню вышеуказанный код брал у вас (из примера TMapsEngine)... на других устройствах работает нормально, а тут какая-то непонятка. Есть какие-нибудь идеи как решить проблему?

Ссылка на комментарий
  • 0
  • Модераторы
2 минуты назад, Rusland сказал:

ZuBy, насколько помню вышеуказанный код брал у вас (из примера TMapsEngine)... на других устройствах работает нормально, а тут какая-то непонятка. Есть какие-нибудь идеи как решить проблему?

да код знакомый, а что внутри mRoutePoints?

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

mRoutePoints получается в procedure TMapsEngine.GoogleDistance(const aOrigin, aDestination: TMapCoordinate; out Points: TArray<TMapCoordinate>;
  out RouteInfo: TMapsEngineRouteInfo);  из Maps.Engine.pas

Изменено пользователем Rusland
Ссылка на комментарий
  • 0
  • Модераторы
Только что, Rusland сказал:

mRoutePoints получается в procedure TMapsEngine.GoogleDistance(const aOrigin, aDestination: TMapCoordinate; out Points: TArray<TMapCoordinate>;
  out RouteInfo: TMapsEngineRouteInfo);  из Maps.Engine.pas

не, эт я помню. есть ли там данные?

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

Да, данные есть, он не пустой.

Сейчас закомментировал эти TTask.Run и TThread.Synchronize - та же самая ошибка

 

Вот stackСтэк.png

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

Еще выяснил что на планшете А при фокусе Edit-а появляется клавиатура и тоже вываливается Segmentation fault. Вот stack (кстати очень похож на предыдущий)

Стэк2.png

На планшете Б все нормально. Ну что за дела?? 

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

 

В 16.06.2016 в 13:29, ZuBy сказал:
В 16.06.2016 в 11:09, haword сказал:

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

это миллион раз обсуждалось, привет хелперам

Что вы имеете ввиду, как хелперы помогают в данном вопросе? И какую тему стоит посмотреть про них?

 

Ссылка на комментарий
  • 0
  • Модераторы
15 часов назад, Pax Beach сказал:

Что вы имеете ввиду, как хелперы помогают в данном вопросе? И какую тему стоит посмотреть про них?

конкретно загрузка картинок делается так

Ссылка на комментарий
  • 0
1 час назад, ZuBy сказал:

конкретно загрузка картинок делается так

Да, решение хорошее, спасибо за него.

А в общем, когда нужно использовать хелперы, для чего они? 

Ссылка на комментарий
  • 0
  • Модераторы
2 часа назад, Pax Beach сказал:

А в общем, когда нужно использовать хелперы, для чего они? 

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

с выходом Берлина все стало хуже в плане использования хелперов, т.к. нам отрезали доступ к приватным переменным объекта/компонента/и тд.

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

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

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

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

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

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

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

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

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

  • Похожий контент

    • Автор Simons Cat
      У меня среда программирования rad studio Delphi 10.4.2. Собственно ищу совета как отправить и получить ответ на запрос USSD.
      Нашел в интернете единственный пример более или менее который похож на правду.
      Привел его к виду нормальному виду, но не хватает знаний как передать функцию CallBack.
      procedure TForm7.Button6Click(Sender: TObject); var Temp:Jstring; ResponceCallBack: JTelephonyManager_UssdResponseCallback; handler: JHandler; begin     TM :=TJTelephonyManager.Create;   handler := TJHandler.Create;   ResponceCallBack := TJTelephonyManager_UssdResponseCallback.Wrap(   TAndroidHelper.Context.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE));    TM.sendUssdRequest(StringToJString('*100#'), ResponceCallBack,handler);   end;  
      На java делается вот так. Не знаю как этот код переделать в delphi.
      TelephonyManager =  telephonyManager(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);     Handler handler = new Handler();     TelephonyManager.UssdResponseCallback callback = new TelephonyManager.UssdResponseCallback() {         @Override         public void onReceiveUssdResponse(TelephonyManager telephonyManager, String request, CharSequence response) {             super.onReceiveUssdResponse(telephonyManager, request, response);             Log.e("ussd",response.toString());           }           @Override         public void onReceiveUssdResponseFailed(TelephonyManager telephonyManager, String request, int failureCode) {             super.onReceiveUssdResponseFailed(telephonyManager, request, failureCode);             Log.e("ussd","failed with code " + Integer.toString(failureCode));         }     };       try {            Log.e("ussd","trying to send ussd request");            telephonyManager.sendUssdRequest("*123#",                     callback,                     handler);         }catch (Exception e){                 String msg= e.getMessage();             Log.e("DEBUG",e.toString());             e.printStackTrace();         }  
    • Автор slav_z
      Все разработчики при работе с FMX рано или поздно сталкиваются с одной и той же проблемой: необходимо исключить "случайное" срабатывание нажатий элементов внутри скроллбокса во время его скроллинга. Идут годы, а решения так и нет. Давайте попробуем это исправить. Поехали!
      Запускаем IDE, создаем новый проект, кидаем на форму TVertScrollBox и на него чего-нибудь побольше... запускаем на мобильном устройстве, пытаемся скроллировать,

      получаем проблемы в виде срабатывания разных событий типа OnClick элементов.
      Решение состоит в том, чтобы сделать элементы "невидимыми" для событий связанных с действиями пользователя с экраном во время скроллинга.
      Делаем следующее:

      Все. Переносим код в базовую форму, делаем его более гибким, убираем все те костыли, которые мы уже успели сделать ранее...
      Удачи!
      https://github.com/slav-libx/scroll-click.git
    • Автор uakmal
      Здравствуйте!
      Создаю медиаплеер для Android TV. 
      Запускаю плеер, нажимаю на условную кнопку, которая делает следующее: 
      MediaPlayer1.FileName:='/storage/emulated/0/download/1.mp4'; После нажатия вылетает окошко с надписью:
      java.lang.java.lang.illegalargumentexception после закрытия окошки нажимаю на play, но ничего не происходит.
      Подскажите, пожалуйста как исправить это?
    • Автор Delpher-X
      Итак, я пробовал использовать компоненты AppTethering для передачи данных между VCL-приложением работающим под Windows и мобильным FMX-приложением и потерпел неудачу, так как выяснилось что потоки данных данные компоненты на деле не передают. И у меня возник вопрос: а нет ли каких других компонентов в современной Embarcadero Studio, которые бы позволяли передавать как строковые данные, так и файлы между приложениями? Особенно меня интересуют все же файлы. 
    • Автор Delpher-X
      Доброе время суток. У меня есть код, который отправляет данные, в частности файлы, из одного приложения в другое, используя технологию AppTethering. Вот код, который отправляет данные: 
      var ImageToStream : TMemoryStream; begin ImageToStream := TMemoryStream.Create; ImageToStream.LoadFromFile('Здесь находится путь к файлу'); ImageToStream.Position := 0; TetheringAppProfile1.Resources.FindByName('ImageTransfer').Value := ImageToStream; ImageToStream.Free; end; А вот который принимает: 
      procedure TForm1.TetheringAppProfile1Resources3ResourceReceived( const Sender: TObject; const AResource: TRemoteResource); var GetImage : TMemoryStream; begin GetImage := TMemoryStream.Create; GetImage.Position := 0; GetImage.LoadFromStream(AResource.Value.AsStream); ImageViewer1.Bitmap.LoadFromStream(GetImage); GetImage.Free; end; Пока передача данных идет между двумя Windows-приложениями, все работает прекрасно. Однако, когда я пытаюсь отправить данные от Windows-приложения в Android-приложение, которое исполняется на смартфоне, подключенном к компьютеру через USB-шнур, данные не проходят.  
    • Автор Delpher-X
      Здравствуйте. У меня такая проблема. 
      Пытаюсь скачать файл:
       
      var S : TMemoryStream; begin S := TMemoryStream.Create(); IdHTTP1.Get('http://sitename.com/7UlmBU7IXHA.jpg', S); S.SaveToFile('/storage/emulated/0/ImageFile.jpg'); S.Free; end;
      Проблема возникает на последней стадии - при сохранении файла. Android пишет, Cannot create file: '/storage/emulated/0/ImageFile.jpg'. Permission denied, то есть доступ запрещен. Но как его разрешить? Когда я устанавливаю приложение, система пишет, что никаких разрешений данная программа не требует.
    • Автор Delpher-X
      Здравствуйте. Как указываются пути к каталогам и файлам в Android? Скажем, в Windows я указываю такой путь:  C:/Windows/Folder, а как это делается в Android? Особенно меня интересует, как обратиться к корневому каталогу, для создания там новой папки или файла, в Windows это C:/, или D:/ а тут как? 
    • Автор destroyer86
      Всем привет, с помощью Java2Op сделал обертку библиотеки получил модуль с интерфейсами.
      Теперь сам вопрос в JavaInterfaces.pas есть описание:
       
      JUsbManagerClass = interface(JObjectClass) ['{1048A6E9-E1B5-4DA5-A168-ED91E8DE5284}'] {class} function _GetACTION_USB_ACCESSORY_ATTACHED: JString; cdecl; {class} function _GetACTION_USB_ACCESSORY_DETACHED: JString; cdecl; {class} function _GetACTION_USB_DEVICE_ATTACHED: JString; cdecl; {class} function _GetACTION_USB_DEVICE_DETACHED: JString; cdecl; {class} function _GetEXTRA_ACCESSORY: JString; cdecl; {class} function _GetEXTRA_DEVICE: JString; cdecl; {class} function _GetEXTRA_PERMISSION_GRANTED: JString; cdecl; {class} function getAccessoryList: TJavaObjectArray<JUsbAccessory>; cdecl;//Deprecated {class} function openAccessory(accessory: JUsbAccessory): JParcelFileDescriptor; cdecl;//Deprecated {class} function openDevice(device: JUsbDevice): JUsbDeviceConnection; cdecl;//Deprecated {class} procedure requestPermission(device: JUsbDevice; pi: JPendingIntent); cdecl; overload;//Deprecated {class} property ACTION_USB_ACCESSORY_ATTACHED: JString read _GetACTION_USB_ACCESSORY_ATTACHED; {class} property ACTION_USB_ACCESSORY_DETACHED: JString read _GetACTION_USB_ACCESSORY_DETACHED; {class} property ACTION_USB_DEVICE_ATTACHED: JString read _GetACTION_USB_DEVICE_ATTACHED; {class} property ACTION_USB_DEVICE_DETACHED: JString read _GetACTION_USB_DEVICE_DETACHED; {class} property EXTRA_ACCESSORY: JString read _GetEXTRA_ACCESSORY; {class} property EXTRA_DEVICE: JString read _GetEXTRA_DEVICE; {class} property EXTRA_PERMISSION_GRANTED: JString read _GetEXTRA_PERMISSION_GRANTED; end; [JavaSignature('android/hardware/usb/UsbManager')] JUsbManager = interface(JObject) ['{6F603A25-E816-4012-9B23-054B428A4A75}'] function getDeviceList: JHashMap; cdecl;//Deprecated function hasPermission(device: JUsbDevice): Boolean; cdecl; overload;//Deprecated function hasPermission(accessory: JUsbAccessory): Boolean; cdecl; overload;//Deprecated procedure requestPermission(accessory: JUsbAccessory; pi: JPendingIntent); cdecl; overload;//Deprecated end; TJUsbManager = class(TJavaGenericImport<JUsbManagerClass, JUsbManager>) end; Что бы получить доступ к методам интерфейса используется следующая конструкция:
      JavaObject := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.USB_SERVICE); FUsbManager := TJUsbManager.Wrap((JavaObject as ILocalObject).GetObjectID); теперь я могу получить доступ к методам JUsbManager, а как получить доступ к методам JUsbManagerClass
      Вот пример кода на Java, который хочу реализовать в Delphi:
      UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager); if (availableDrivers.isEmpty()) { return; } // Open a connection to the first available driver. UsbSerialDriver driver = availableDrivers.get(0); //Вот тут мы видим что из экземпляра класса мы вызываем openDriver, как это сделать в Delphi UsbDeviceConnection connection = manager.openDevice(driver.getDevice()); Как мы можем заметить этого метода в описании интерфейса нет, но есть в классе, как получить доступ к экземпляру класса?
    • Автор Yarpda
      Доброго дня уважаемые форумчане!
      Есть одна задача, но я не совсем уверен, что так можно, прошу совета.
      В общем есть приложение, в ней база данных SqlLite (файл базы данных деплоится в assets\internal\). Пользователь наполняет эту базу данных своими данными.
      Необходимо сделать возможность экспортирования этих данных на внешний носитель и последующего импортирования уже на другом устройстве.
      Вопрос, даст ли система экспортировать свой файл из assets\internal и главное импортировать его (т.е. фактически заменить существующий файл  базы данных) в папке assets\internal на другом устройстве? (предполагается что root прав у пользователя нет).
      Если да, то можно вкратце объяснить порядок действий (желательно с указанием запрашиваемых и статичных разрешений на это дело, путей обращения к файлам).
      Если нет, то каким образом тогда это можно сделать (формировать промежуточный файл с данными БД, а потом его обрабатывать на другом устройстве средствами СУБД)?
      P.S. Такая задача встала впервые, не очень разбираюсь в теме безопасности на Андроид устройствах и работе с файлами приложения напрямую, поэтому прошу помощи, может быть кто-то уже сталкивался с подобной задачей.
      Заранее спасибо! )
    • Автор zekelive
      Коллеги, здравствуйте. Помогите пожалуйста с работой потоков. При запуске потока, появляется индикатор и исправно крутится. В какой то момент он залипает и перестает крутиться и так до конца работы потока. Понимаю, что в потоке идет работа с визуальными компонентами, по этому скорее всего и залипает индикатор. Как исправить/оптимизировать код? Спасибо.
      DelOff = class (TThread) protected FOnTaskStarted: TThreadMethod; FOnTaskFinished: TThreadMethod; procedure DoStarted; procedure DoFinished; procedure load; procedure Execute; override; public property OnTaskStarted: TThreadMethod read FOnTaskStarted write FOnTaskStarted; property OnTaskFinished: TThreadMethod read FOnTaskFinished write FOnTaskFinished; end; procedure DelOff.DoFinished; begin Add.Layout1.Visible:=false; if Assigned (Add.FindComponent('Null') as TLayout) then (Add.FindComponent('Null') as TLayout).Free; end; procedure DelOff.DoStarted; begin Add.Layout1.Visible:=true; end; procedure DelOff.load; begin try ReOpen; ClientModule2.ServerMethods1Client.Number13(a,b,g,h); a:='1'; ReOpen; offerlist1.Lines.Text:=ClientModule2.ServerMethods1Client.Number12(a,b,g,h); a:='2'; ReOpen; sumofferlist1.Lines.Text:=ClientModule2.ServerMethods1Client.Number12(a,b,g,h); a:='3'; ReOpen; keyofferlist1.Lines.Text:=ClientModule2.ServerMethods1Client.Number12(a,b,g,h); ReOpen; offercount:=ClientModule2.ServerMethods1Client.Number11(a,b,g,h); except ANM.Show; Add.Visible:=false; ShowmessageToast('Ошибка загрузки',TJToast.JavaClass.LENGTH_LONG); Value := Trim('10,500'); if Add.CheckPermission then if Value.Contains(',') then TVibratorHelper.vibrate(Value.Split([',']), -1) else TVibratorHelper.vibrate(Value.ToInt64); end; end; procedure DelOff.Execute; begin inherited; //Удаление из БД продукта try try Synchronize(DoStarted); updatecount:=StringReplace((Add.FindComponent('LabelIntro') as TLabel).Hint, 'Rec', '', [rfReplaceAll]); a:=(Add.FindComponent('NameProduct'+updatecount) as TLabel).Hint; di:= TZDeviceInfo.Create; b:=StringReplace(di.DeviceID, '=', '', [rfReplaceAll]); if(internet='true') and (server='true') then begin EditCase:='false'; Add.PSB.AutoCalculateContentSize:=false; Add.PSB.EnabledScroll:=true; Add.PSB.AutoCalculateContentSize:=true; synchronize(load); if Assigned (Add.FindComponent((Add.FindComponent('LabelDel') as TLabel).Hint)) then begin (Add.FindComponent((Add.FindComponent('LabelDel') as TLabel).Hint) as TRectangle).Free; (Add.FindComponent('RecEdit') as TRectangle).Free; end; Add.PSB.ScrollTo(0,0,true); for countload:=0 to StrToInt(offercount)-1 do begin (Add.FindComponent('XRun'+IntToStr(countload)) as TFloatAnimation).Enabled:=false; (Add.FindComponent('x'+IntToStr(countload)) as TImage).Opacity:=0; (Add.FindComponent('VRun'+IntToStr(countload)) as TFloatAnimation).Enabled:=false; (Add.FindComponent('v'+IntToStr(countload)) as TImage).Opacity:=0; end; end else begin ShowmessageToast('Нет интернета',TJToast.JavaClass.LENGTH_LONG); Value := Trim('10,500'); if Add.CheckPermission then if Value.Contains(',') then TVibratorHelper.vibrate(Value.Split([',']), -1) else TVibratorHelper.vibrate(Value.ToInt64); end; finally Synchronize(DoFinished); end; except ANM.Show; Add.Visible:=false; ShowmessageToast('Ошибка загрузки',TJToast.JavaClass.LENGTH_LONG); Value := Trim('10,500'); if Add.CheckPermission then if Value.Contains(',') then TVibratorHelper.vibrate(Value.Split([',']), -1) else TVibratorHelper.vibrate(Value.ToInt64); end; end;  
  • Последние посетители   0 пользователей онлайн

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

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