-
Постов
75 -
Зарегистрирован
-
Посещение
-
Победитель дней
1
Сообщения, опубликованные Андрей Рулин
-
-
Да, 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 хотя бы будет всё стабильно.
-
Если в VCL мне надо повторно воспроизвести звук , я пишу что-то вроде этого
if MediaPlayer1.NotifyValue = nvSuccessful then begin MediaPlayer1.Notify := true; MediaPlayer1.Play; end;
Как это сделать на FMX?
-
Многие планшеты очень не любят общаться с устройствами USB, когда на них подаёшь дополнительное питание(а без оного питания планшета не хватает для устройства).
Samsung так и вовсе отказывается.
Lenovo сделали поинтереснее - они во время зарядки всё-таки разрешают доступ к устройству. Но уж как зарядилось, так всё , привет.
Можно ли как-то решить эту проблемы в настройках устройств или надо какие-то аппаратные извращения применять?
-
Проблема решена - создал с нуля новый проект, который описал в п.3. и перекопировал туда все файлы из старого. И ведь не первый раз сталкиваюсь , очень похожий же глюк был с проектами к примеру при компиляции проектов Win32 из Delphi 2006 на новых версиях(но тогда не компилировалось). А всё как в первый раз...
-
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. Если все файлы в пустом проекте задеплоить, что и в основном , всё тоже работает.
-
На 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 не создаётся. В каком направлении примерно хотя бы копать?
-
Поиск по гуглу показывает, что в apks кроме папки splits должна быть ещё и standalones, но у меня такой нет.
-
Хочу проверить, правильно ли работает тот 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 мб).
-
Кто как решает проблему быстрого переноса приложения с VCL на FMX?
Я лично написал самописный конвертер, который во первых переносит компоненты, во вторых устанавливает автомасштабирование для Android. Во вложение то, что получается на выходе. Может кому-то пригодится. Вот адрес конвертора https://github.com/stalker1917/DfmToFMX
Возможно у кого есть способы делать перенос быстрее/лучше?
-
Должен признать, что это я лажанулся, событие OnClick таки отрабатывается, разночтение между Andoroid и Windows начинаются дальше, но это уже вопрос другой темы.
-
Опять мой ничтожный разум не может постигнуть гениальных замыслов , авторов FMX
Компонент TSpeedButton в Android64(в 32 не пробовал) никак не реагирует на событие OnClick и OnMouseUp ( событие OnMouseDown не пробовал). В Win32 всё нормально. HitTest установлена как True. При нажатии на кнопку вокруг неё появляется серый ореол, при повторном нажатии исчезает. На кнопке установлен произвольный стиль. Среда Delphi 11.
Может что с настройками? Или есть обходной путь? Собственно мне надо , чтобы как на картинке было 4 кнопки.
-
Ну кривенько-корявенько, заработало всё-таки по первыому подходу
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;
+ После дисконнекта остановку потока.
Кривенько, потому, что информацию об отключении я получаю по факту того, что мне перестали подступать данные. А наверняка есть напрямую решение.
-
Да, так работает, хотя в целом коннект и так и так занимает порядка секунды.
Про подписку вы имеете ввиду что-то вроде этого кода на 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); }
-
57 минут назад, OnePeople сказал:
FAdapter.cancelDiscovery;
На это и пишет
Цитата[DCC Error] EasyBlueTooth.pas(144): E2362 Cannot access protected symbol TBluetoothAdapter.CancelDiscovery
Можно выбрать такой вариант вроде как это оно, но неточно.
ЦитатаFBluetoothManager.cancelDiscovery();
-
Я стал при восстановлении соедиениения делать дисконнект через
if (FSocket <> nil) then FSocket.close;
А потом реконнект.
Стала вываливаться ошибка "socket closed" . Видимо не рекоенктиваться потом.
По поводу
bluetoothAdapter.cancelDiscovery();
Пишет, что cannot access to protected symbol...
-
4 часа назад, mixi сказал:
Положите Image. В Image - карту, сверху на Image - Label
Да, так не затирается.
-
Всё таки Canvas.FillText, работает, как не странно.
Пойду таким путём.
10 часов назад, krapotkin сказал:поэтому берете модель данных, отрисовываете ее на битмап. в том числе текст. битмап выводите на PaintBox или TImage, пофиг.
Я к сожалению не понял, что собственно в битмап должен обрисовывать и каким оператором. У меня есть текст String, который я сейчас засовываю в Label. Это и есть "модель данных" в ваших терминах?
-
Сделал работу с 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' .
Иногда восстановления связи даже после однократного перезапуска программы не происходит.
Кто-то решал подобную задачу?
-
Если в PaintBox - всё равно затирается. То есть если код заменить на
PaintBox1.Canvas.BeginScene(); PaintBox1.Canvas.DrawBitmap(MainBmp,r1,r2,1,False); PaintBox1.Canvas.EndScene();
то затирается. Причём даже игнорируется расположение этого PaintBox на форме.
Второй вариант какой-то изврат. Тогда эти Label вообще проще выкинуть на помойку и использовать что-то вроде Canvas.FillText (не удивлюсь, правда если это работать не будет, в VСL по крайней мере
Canvas
.
TextOut работал) .
Собственно вот пример что должно быть , есть карта, есть цифры. Цифры должны быть текстом, потому, что динамически меняется цвет. И числа тоже могут меняться.
-
Если я в OnPaint формы провожу такую прорисовку
Canvas.BeginScene(); Canvas.DrawBitmap(MainBmp,r1,r2,1,False); Canvas.EndScene();
То затираются все Label , Edit и всё прочее на форме. Как сделать ,чтобы у меня отрисовывалась картинка , которую я хочу. А поверх неё эти Label , Edit и т.д. ?
-
К сожалению , до сих пор в Runtime нельзя менять цвет прогресс бара, так что по сравнению с VCL версии польза от него так себе. Легче что-то своё запилить.
Кстати может кто-то уже запилил?
-
Можете тестовый пример скинуть, как вы читаете?
-
8 минут назад, OnePeople сказал:
Можно ссылку на вопрос?
-
В итоге решил проблему обходным путём. Сделал проверку репаинта.
procedure TForm2.Label1Paint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); begin RepaintFlag := True; end;
В процедуре с таймером добавил.
if not RepaintFlag then exit;
К сожалению , как и говорил GASCHE пришлось убрать внешний цикл и заменять на 10 вызовов по таймеру, без убирания , увы не работает.
Дополнительное питание USB
в USB
Опубликовано
А хочеться. Например сделав свою зарядку. Которая бы подавала питания и одновременно была бы подключена к периферии через D+ и D-.
И надо сказать Levovo TB-8505F именно это и разрешает к примеру. Но у него зато обратная проблема.
Я зарядил до 100% и вот тогда почему-то планшет с какого до бодуна не хочет обмениваться данными и говорит No Permisson. То есть когда идёт зарядка, он обменивается данными. А когда зарядки не идёт, как раз и не обменивается, хотя ожидается , что он себя будет вести ровно наоборот.
При этом у меня в манифесте стоит
AndroidManifest.rar