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

krapotkin

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

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

  • Посещение

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

    209

Весь контент krapotkin

  1. Ссылки на исходники https://bitbucket.org/vkrapotkin/vklistview/src/master/ https://bitbucket.org/vkrapotkin/vkexpressionparser/src/master/ https://bitbucket.org/vkrapotkin/vkshadowgenerator/src/master/
  2. e THttpClient есть свойства в которых есть слово Timeout. Их можно установить, и запрос будет вываливаться по Exception поэтому нужно добавить обработку Try Except вместо или дополнительно к Try Finally в обработчике Except можно куда-то записывать результат или так же через синхронизацию например выводить сообщение на экран
  3. зачем так сложно? вешаем на OnTerminate потока обработчик. В нем запускаем следующее задание и т.д..
  4. ListView - это отображение а не хранение. лучше сортировать источник данных
  5. рыть лучше всего в сторону модели данных сортировать данные там, и заново выводить в ListView и нет проблем
  6. krapotkin

    [IOS]Эфект сердца

    http://docwiki.embarcadero.com/Libraries/Rio/en/FMX.Filter.Effects.TAffineTransformEffect не оно?
  7. Столкнулся с необходимостью генерировать тень в соответствии с material design guide дополнительное условие - тень нужна не привязанная к контролу, т.е. просто прицепить TShadowEffect нельзя интернет сказал мне, что одной тени недостаточно, стал ставить эксперименты с двумя. эмпирически подобрал алгоритм и параметры, которые дают довольно близкий к гайду результат 1. https://material.io/design/environment/light-shadows.html#shadows 2. мой скриншот положил сюда https://bitbucket.org/vkrapotkin/vkshadowgenerator Механизм работы понятен из приложенного примера. В принципе можно применять те же параметры и к обычным TShadowEffect
  8. Считалось, что до RIO TBitmap НЕ потокобезопасен. В RIO рапортовали, что справились с этим. Не помню, проверял кто или нет Но TBitmapSurface был потокобезопасен уже тогда. Возможно, стоит готовить данные там, а потом просто отдавать в Bitmap https://stackoverflow.com/questions/37602538/delphi-tbitmap-to-string-via-tbitmapsurface-and-back-to-tbitmap https://stackoverflow.com/questions/51523321/how-to-draw-fmx-surface-tbitmapsurface-on-fmx-graphics-tbitmap/51526855
  9. Короче, действуем примерно так. Я надеюсь, что базовые действия - скачать google latest adb driver - мы уже провели, но наш No- или Brand- name телефон недоступен Тогда 1) идем в диспетчер устройств, находим там наше невстающее устройство, кликаем дважды, и на закладке Сведения выбираем свойство ИД оборудования. Копируем себе что-то типа 2) идем к файлам того самого драйвера, открываем android_winusb.inf находим разделы [Google.NTx86] и [Google.NTamd64] и вписываем туда, прямо в оба ;galaxy tab a 2019 %SingleAdbInterface% = USB_Install, USB\VID_04E8&PID_6866 %CompositeAdbInterface% = USB_Install, USB\VID_04E8&PID_6866&MI_01 3) делаем обновить драйвер, выбираем вариант Вручную, и указываем тот модифицированный файл если не берет автоматом, то "Выбрать из списка уже установленных..." --> "Есть диск" --> "Да, мне пофиг что он не подписан" 4) The End
  10. Взять в опциях ide search path ту папку, которая подходит, и юзать
  11. В процессе разработки столкнулся с очень странной ситуацией, корни которой до сих пор неясны, но решение нашлось. Итак. Делфи 10.3.3. Чистое приложение - пустая форма и кнопка. Отлично работает на разных устройствах кроме Samsung Galaxy Tab A (2016). Android 5.1.1 Программа падает, не успев даже загрузиться. Любая. При этом она же, скомпилированная на другом компе, запускается нормально. И даже после изменения SDK/NDK на нем, ничего не падает. LogCat дает крайне странную картину java.lang.IllegalArgumentException: Unable to load native library: /data/app-lib/com.embarcadero.Project1-1/libProject1.so Начинаем экспериментировать с SDK, NDK и т.д. Поставил также хотфиксы для 10.3.3. Сразу скажу, SDK/NDK ставились отдельно через Android studio, не скачивались вместе с Delphi. Не торопитесь бросать чтение на этом месте!)) На другом компе, где все работает, все ставилось точно так же. Короче, очень много комбинаций версий SDK/NDK проверено. Результат такой. При постепенном понижении версии NDK все взлетело при NDK v22. При этом версия SDK видимо такого большого влияния не имеет, потому что этот вариант нормально работает Повторюсь. На других устройствах все работало и на более новых Ndk. Xiaomi Mi Pad4 , Samsung Galaxy Tab A (2019), Xiaomi Redmi 5 и 5Plus Спасибо за участие и помощь в разборе завалов @Andrey Efimov
  12. что-то не сходится в показаниях я тоже абсолютно корректно посылаю принимаю данные на win и android и все в правильной кодировке безо всяких ухищрений примерно аналогичным кодом что-то важное вы скрываете... vResp := Http.Post(vURL, PostData, FResStream, FHeaders); как версию рассматриваю еще кодирование TNetEncoding.URL.Encode( хотя я например посылаю JSON в POST без кодирования и сервер все принимает нормально
  13. а все-таки, заголовки какие передаются? мало ли что мы предполагаем. я помню, раскапывал код Post, так они там вообще не всегда прикладывались. Выбрал вариант, где они есть в явном виде и с тех пор использую его...
  14. полезные ссылки https://android-tools.ru/coding/delimsya-fajlami-v-android-s-pomoshhyu-fileprovider/ https://www.delphiworlds.com/2018/06/targeting-android-8-and-higher-continued/
  15. От программиста никаких действий не требуется. Система любезно сообщает, что откуда попало не ставит, но вот вам переход прямо на нужную настройку. Переходим, включаем, нажимаем back и продолжаем установку...
  16. У меня в работе два приложения, и оба они не предназначены для Play market, так как имеют ограниченный круг использования, по сути, чисто внутрикорпоративные. Так что нежелательно и выкладывание их и на альтернативные магазины приложений. Автоматически возникает вопрос обновления. Если в первый раз мы можем установить приложение сами при помощи админов, то обновлять их не так просто. А контингент пользователей не справится с "скачайте APK по ссылке, найдите, куда его скачал браузер, и запустите вручную именно последний скачанный, а не какой попало"... Простейший способ - дать приложению скачать свежую копию с сайта и натравить на полученный файл системный инсталлер. Вот только свежие Andoird делать это напрямик запрещают. Нужен filepropvider. Целый день шуровал по мануалам и YT, Вот то что получилось в результате. Если у вас 10.3.3 как у меня, уже можно не вносить <provider>...</provider> в манифест и свой файл file_paths.xml (или как вам его советуют назвать в интернетах) в деплой. Теперь все это делается хоть несколько странно и однобоко, но автоматически, путем установки галочки Secure File Sharing после этого в манифесте автоматически пропишется один из вариантов размещения файлов, которые вы можете найти в интернете. Используется алиас external-path файл, показанный на рисунке, создается автоматически самой делфи. теперь остается отгадать, какой путь реально подставится вместо "." Как показала практика, все пути выглядят не так, как кажется, если исходить из простого здравого смысла. Целый день использования GetHomeDir и других полезных методов TPath завел меня совсем в тупик. Оказалось все проще (?) st:TMemoryStream; OutputDir: JFile; ApkFile: JFile; ApkUri: Jnet_Uri; path, filename: string; ... OutputDir := TAndroidHelper.Context.getExternalCacheDir(); path := JStringToString(OutputDir.getAbsolutePath); filename := path+'/ASDroid2.apk'; ApkFile := TJfile.JavaClass.init( StringToJstring(filename)); FApkUri := TAndroidHelper.JFileToJURI(ApkFile); st.Position := 0; st.SaveToFile(filename); обратите внимание, в provider_paths мы задаем external-paths, а в коде ищем ExternalCacheDir.!!! (For.Unbelievably.Creative.Knowers!) Потом все просто. FApkUri передаем в интент и запускаем итоговый код примерно таков. (скачивание в потоке с использованием небольшого собственного API, но там ничего важного, можно не обращать внимания) procedure TasdSettingsFrame.bDownloadClick(Sender: TObject); begin {$IFDEF ANDROID} bDownload.Enabled := False; DownloadAndRun(); {$ENDIF} end; {$IFDEF ANDROID} procedure TasdSettingsFrame.DownloadAndRun(); begin ttask.Run(procedure var aapi:TasdAPI; st:TMemoryStream; OutputDir: JFile; ApkFile: JFile; ApkUri: Jnet_Uri; path, filename: string; begin st := TMemoryStream.Create; aapi := TasdAPI.Clone(_API); try aapi.OnReceiveData := OnReceiveData; aapi.getApk(st); if aapi.Err.Code=0 then begin OutputDir := TAndroidHelper.Context.getExternalCacheDir(); path := JStringToString(OutputDir.getAbsolutePath); filename := path+'/ASDroid2.apk'; ApkFile := TJfile.JavaClass.init( StringToJstring(filename)); FApkUri := TAndroidHelper.JFileToJURI(ApkFile); st.Position := 0; st.SaveToFile(filename); TThread.Synchronize(nil,procedure begin bDownload.Enabled := true; StartActivity(FApkUri); end); end; finally st.Free; aapi.Free; end; end); end; procedure StartActivity(ApkUri: Jnet_Uri); var Intent: JIntent; begin Intent := TJIntent.Create(); Intent.setAction(TJIntent.JavaClass.ACTION_VIEW); Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK or TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_TOP or TJIntent.JavaClass.FLAG_GRANT_WRITE_URI_PERMISSION or TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION); Intent.setDataAndType(apkuri, StringToJString('application/vnd.android.package-archive')); TAndroidHelper.Activity.startActivity(Intent); end; procedure TasdSettingsFrame.OnReceiveData(const Sender: TObject; AContentLength: Int64; AReadCount: Int64; var Abort: Boolean); begin tthread.Synchronize(nil, procedure begin pb1.Max := AContentLength; pb1.Value := AReadCount; end); end; {$ENDIF} Вопросы остались конечно, почему так странно с каталогами, но выяснять пока нет желания. Работает - не трожь. Всем удачи. UPD. Для того, чтобы системный инсталлер запускался, нужно не забыть отметить еще одну галочку
  17. Отличие я рассказал. Деструктор должен вызываться сам. Архитектура на это рассчитана. Если не вызывается, значит что программа несовместима с ней. Это никак не говорит о том, что она не будет работать. Но говорит о том что внутри - мины
  18. все-таки вернусь к логической загадке ARC 1. если вы все ссылки на объект обнулили, то вызывать его деструктор не требуется, его вызовут за вас 2. если не все обнулили, но вызвали деструктор, значит имеем нехилую вероятность того, что кто-то, у кого осталась ссылка, обратится по ней к объекту. тогда мы имеем гарантированный AV 3. Тогда зачем все эти варианты с DisposeOF ??? У меня вся программа на фреймах построена, и ничего, создаются удаляются. При этом отлаживаюсь я в Win64, а потом запускаю на Andoird. И все работает штатно в обоих случаях. Единственное отличие, я обычно не указываю владельца (Owner). Т.е. F:=TMyFrame.Create(NIL) После использования сам убираю за собой F.Parent:=NIL; FreeAndNil(F) и все норм. В некоторых фреймах еще большинство компонентов в динамике создается и пересоздается. и тоже никаких явных вызовов деструктора. Так что лучше все-таки следовать архитектуре, а не раскладывать костылики...
  19. эта проблема с диалогами решалась уже 100500 раз MyDialogs от ZuBy где то тут на сайте болтается вот мой текущий вариант этой же задумки тут https://bitbucket.org/vkrapotkin/vkdialogs/src/master/ видел в наборах компонентов тоже диалоги примерно так же реализованные
  20. описать класс - узел дерева вообще не вижу проблем
  21. я ж вроде расписал что как в другом форуме ? что не так?
  22. А также Cannot find style resource fir Windows. Воспроизведение 1. создать новое FMX приложение 2. кинуть TSyleBook 3. зайти по двойному щелчку4. попытаться добавить платформурезультат (1) 5. добавить Windows, Android. Удалить Default. закрыть StyleBook editor6. Положить кнопку, ПКМ, Edit Custom Style7. Результат если же просто сначала кинуть кнопку, сделать ПКМ, Edit custom Style, то картина совсем другая поэтому и не находит ни Windows ни Android Соответственно Workaround - найти в FMX Platform = 'Android' и заменить на Platform = 'AndroidL Light' Platform = 'Windows' тоже возможно надо будет заменить, но с ней проблем вроде нет пока. Все это делал на Windows 7 x64 Pro SP1
  23. самое простое в OnResize проверять значения ширины-высоты
  24. что вы хотите с ними быть ? фрейм создается, встраивается в форму и берет стили из ее Stylebook нет никаких проблем
×
×
  • Создать...