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

Андрей Рулин

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

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

  • Посещение

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

    1

Весь контент Андрей Рулин

  1. А хочеться. Например сделав свою зарядку. Которая бы подавала питания и одновременно была бы подключена к периферии через 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. Если в VCL мне надо повторно воспроизвести звук , я пишу что-то вроде этого if MediaPlayer1.NotifyValue = nvSuccessful then begin MediaPlayer1.Notify := true; MediaPlayer1.Play; end; Как это сделать на FMX?
  4. Многие планшеты очень не любят общаться с устройствами USB, когда на них подаёшь дополнительное питание(а без оного питания планшета не хватает для устройства). Samsung так и вовсе отказывается. Lenovo сделали поинтереснее - они во время зарядки всё-таки разрешают доступ к устройству. Но уж как зарядилось, так всё , привет. Можно ли как-то решить эту проблемы в настройках устройств или надо какие-то аппаратные извращения применять?
  5. Проблема решена - создал с нуля новый проект, который описал в п.3. и перекопировал туда все файлы из старого. И ведь не первый раз сталкиваюсь , очень похожий же глюк был с проектами к примеру при компиляции проектов Win32 из Delphi 2006 на новых версиях(но тогда не компилировалось). А всё как в первый раз...
  6. 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. Если все файлы в пустом проекте задеплоить, что и в основном , всё тоже работает.
  7. На 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 не создаётся. В каком направлении примерно хотя бы копать?
  8. Поиск по гуглу показывает, что в apks кроме папки splits должна быть ещё и standalones, но у меня такой нет.
  9. Хочу проверить, правильно ли работает тот 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 мб).
  10. Кто как решает проблему быстрого переноса приложения с VCL на FMX? Я лично написал самописный конвертер, который во первых переносит компоненты, во вторых устанавливает автомасштабирование для Android. Во вложение то, что получается на выходе. Может кому-то пригодится. Вот адрес конвертора https://github.com/stalker1917/DfmToFMX Возможно у кого есть способы делать перенос быстрее/лучше? Debug.zip
  11. Должен признать, что это я лажанулся, событие OnClick таки отрабатывается, разночтение между Andoroid и Windows начинаются дальше, но это уже вопрос другой темы.
  12. Опять мой ничтожный разум не может постигнуть гениальных замыслов , авторов FMX Компонент TSpeedButton в Android64(в 32 не пробовал) никак не реагирует на событие OnClick и OnMouseUp ( событие OnMouseDown не пробовал). В Win32 всё нормально. HitTest установлена как True. При нажатии на кнопку вокруг неё появляется серый ореол, при повторном нажатии исчезает. На кнопке установлен произвольный стиль. Среда Delphi 11. Может что с настройками? Или есть обходной путь? Собственно мне надо , чтобы как на картинке было 4 кнопки.
  13. Ну кривенько-корявенько, заработало всё-таки по первыому подходу 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; + После дисконнекта остановку потока. Кривенько, потому, что информацию об отключении я получаю по факту того, что мне перестали подступать данные. А наверняка есть напрямую решение.
  14. Да, так работает, хотя в целом коннект и так и так занимает порядка секунды. Про подписку вы имеете ввиду что-то вроде этого кода на 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); }
  15. На это и пишет Можно выбрать такой вариант вроде как это оно, но неточно.
  16. Я стал при восстановлении соедиениения делать дисконнект через if (FSocket <> nil) then FSocket.close; А потом реконнект. Стала вываливаться ошибка "socket closed" . Видимо не рекоенктиваться потом. По поводу bluetoothAdapter.cancelDiscovery(); Пишет, что cannot access to protected symbol...
  17. Всё таки Canvas.FillText, работает, как не странно. Пойду таким путём. Я к сожалению не понял, что собственно в битмап должен обрисовывать и каким оператором. У меня есть текст String, который я сейчас засовываю в Label. Это и есть "модель данных" в ваших терминах?
  18. Сделал работу с 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' . Иногда восстановления связи даже после однократного перезапуска программы не происходит. Кто-то решал подобную задачу?
  19. Если в PaintBox - всё равно затирается. То есть если код заменить на PaintBox1.Canvas.BeginScene(); PaintBox1.Canvas.DrawBitmap(MainBmp,r1,r2,1,False); PaintBox1.Canvas.EndScene(); то затирается. Причём даже игнорируется расположение этого PaintBox на форме. Второй вариант какой-то изврат. Тогда эти Label вообще проще выкинуть на помойку и использовать что-то вроде Canvas.FillText (не удивлюсь, правда если это работать не будет, в VСL по крайней мере Canvas.TextOut работал) . Собственно вот пример что должно быть , есть карта, есть цифры. Цифры должны быть текстом, потому, что динамически меняется цвет. И числа тоже могут меняться.
  20. Если я в OnPaint формы провожу такую прорисовку Canvas.BeginScene(); Canvas.DrawBitmap(MainBmp,r1,r2,1,False); Canvas.EndScene(); То затираются все Label , Edit и всё прочее на форме. Как сделать ,чтобы у меня отрисовывалась картинка , которую я хочу. А поверх неё эти Label , Edit и т.д. ?
  21. К сожалению , до сих пор в Runtime нельзя менять цвет прогресс бара, так что по сравнению с VCL версии польза от него так себе. Легче что-то своё запилить. Кстати может кто-то уже запилил?
  22. Можете тестовый пример скинуть, как вы читаете?
  23. В итоге решил проблему обходным путём. Сделал проверку репаинта. procedure TForm2.Label1Paint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); begin RepaintFlag := True; end; В процедуре с таймером добавил. if not RepaintFlag then exit; К сожалению , как и говорил GASCHE пришлось убрать внешний цикл и заменять на 10 вызовов по таймеру, без убирания , увы не работает.
×
×
  • Создать...