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

Андрей Рулин

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

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

  • Посещение

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

    1

Сообщения, опубликованные Андрей Рулин

  1. Цитата
    В 17.11.2023 в 17:41, krapotkin сказал:

    Соответственно при зарядке ничего подключить в него не получится.

     

    А хочеться.  Например сделав свою зарядку.  Которая бы подавала питания и одновременно была бы подключена к периферии через D+ и D-.

    И надо сказать Levovo TB-8505F именно это и разрешает к примеру. Но у него зато обратная проблема. 

    Я зарядил до 100% и вот тогда почему-то планшет с какого до бодуна не хочет обмениваться данными и говорит No Permisson. То есть когда идёт зарядка, он обменивается данными. А когда зарядки не идёт, как раз и не обменивается, хотя ожидается , что он себя будет вести ровно наоборот. 

    При этом у меня в манифесте стоит

        <uses-feature android:name="android.hardware.usb.host" />
        <uses-permission android:name="android.permission.USB_PERMISSION" />
        <permissions>
           <feature name="android.hardware.usb.host"/>
        </permissions>
    ...
    <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
                    android:resource="@xml/device_filter" />
    ...
    <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />

     

    AndroidManifest.rar

  2. Olvion 

    Да, FMX известна своими глюками. Особенно под Android , одна и та же программа может нормально работать в Windows, но косо на андроиде.

    1. Delphi 11 немного исправит ситуацию , но не радикально.  При переходе на 11 надо проекты все заново создать и туда файлы со старого перенести. Иначе на Андройде не запустится. 

    2. В графике надо много чего руками инициализировать , что в VCL по умолчанию стоит.

    3.  Тяжёлые вычисления надо в отдельный поток помещать, костыли типа application.processmessages  в FMX нормально работать не будут , особенно на Андройде. 

    4. Логирование наше всё, особенно опять же под Андройд. 

    5.  На Андройде надо писать, если есть много кода на Delphi который, надо перенести, за этим FMX и нужен.  Для создания приложения с нуля Java лучше. Кстати аналогично у C# , Xamarin тоже хорош, только если есть много легаси кода на C#. 

    6. Delphi само на FMX пока не написана, а по прежнему на VCL. Вот напишут, есть шанс , что под Windows/Linux хотя бы будет всё стабильно. 

     

  3. Многие планшеты очень не любят общаться с устройствами USB, когда на них подаёшь дополнительное питание(а без оного питания планшета не хватает для устройства).

    Samsung так и вовсе отказывается. 

    Lenovo сделали поинтереснее - они во время зарядки всё-таки разрешают доступ к устройству. Но уж как зарядилось, так всё , привет. 

    Можно ли как-то решить эту проблемы в настройках устройств или надо какие-то аппаратные извращения применять?

  4. Проблема решена - создал с нуля новый проект, который описал в п.3.  и перекопировал туда все файлы из старого.  И ведь не первый раз сталкиваюсь , очень похожий же глюк был с проектами к примеру при компиляции проектов Win32 из Delphi 2006 на новых версиях(но тогда не компилировалось). А всё как в первый раз...  

  5. 1.Read и Write external Storage стоит как true на обоих версиях. Что-то есть ещё?
    2. Сравнил папку assets - все файлы одинаковые. Манифест отличается только названием после com, чтобы одновременно на телефоне запускать и 32 и 64 бита. classes.dex для 64 бит огромный 5 Мб, но может это так и надо. 
    Это если в папке Android64\Debug\****\classes\
    А в папке Android64\Debug\*****.classes\ - файл внезапно одинаковый с версией 32 бита и составляет 143 Кб. 

    3. Если создать пустой проект по умолчанию и откомилировать с кодом выше, то работает на 64. 

    4. Если все файлы в пустом проекте задеплоить, что и в основном , всё тоже работает. 

  6. На Delphi 11 создаю приложение на Android32, всё работает.

    На 64 пишет максимум заставку, но реально не запускается. У меня в приложении есть логирование , которое на старте выполняет такой код

     

    procedure TForm1.FormCreate(Sender: TObject);
    var i:Integer;
    s,s1:string;
    
    begin
    s:='debug.txt';
    {$IFDEF ANDROID}
    S1:= TPath.GetPublicPath+'/'+s;
    Assignfile(f,s1); //Список операторов
    s1:='';
    {$ELSE}
    Assignfile(f,s); //Список операторов
    {$ENDIF}
    Rewrite(f);

     

    На Android32 , логирование соотвественно идёт нормально.

    На Android64 даже вообще файл debug.txt не создаётся. В каком направлении примерно хотя бы копать? 

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

    Если в самом магазине взять версию для тестирования он вместо нормального apk весом в 17 Мб(генерируется в режиме Realise-Delpoyment) мне вываливать два файла.

    base-arm64_v8a.apk  - этот не устанавливается

    base-master.apk - этот устанавливается но не запускается.

    Я так подозреваю, что их надо оба установить.

    Второй путь - это я лично используя bundletool-all.jar пытаюсь преобразовать aab в apk

    При это выдаётся куча apk типа base-xxxhdpi.apk(несколько килобайт) , base-master_2.apk (10 мб),  base-arm64_v8a.apk (7 мб) и даже base-arm64_v8a_2.apk весом 33 Мб, что из них ставить на телефон совершенно без понятия.  Ни один из apk и близко размером не совпадает с тем , что генерируется Delphi в режиме Realise-Delpoyment(17 мб). 

     

     

     

  8. Кто как решает проблему быстрого переноса приложения с VCL на FMX?
    Я лично написал самописный конвертер, который во первых переносит компоненты, во вторых устанавливает автомасштабирование для Android.  Во вложение то, что получается на выходе. Может кому-то пригодится. Вот адрес конвертора https://github.com/stalker1917/DfmToFMX
    Возможно у кого есть способы делать перенос быстрее/лучше? 

     


     

    Debug.zip

  9. Опять мой ничтожный разум не может постигнуть гениальных замыслов , авторов FMX

    Компонент TSpeedButton  в Android64(в 32 не пробовал) никак не реагирует на событие OnClick  и OnMouseUp ( событие OnMouseDown не пробовал). В Win32 всё нормально.  HitTest установлена как True.  При нажатии на кнопку вокруг неё появляется серый ореол, при повторном нажатии исчезает.  На кнопке установлен произвольный стиль.  Среда Delphi 11. 

    Может что с настройками? Или есть обходной путь? Собственно мне надо , чтобы как на картинке было 4 кнопки. 

     

    Bug1.png

  10. Ну кривенько-корявенько, заработало всё-таки по первыому подходу 

     

      try
        Port.Disconnect;
        Port.Suspend;
        Port.Connect(PortIndex,False);
      except                    //Подавляем вывод сообщения о глюке.
     
      end;
    
    ...
    
    procedure TServerConnectionTH.Connect(index: integer;IsStart:Boolean=True);
    begin
      if (ServerConnectionTH = nil) and ManagerConnected then
      begin
        FAdapter := FBluetoothManager.CurrentAdapter;
        if (FSocket = nil) or (ItemIndex <> index) then
        begin
          if index > -1 then
          begin
            LDevice := FPairedDevices[index] as TBluetoothDevice;
            FSocket := LDevice.CreateClientSocket(StringToGUID(ServiceGUI), False);
            if FSocket <> nil then
            begin
              ItemIndex := index;
              //FluetoothManager.cancelDiscovery();  //Может и не даёт ничего
              FSocket.Connect;
              if IsStart then Start
                         else Resume;
            end;
          end;
        end;
      end;
    end;
    
    procedure TServerConnectionTH.Disconnect;
    begin
      if (FSocket <> nil) then
         FSocket.close;
     FSocket := nil;
    end;

     

    Добавил в Disconnect 

     FSocket := nil;

    + После дисконнекта остановку потока. 

     

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

     

     

     

  11. Да, так работает, хотя в целом коннект и так и так занимает порядка секунды. 

    Про подписку вы имеете ввиду что-то вроде этого кода на Java?

    https://www.codeproject.com/Articles/814814/Android-Connectivity

      
      @Override
        protected void onResume() {
            super.onResume();
            // Register the BroadcastReceiver for ACTION_FOUND
            IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
            this.registerReceiver(broadcastReceiver, filter);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            this.unregisterReceiver(broadcastReceiver);
        }

     

  12. 57 минут назад, OnePeople сказал:

    FAdapter.cancelDiscovery;

    На это и пишет 

     

    Цитата

    [DCC Error] EasyBlueTooth.pas(144): E2362 Cannot access protected symbol TBluetoothAdapter.CancelDiscovery

     

    Можно выбрать такой вариант вроде как это оно, но неточно. 

    Цитата

    FBluetoothManager.cancelDiscovery();

     

  13. Я стал при восстановлении соедиениения делать дисконнект через 

    if (FSocket <> nil) then
      FSocket.close;

    А потом реконнект.

    Стала вываливаться ошибка "socket closed" .  Видимо не рекоенктиваться потом.

     

    По поводу 

    bluetoothAdapter.cancelDiscovery();

    Пишет, что cannot access to protected symbol... 

  14. Всё таки Canvas.FillText,  работает, как не странно.

    Пойду таким путём.

     

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

    поэтому берете модель данных, отрисовываете ее на битмап. в том числе текст. битмап выводите на PaintBox или TImage, пофиг.

    Я к сожалению не понял, что собственно в битмап должен обрисовывать и каким оператором. У меня есть текст String, который я сейчас засовываю в Label. Это и есть "модель данных" в ваших терминах?  

     

  15. Сделал работу с BLueTooth , как в примере

    https://www.programmersforum.ru/showthread.php?t=312413

     

    procedure TServerConnectionTH.Connect(index: integer);
    begin
      if (ServerConnectionTH = nil) and ManagerConnected then
      begin
        FAdapter := FBluetoothManager.CurrentAdapter;
        if (FSocket = nil) or (ItemIndex <> index) then
        begin
          if index > -1 then
          begin
            LDevice := FPairedDevices[index] as TBluetoothDevice;
            FSocket := LDevice.CreateClientSocket(StringToGUID(ServiceGUI), False);
            if FSocket <> nil then
            begin
              ItemIndex := index;
              FSocket.Connect;
              Start;
            end;
          end;
        end;
      end;
    end;

    Всё отлично работает, проблемы начинаются если разнести устройства и связь обрывается.

    После этого они уже между собой знаться не хотят и выдаётся сообщение 'IOException: Broken Pipe' .

    Иногда восстановления связи даже после однократного перезапуска программы не происходит. 

    Кто-то решал подобную задачу? 

     

  16. Если в PaintBox - всё равно затирается.  То есть если код заменить на 

    PaintBox1.Canvas.BeginScene();
    PaintBox1.Canvas.DrawBitmap(MainBmp,r1,r2,1,False);
    PaintBox1.Canvas.EndScene();

    то затирается. Причём даже игнорируется расположение этого PaintBox на форме. 

    Второй вариант какой-то изврат. Тогда эти Label вообще проще выкинуть на помойку и использовать что-то вроде Canvas.FillText (не удивлюсь, правда если это работать не будет, в VСL по крайней мере Canvas.TextOut работал) . 

     

    Собственно вот пример что должно быть , есть карта, есть цифры. Цифры должны быть текстом, потому, что динамически меняется цвет. И числа тоже могут меняться. 

     

     

     

    Карта.jpg

  17. Если я в OnPaint формы провожу такую прорисовку

     

    Canvas.BeginScene();
    Canvas.DrawBitmap(MainBmp,r1,r2,1,False);
    Canvas.EndScene();

    То затираются все Label , Edit  и всё прочее на форме.  Как сделать ,чтобы у меня отрисовывалась картинка , которую я хочу. А поверх неё эти Label , Edit и т.д. ?  

  18. В итоге решил проблему обходным путём.  Сделал проверку репаинта.

    procedure TForm2.Label1Paint(Sender: TObject; Canvas: TCanvas;
      const ARect: TRectF);
    begin
       RepaintFlag := True;
    end;

     

    В процедуре с таймером добавил.

    if not RepaintFlag then exit;

     

    К сожалению , как и  говорил GASCHE пришлось убрать внешний цикл и заменять на 10 вызовов по таймеру, без убирания , увы не работает. 

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