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

Dmitry Sobko

Пользователи
  • Постов

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

  • Посещение

Сообщения, опубликованные Dmitry Sobko

  1. Здравствуйте коллеги!

    Помогите пожалуйста, всю голову сломал. google не помог.

    Я написал приложение, которое разместил в PlayMarket'е. На моем смартфоне (Highscreen Power Rage) оно работает очень хорошо, без всяких проблем.

    Вопрос: Кто бы не скачал мое приложение, ссылка https://play.google.com/apps/testing/ru.portalle.ElectraDoors, приложение после заставки либо вылетает, либо просто висит черный экран. В чем может быть проблема? Дебагер не выдает никаких ошибок или предупреждений.

    В личном кабинете PLayMarket'а перед публикацией неизвестные мне люди тестируют это приложение и у всех одна и та же ситуация http://joxi.ru/J2be3VVcJvQMm6

    Но один, видимо самый ответственный http://joxi.ru/bmoovzzhLjBXmy, пишет описание проблемы:

    Проблема: java.lang.NullPointerException: Attempt to invoke interface method 'com.android.volley.l com.google.android.finsky.api.b.a(com.android.volley.t, com.android.volley.s, boolean)' on a null object reference

    FATAL EXCEPTION: main
     Process: com.google.android.videos, PID: 26336
     java.lang.NullPointerException: Attempt to invoke interface method 'com.android.volley.l com.google.android.finsky.api.b.a(com.android.volley.t, com.android.volley.s, boolean)' on a null object reference
     	at android.os.Parcel.readException(Parcel.java:1552)
     	at android.os.Parcel.readException(Parcel.java:1499)
     	at com.android.vending.contentfilters.IContentFiltersService$Stub$Proxy.getContentFiltersAndIntent(SourceFile:139)
     	at com.google.android.videos.contentfiltering.ContentFiltersManager.saveContentFiltersToPreference(SourceFile:438)
     	at com.google.android.videos.contentfiltering.ContentFiltersManager.access$100(SourceFile:81)
     	at com.google.android.videos.contentfiltering.ContentFiltersManager$1.onServiceConnected(SourceFile:423)
     	at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1314)
     	at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1331)
     	at android.os.Handler.handleCallback(Handler.java:739)
     	at android.os.Handler.dispatchMessage(Handler.java:95)
     	at android.os.Looper.loop(Looper.java:145)
     	at android.app.ActivityThread.main(ActivityThread.java:6837)
     	at java.lang.reflect.Method.invoke(Native Method)
     	at java.lang.reflect.Method.invoke(Method.java:372)
     	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
     	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

    Google говорит о том, что проблема с какими то фрагментами. http://ru.stackoverflow.com/questions/514856/Ошибка-attempt-to-invoke-virtual-method-on-a-null-object-reference 

    Дословно:  Метод onCreateView фрагмента предназначен для создания корневого элемента пользовательского интерфейса фрагмента. Т.е. в нем первым делом вы создаете view которая будет отображаться, а в конце вы должны вернуть эту view из этого метода.  Вы же зачем то пытаетесь искать ваши view в активити вызывая getActivity().findViewById(). Очевидно что их там нету, и данный метод возвращает null, но вы пытаетесь установить в них какие-то значения после чего и вылетает NullPointerException.

    О чем это он? Где мне это в Delphi смотреть?

    Надеюсь на вашу помощь! Спасибо!

  2. Прошу прощения за беспокойство. Проблема решена. Ура! :)

    Действительно отладчик сбил с толку. voytalexey и kami спасибо Вам большое! На самом деле очень помогли!

    Проблема заключалась в нумерации символов в string, например While (S[1] = '0') работает под Windows так как написано, т.е. берет первый символ и проверяет его. В FMX же нужно было написать так While (S[0] = '0'), т.е. первый символ - это нулевой. И как-то странно тогда получается, нет бы для всех операций со строками сделали такое правило, что первый символ - это S[0], когда например delete(S, 1, 1) удаляет именно первый символ, ведь следуя логике должно быть так delete(S, 0, 1). Это тоже сбило с толку.

    Еще раз всем большое спасибо!

    Если кому нужна будет реализация RSA для Android с использованием FGInt - поделюсь.

  3. Вот так у меня выглядит запись TFGInt

       TFGInt = Record
          Sign : TSign;
          Number : Array Of LongWord;
       End;

    Вот так я пытаюсь перевести из двоичной системы в число

    Procedure Base2StringToFGInt(S : String; Var FGInt : TFGInt);
    Var
       i, j, size : LongWord;
    Begin
       While (S[1] = '0') And (length(S) > 1) Do
          delete(S, 1, 1);
       size := length(S) Div 31;
       If (length(S) Mod 31) <> 0 Then size := size + 1;
       SetLength(FGInt.Number, (size + 1));
       FGInt.Number[0] := size;
       j := 1;
       FGInt.Number[j] := 0;
       i := 0;
       While length(S) > 0 Do
       Begin
          If S[length(S)] = '1' Then
             FGInt.Number[j] := FGInt.Number[j] Or (1 Shl i);
          i := i + 1;
          If i = 31 Then
          Begin
             i := 0;
             j := j + 1;
             If j <= size Then FGInt.Number[j] := 0;
          End;
          delete(S, length(S), 1);
       End;
       FGInt.Sign := positive;
    End;

    Казалось бы ничего военного, обычная работа с массивами, строками, но в итоге этот код записывает в FGInt.Number значение равное "01"

  4. 31 минуту назад, voytalexey сказал:

    Вы путаете две разные ситуации: неправильную работу программы и неправильную работу отладчика (он же дебаггер). 

    Думаю, у вас второй вариант, ибо SetLength настолько много где используется, что сбой в её работе давно бы заметили. У меня в проектах для Андроида в XE6 она отрабатывает без проблем.

    Некорректная работа отладчика более вероятна, но это, строго говоря, не влияет на поведение готовой программы. 

    Вы полностью правы! Действительно, раньше подобной ситуации я не замечал, пока не столкнулся с FGInt.

    У меня стоит задача кодировать и декодировать сообщения шифрованием RSA. Для работы с большими числами я использую сторонний модуль FGInt http://www.submanifold.be/triade/GInt/gint.html

    Этот модуль очень правильно, без погрешностей, производит любые операции с большими числами и в том числе у него есть функционал создания цифровых подписей, кодирования и декодирования информации. Перед тем как выбрать решение для шифрования RSA под Android я много гуглил и много кто ссылался именно на этот модуль. Скачав и изучив его я не нашел ничего такого, что могло бы не работать под Android.

    Но к сожалению столкнулся с ситуацией, когда я перевожу строку в число типа FGInt и обратно, то мне возвращается постоянно число 01 вместо 1440294937918237327.

    По всем ощущениям баг возникает после использования SetLength. Но я конечно могу ошибаться. 

    Может если приложу проект сюда, поможете разобраться? 

  5. Добрый день!

    Обращаюсь к Вам с проблемой работы в FireMonkey с динамическими массивами.

    Ситуация такая, в ходе работы приложения под Android мне необходимо задавать в определенный момент времени размер массива. Функция SetLength почему-то не работает.

    Например, если делать так:

    procedure TForm1.Button1Click(Sender: TObject);
      var
        Number123 : Array Of Integer;
        i : integer;
    begin
       SetLength(Number123, 5);
       for I := 0 to 4 do
         begin
           Number123[i] := i;
         end;
    end;

    то можно наблюдать следующую ситуацию, что до работы SetLength массив пустой http://joxi.ru/DmBXxLLclDM6AP и это нормально, а после задания длины с массивом происходят странные вещи - вместо ячеек массива какое-то шестнадцатиричное значение http://joxi.ru/823O5xxSYdxl2O, элементы массива по циклу не заполняются.

    Если то же самое делать под Windows, то все красиво - http://joxi.ru/gmvR7vvHD3lyma и  http://joxi.ru/Vm6ydxxhYPLXrZ

     

    Если под Android сделать так:

    procedure TForm1.Button1Click(Sender: TObject);
      var
        Number123 : Array [0..4] Of Integer;
        i : integer;
    begin
    
       for I := 0 to 4 do
         begin
           Number123[i] := i;
         end;
    
    end;

    То все работает как надо: http://joxi.ru/KAgKWooTDB84Al

     

    Помогите пожалуйста разобраться. Гугл не помогает совсем.

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

    Надеюсь на помощь. Спасибо!.

  6. Добрый день! У меня тоже такой вопрос.

    Я использую XE10

    В примерах есть получение списка устройств, подключение к ним, и даже как отправить текст на устройство, но к сожалению этот пример не рабочий (про отправку текста). Т.е. я подключаюсь к устройству, пытаюсь отправить на него текст и после ожидания появляется ошибка в логе.  

    Помогите пожалуйста разобраться с приемом/передачей текстовой информации с/на устройство.

    Спасибо!

  7. Друзья, подскажите пожалуйста, каким образом можно реализовать меню в стиле аккордеон как тут https://jqueryui.com/accordion/. Требования к компоненту:

    1) На форму бросается этот компонент, у него есть ширина и высота.

    2) В этом компоненте должны добавляться итемы, хоть в дизайнтайме, хоть в рантайме, высота которых так же задается в свойствах компонента, которая будет для всех одна

    3) Должна быть свойство у компонента, которое имеет значение истина или ложь, которое означает развернуть первый элемент при запуске, или все элементы свернуты

    4) Развернутым должен быть только один элемент, если кликаем (тапаем) на свернутый и при этом есть развернутый элемент, то развернутый должен свернуться, а выбранный - развернуться

    5) У каждого элемента есть заголовок и изображение в виде треугольника, означающее развернут элемент или нет.\

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

    7) Если элементы находятся за пределами видимой области - появляется скролл.

     

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

     

    При необходимости предоставлю свой г...код, но лучше не стоит))

     

    За основу я взял TVertScrollBox, в рамках которого все и происходит. В него я пока программно создаю столько TExpander'ов, сколько мне нужно - это итемы.

     

    Вот г...код:

     


    procedure TMainForm.AccordionAddItem(IdItem, CountItems: integer; IdRubricGood,
      CaptionText: string);
    var
      AccordionNewItem : TExpander;
    begin
      if AccordionItems[IdItem] <> nil then AccordionItems[IdItem].Destroy;
      AccordionNewItem := TExpander.Create(VertScrollBox_RubricsGood);
      With AccordionNewItem do
        begin
          Parent      := VertScrollBox_RubricsGood;
          Align       := TAlignLayout.Top;
          Text        := CaptionText;
          StyleLookup := 'Expanderstyle';
          Name        := 'AccordionItem'+IntToStr(IdItem);
          Height      := MainForm.Height-170; //(CountItems * 150)+29;
          IsExpanded  := False;
          TagString   := IdRubricGood;
          StylesData['text.OnClick'] := TValue.From<TNotifyEvent>(OnMaxMinPanelItems);
        end;
     AccordionItems[IdItem] := AccordionNewItem;end;
    

    Потом еще куча кода на отловить развернутые и свернутые итемы и вставку ListBox'внутрь открытого с нужным мне контеном:

     


    procedure TMainForm.OnMaxMinPanelItems(Sender: TObject);
    var
      AccordeonSelectedItem: TExpander;
      I:integer;
    begin
      AccordeonSelectedItem := TExpander(FindItemParent(Sender as TFmxObject,TExpander));
    
    
      ListBoxGoods.Items.Clear;
    
    
      for I := 1 to RubricGoodsSize do
      begin
        if (AccordionItems[I].TagString = AccordeonSelectedItem.TagString) AND (AccordionItems[I].IsExpanded = False) then
          begin
            AccordionItems[I].BeginUpdate;
            RectangleRestourantHeader.Visible := False;
            AnimationAniIndicator(True);
            AccordionItems[I].IsExpanded := True;
            GoodList(AccordeonSelectedItem.TagString, Sender);
            AccordionItems[I].EndUpdate;
            AnimationAniIndicator(False);
          end
        else
          if (AccordionItems[I].TagString = AccordeonSelectedItem.TagString) AND (AccordionItems[I].IsExpanded = True) then
            begin
              AccordionItems[I].IsExpanded := False;
              RectangleRestourantHeader.Visible := True;
            end
          else
            begin
              AccordionItems[I].IsExpanded := False;
            end;
    
    
      end;
    end;
    Я в отчаянии, помогите чем можете, очень нужно. Спасибо!

     

     

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