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

Лидеры

  1. PowerOwl

    PowerOwl

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


    • Баллы

      23

    • Постов

      40


  2. Andrey Efimov

    Andrey Efimov

    Модераторы


    • Баллы

      17

    • Постов

      833


  3. Tumaso

    Tumaso

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


    • Баллы

      4

    • Постов

      262


  4. Евгений Корепов

    Евгений Корепов

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


    • Баллы

      4

    • Постов

      734


Популярный контент

Показан контент с высокой репутацией за 27.06.2021 во всех областях

  1. Andrey Efimov

    Android 10 и муз.плеер

    У меня на устройстве с Андроид 11 и эмуляторе с Андроид 7.1.2 приложение не падает. По теме, делайте дебаг версию и ищите устройство на котором падает, запускайте monitor.bat и приложение, снимайте логи и выкидывайте их сюда. Это нужно сделать как минимум для того чтобы убедиться в ваших догадках (что происходит падение из-за сервиса). Так же попробуйте вынести в кнопку код запуска сервиса. Документация по Foreground service: https://developer.android.com/guide/components/foreground-services
    3 балла
  2. Vitaldj

    Android 10 (API уровня 29)

    Вы fgx видели?
    2 балла
  3. Официальная новость - Delphi & C++Builder FREE Community Editions Updated to Version 10.4.2 Are Now Available! Пока надо будет получать для этой версии новые ключи, старые от 10.3.3 не подходят
    2 балла
  4. Tumaso

    Android 10 (API уровня 29)

    Осталось понять, зачем нам здесь реклама флаттера?
    2 балла
  5. Andrey Efimov

    Android 10 и муз.плеер

    но при этом подсовываете туда библиотеку bass... В этих папках (кроме arm64-v8a (для 64 бит) и armeabi-v7a (для 32 бит)) должны лежать заглушки, которые в случае несовместимости с девайсом буду выдавать сообщение типа такого "Application does not support this device". Собственно, PowerOwl, уже сделал предположение.
    2 балла
  6. PowerOwl

    Android 10 и муз.плеер

    У меня, кстати, появилось предположение, почему прога запустилась у меня на Android 10, но на Android 6.0.1 и у Олега Киреева на Android 10 - нет. Возможно, это связано с тем, что Вы скомпилировали приложение только под Android 64. У моего телефона процессор 64-разрядный(Samsung Exynos 7 Octa(5433)), но, как сказала Aida64, 32-bit Mode. У Олега Киреева процессор Samsung Exynos 7 Octa 7870, тоже 64-разрядный, но, поскольку разница между датами выхода чипов всего 2 года, то, возможно, он тоже работает в 32-битном режиме. На Нокиа 3.1, на которой всё работало, стоит 64-разрядный Mediatek MT6750n. Сейчас ещё проверю на Самсунг Ноут 10+ с чипом Qualcomm Snapdragon 855 в 64-разрядном режиме. Вот тут было обсуждение по поводу устройства на базе такого же чипа, как у Олега, где оказалось, что ЦПУ поддерживает 64-битные инструкции, но прошивка - нет: https://stackoverflow.com/questions/49184689/why-does-my-android-device-with-armv8-based-cpu-cores-exynos-7-octa-7870-not-s
    2 балла
  7. Оставлю тут код демо-проекта и обёртку для WallpaperManager, кому-нибудь в будущем пригодятся. // Подключить System.IOUtils, Androidapi.JNI.GraphicsContentViewText, // Androidapi.JNI.JavaTypes, // Androidapi.helpers, android.app.WallpaperManager; (android.app.WallpaperManager распаковать и закинуть к исходникам проекта) //перейти в Project->Options->Application->Uses permissions и поставить галочку напротив пункта "Set wallpaper" procedure TForm1.Button1Click(Sender: TObject); var path: string; str: JString; Wallpaper: JWallpaperManager; Image: JBitmap; Context: JContext; begin if Edit1.Text <> '' then begin path := Tpath.Combine(Tpath.GetDocumentsPath, Edit1.Text); //Вместо TPath.GetDocumentsPath можно написать путь к любой директории на //устройстве, вместо Edit1.text - название картинки(с расширением, важно соблюдать регистр!!!) str := StringToJString(path); Context := SharedActivityContext; try if FileExists(path) then begin ShowMessage('Файл найден'); Image := TJBitmapFactory.JavaClass.decodeFile(str) end else ShowMessage('Файл не найден'); except ShowMessage('Не удалось декодировать'); end; try Wallpaper := TJWallpaperManager.JavaClass.getInstance(Context); Wallpaper.setBitmap(Image); except ShowMessage('Не удалось установить обои'); end; end; end; android.app.WallpaperManager.pas.7z
    2 балла
  8. slav_z

    FMX: Скроллинг и нажатия

    Все разработчики при работе с FMX рано или поздно сталкиваются с одной и той же проблемой: необходимо исключить "случайное" срабатывание нажатий элементов внутри скроллбокса во время его скроллинга. Идут годы, а решения так и нет. Давайте попробуем это исправить. Поехали! Запускаем IDE, создаем новый проект, кидаем на форму TVertScrollBox и на него чего-нибудь побольше... запускаем на мобильном устройстве, пытаемся скроллировать, получаем проблемы в виде срабатывания разных событий типа OnClick элементов. Решение состоит в том, чтобы сделать элементы "невидимыми" для событий связанных с действиями пользователя с экраном во время скроллинга. Делаем следующее: Все. Переносим код в базовую форму, делаем его более гибким, убираем все те костыли, которые мы уже успели сделать ранее... Удачи! https://github.com/slav-libx/scroll-click.git
    1 балл
  9. Hevard

    Android 10 (API уровня 29)

    Осталось понять, а как быть с андроид 11?
    1 балл
  10. Олег Киреев

    Android 10 и муз.плеер

    Да и у меня "падает". С Уважением. Олег Киреев.
    1 балл
  11. PowerOwl

    Android 10 и муз.плеер

    Логи: FATAL EXCEPTION: main Process: com.embarcadero.PublicRadio, PID: 9717 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.embarcadero.PublicRadio/com.embarcadero.firemonkey.FMXNativeActivity}: java.lang.IllegalArgumentException: Unable to load native library: /data/app/com.embarcadero.PublicRadio-1/lib/arm/libPublicRadio.so at android.app.ActivityThread.performLaunchActivity(ActivityThread.java) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java) at android.app.ActivityThread.access$1100(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java) at android.os.Handler.dispatchMessage(Handler.java) at android.os.Looper.loop(Looper.java) at android.app.ActivityThread.main(ActivityThread.java) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java) Caused by: java.lang.IllegalArgumentException: Unable to load native library: /data/app/com.embarcadero.PublicRadio-1/lib/arm/libPublicRadio.so at android.app.NativeActivity.onCreate(NativeActivity.java) at com.embarcadero.firemonkey.FMXNativeActivity.onCreate(FMXNativeActivity.java:135) at android.app.Activity.performCreate(Activity.java) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java) ... 10 more Библиотека libPublicRadio.so по пути /data/app/com.embarcadero.PublicRadio-1/lib/arm присутствует, значит что-то не так с самой библиотекой. Тут уже можно только гадать. Я бы на вашем месте попробовал создать новый проект, перенести в него код и компоненты со старого и попробовать скомпилировать сразу под Андроид-32.
    1 балл
  12. PowerOwl

    Android 10 и муз.плеер

    Сам не обратил внимания на это. Для Ingalime: Ваш apk внутри выглядит так: В директории lib должны находится библиотеки необходимые приложению. Для каждой архитектуры процессоров нужны свои библиотеки. Следовательно они рассортированы по каталогам: Внутри каталога arm64-v8a всё необходимое присутствует: Соответственно, при установке приложения на 64-битное устройство, установщик будет доставать файлы отсюда. Однако, если устанавливать на 32-битное устройство, то установщик будет доставать файлы уже из каталога armeabi-v7a: В этом каталоге есть библиотека BASS, значит вы её всё-же задеплоили. Однако других файлов приложения тут нет, из-за чего оно и крашится при запуске.
    1 балл
  13. Vitaldj

    APK для гугл Store

    Если честно, а чем проблема сделать aab и послать как требует Google ? Делая простой apk вы обкрадываете 32 или 64 бита.
    1 балл
  14. Andrey Efimov

    Android 10 и муз.плеер

    Вот что сейчас я вижу на Delphi 10.4.2 для чистого проекта Project1 и сервиса: Релиз для 32 бит (Application store/Development): armeabi - заглушка libProject1.so. armeabi-v7a - проект libProject1.so, сервис и т.д. mips - заглушка libProject1.so. Релиз для 64 бит (Development, для Application store создаётся aab файл(который может включать в себя 32 битную версию)) arm64-v8a - проект libProject1.so, сервис и т.д. Библиотеку bass я бы положил только в armeabi-v7a (для 32 бит) и arm64-v8a (для 64 бит). Эти галочки управляются из блока Project Manager, в зависимости от выбранной битности и конфигурации(Debug/Release и Application store/Development). Поэтому, если вы снимали их самостоятельно (через Deployment Manager), то рекомендую поставить их обратно, т.е. вернуть в дефолтное состояние. Повторюсь, сейчас нужно собрать 32 битную версию и выложить сюда для теста (возможно, PowerOwl или Олег смогут проверить). p.s. Вопрос, какую версию студии вы используете?
    1 балл
  15. PowerOwl

    Android 10 и муз.плеер

    Крайне сильно поддерживаю. У меня самого сейчас в проекте настал момент, когда нужно написать службу переднего фона, а инфы в интернете централизованной нет.
    1 балл
  16. Проблемы появились. Но всё же я нашёл решение. Короче. Всё дело в том, что Дельфя почему-то решила, что одной директивы {$R *.LgXhdpiPh.fmx ANDROID} ей мало, и почему-то решила добавить ещё по одной на каждый юнит. Решение простое:
    1 балл
  17. Ingalime

    Android 10 и муз.плеер

    Cкриншот деплоя 64 бит. 32 бит я не компилировала вообще. С дебагом у меня тоже были проблемы. Компилятор ембаркадеро упорно писал что не может распознать Readmi5A и отваливался. Компилировала в релизе с ShowMessage-ми в поисках ошибок. Если у кого есть терпение на скачивание то ссылка на весь проект: http://nsnllc.um.la/delphi82FMX.zip Проект у меня по пути C:\Users\Lena\Documents\Embarcadero\Studio\Projects\delphi82 Хотелось бы по окончании дискуссии, чтобы на этом форуме кто-то из специалистов выложил статью как правильно создать службу переднего плана в дельфи. Служба весьма полезная, но централизованной информации нет и вообще все странно работает - в одних версиях нормально, в других падение.
    1 балл
  18. Andrey Efimov

    Android 10 и муз.плеер

    Скриншот Deployment Manager'а в "студию" (для 32 и 64 битной версии). Отсортируйте по столбцу Local Name.
    1 балл
  19. PowerOwl

    Android 10 и муз.плеер

    Но у меня на десятке на Нокиа всё запускалось и работало. Надо бы действительно протестировать на разных устройствах, но у меня, к сожалению, у компьютера настолько древний процессор, что на нём просто не запускается эмулятор от Android Studio.
    1 балл
  20. Олег Киреев

    Android 10 и муз.плеер

    И в этой новой версии OS сообщает "В приложении произошёл сбой". С Уважением. Олег.
    1 балл
  21. PowerOwl

    Android 10 и муз.плеер

    Честно, сам понятия не имею, где эмулятор в 10.4. Можно использовать эмуль от Android Studio, там можно и на куче версий андроида проверить(там вроде от 4.4 до 11), и проэмулировать разные устройства, и ещё кучу всяких настроек. Вот ссылка на документацию абракадабры, там вроде всё расписано: https://www.embarcadero.com/starthere/xe7/mobdevsetup/android/en/creating_an_android_emulator.html Хотя я у себя не нашёл эмулятора, может его вырезали в новых версиях RAD Studio.
    1 балл
  22. PowerOwl

    Android 10 и муз.плеер

    На шестёрке все ещё падает.
    1 балл
  23. PowerOwl

    Android 10 и муз.плеер

    Ну так эмуляторы ведь есть.
    1 балл
  24. Олег Киреев

    Android 10 и муз.плеер

    Здравствуйте. Ваше приложение на моём устройстве с OS Android 10 "падает". С Уважением. Олег.
    1 балл
  25. Tumaso

    Android 10 и муз.плеер

    @Ingalime на Android 11 у меня работает
    1 балл
  26. Здравствуйте! Хочу поделиться своим опытом в использовании класса android.app.DownloadManager из Android API. Понятно из названия, что этот класс предоставляет пользователю возможность скачивать и сохранять файлы из интернета. Конечно, можно использовать HTTPClient, но по моему мнению использование DownloadManager гораздо легче. Возможности, предоставляемые классом: 1.Скачивание любого файла из интернета с последующим сохранением 2.Вывод уведомления о процессе загрузки с настраиваемым названием и описанием 3.Разрешение загрузки только через конкретный вид сети, через роуминг, когда девайс заряжается и т.д. Вот ссылки на официальную документацию по классу DownloadManager и его подклассу DownloadManager.Request: https://developer.android.com/reference/android/app/DownloadManager https://developer.android.com/reference/android/app/DownloadManager.Request Демо-проект и обёртку для класса и прикрепил внизу. В примере по нажатию на кнопку происходит загрузка картинки в директорию /storage/emulated/0/Pictures ----------------------------------------------------------------------------- Для начала, необходимо подключить библиотеки, необходимые приложению для работы: uses androidapi.JNI.JavaTypes, androidapi.Helpers, androidapi.JNI.GraphicsContentViewText, android.app.DownloadManager, androidapi.JNI.Net, System.Permissions, Androidapi.JNI.Os; Теперь нужно запросить у пользователя разрешение на запись в хранилище: procedure TForm1.FormCreate(Sender: TObject); var WRITE_EXTERNAL_STORAGE:String; begin WRITE_EXTERNAL_STORAGE:=JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE); PermissionsService.DefaultService.RequestPermissions([WRITE_EXTERNAL_STORAGE], procedure(const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>) begin if (Length(AGrantResults)=1) and (AGrantResults[0]=TPermissionStatus.Granted) then ShowMessage('Permission granted!') else begin Showmessage('Permission Denied! Manually go to "Settings-Applications-Project1-Permissions" and set Storage permission!'); Application.Terminate; end; end ) end; Если разрешение получено, то появится сообщение "Permission granted!", если нет, то программа попросит пользователя перейти в настройки и установить разрешение вручную. Отлично, разрешение получено, теперь можно написать и саму процедуру загрузки файла. procedure Download(code: string); //процедура будет получать уникальный код картинки на сайте pixabay.com var DownloadManager: JDownloadManager; //Объект класса DownloadManager для загрузки файла DownloadRequest: JDownloadManager_Request; //Объект класса DownloadManager_Request для установки настроек загрузки link: JString; //Переменная для хранения ссылки URI, URIPath: JNet_URI; //В URI будем получать ссылку на картинку, в URIPath - путь к загруженной картинке в файловой системе DownloadPermission: JObject; //Объект для получения доступа к сервису загрузки begin link := StringToJString('https://pixabay.com/get/' + code + '_1280.jpg'); //получаем ссылку на картинку URI := TJNet_URI.JavaClass.parse(link); //заносим ссылку в URI URIPath := TJNet_URI.JavaClass.parse(StringToJString('file:///storage/emulated/0/Pictures/img.jpg')); //заносим путь в URIPath DownloadRequest := TJDownloadManager_Request.JavaClass.init(URI); //инициализируем DownloadRequest с ссылкой на файл DownloadRequest.setDestinationUri(URIPath); //Устанавливаем конечный путь в DownloadRequest DownloadPermission := SharedActivityContext.getSystemService //Получаем доступ к сервису загрузки (TJContext.JavaClass.DOWNLOAD_SERVICE); DownloadManager := TJDownloadManager.Wrap(DownloadPermission); //Даём доступ к сервису загрузки DownloadManager'у DownloadManager.enqueue(DownloadRequest); //Запускаем загрузку end; Вот и всё, осталось только процедура нажатия на кнопку procedure TForm1.Button1Click(Sender: TObject); begin Download('g1e06713e4c5d9a9c5356f9e481ca8c37a7800ff986743fe4364aef699782e22b6a41f794dfd54ed32783eb0a577dc21b4dd2ba8fd83b6722740285291263d718'); end; Теперь можно компилировать программу и проверить, работает-ли она. Если всё сработало, то в директории Pictures должен появиться файл "img.jpg", содержащий в себе изображение тюльпанов. Надеюсь, это Вам поможет, если у Вас будут проблемы с загрузкой файлов. Удачи в проектах! File Downloading.7z
    1 балл
  27. Если я правильно понял, то .. uses System.Net.URLClient, System.Net.HttpClient, System.Net.HttpClientComponent; .. procedure Button1.Click(Sender:TObject); begin Memo1.lines.LoadFromStream(NetHTTPClient1.Get('http://yoursite.com/').ContentStream); end;
    1 балл
  28. Andrey Efimov

    Android 10 и муз.плеер

    Есть два варианта: 1) Добавить в промежуточном манифесте (находится тут: Project\Android\Debug\AndroidManifest.xml) Находим: <service android:exported="false" android:name="com.embarcadero.services.serPublic" /> Заменяем на: <service android:exported="false" android:foregroundServiceType="mediaPlayback" android:name="com.embarcadero.services.serPublic" /> Делаем деплой проекта. 2) Прописать сервис в шаблоне (находится тут: Project\AndroidManifest.template.xml) Примерно вот так. Находим: <%services%> Заменяем на: <service android:exported="false" android:foregroundServiceType="mediaPlayback" android:name="com.embarcadero.services.serPublic" /> <service android:exported="false" android:name="com.embarcadero.firebase.messaging.ProxyFirebaseMessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> <service android:exported="true" android:name="com.google.firebase.messaging.FirebaseMessagingService"> <intent-filter android:priority="-500"> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> <service android:exported="false" android:name="com.google.firebase.components.ComponentDiscoveryService"> <meta-data android:name="com.google.firebase.components:com.google.firebase.iid.Registrar" android:value="com.google.firebase.components.ComponentRegistrar" /> </service> Делаем сборку и деплой. p.s. Возможно есть ещё способы, я давненько не касался темы сервисов..
    1 балл
  29. Tumaso

    Android 10 и муз.плеер

    Мне кажется, что </service> (после <service android:foregroundServiceType="mediaPlayback" />) лишнее и его нужно удалить, т.к. предыдущий тег уже закрыт
    1 балл
  30. Andrey Efimov

    Android 10 и муз.плеер

    Возможно, для Андроид 10-11, необходимо указывать тип службы. (в манифесте: foregroundServiceType и в startForeground)
    1 балл
  31. Подключить Firebase не получилось. Напишу по памяти, так как время прошло уже прилично и это мои собственные умозаключения не претендующие на истину. Было много различных попыток подключить Firebase , основная проблема, что нет в наличии библиотеки jar, последняя библиотека лежит в maven репозитории и она уже устарела, по-моему от 2019 года. Ссылка на maven репозиторий Firebase, да и многие другие предлагают использовать только Gradle, что не дает мне возможность использовать это для Delphi . После общения с поддержкой от Firebase (если сильно упростить), мне предложили изменить среду разработки. Но приложение уже было полностью готово для двух мобильных платформ, и мне пришлось искать другие SDK. Я перебрал многие, которые предлагали помимо установки с помощью Gradle, скачать SDK в виде файла jar или aar (из aar иногда можно добыть jar, но это только иногда, например в последних firebase его там нет) Забыл сказать, что для всех манипуляций, обязательно нужна установленная и запущенная Android Studio, и подключенный телефон, на который Delphi устанавливает приложение. В Android Studio я собрал проект с таким же именем, как и у моего Delphi приложения, для удобства отладки и контроля логов logcat. В приложение на Android Studio я подключил через Gradle нужное мне SDK и проверил его работоспособность, скопировал логи правильной работы приложения, отследил результаты на сайте аналитики, увидел что они действительно появились, и все данные телефона (размер экрана, марка ...) пришли в аналитику. Включил режим debag на стороне аналитики. Эти действия я проделывал и с Firebase, приложение написанное на Android Studio запускалось без проблем, приложение написанное на Delphi, в силу отсутствия новой библиотеки jar не запускалось и сыпало в logcat целые "простыни" ошибок, никакие данные в аналитику не приходили. Я пробовал вытащить нужную мне библиотеку Firebase из собранного в Android Studio dex файла, рабочего приложения. Затем вычленить из него нужные мне файлы и прикрепить их Delphiпроекту в виде jar библиотеки, но появлялась новая проблема, конфликты с уже установленными библиотеками на Delphi, отключение которых уже не позволяло собрать dex файл для Delphi проекта. Остановился я на SDK AppsFlyer, интеграция была возможна, так как сервис предлагал добавление SDK с помощью Gradle и возможность скачать и установить вручную. Саму библиотеку я подключил, но возникла проблема с получением событий, которые приходили например от google play Вот пример того что не получилось сделать: AppsFlyerConversionListener conversionListener = new AppsFlyerConversionListener() { @Override public void onConversionDataSuccess(Map<String, Object> conversionData) { for (String attrName : conversionData.keySet()) { Log.d("LOG_TAG", "attribute: " + attrName + " = " + conversionData.get(attrName)); } } Эти события, никак не удалось получить, и решить проблему не удалось, информации я не нашел. Было принято решение попробовать другое SDK. На этот раз это была Yandex AppMetrica, эта интеграция получилась. Для начала у них в доках по интеграции написано что есть возможность скачать jar и что все библиотеки (старые версии мне в дальнейшем тоже пригодились) есть в maven репозитории Далее я добавил библиотеку в проект, и приступил к созданию файла моста, для связи Вот сама библиотека: com.yandex.androidmobmetricalib3.20.1.jar.7z Файл мост я создавал с помощью утилиты java2op, которая находится в ... Embarcadero\Studio\21.0\bin\converters Но, при создании я получил ошибку, что-то там дублировалось и что-то мешало. Пытался проделать это с конкретным классом, но ничего не получилось. Оставалось только или делать файл ручками, или надеяться что в одной из старых библиотек все сгенерируется. Эмпирическим методом была найдена старая библиотека, в которой название методов нужного мне класса осталось прежним, а ошибка с дубликатами ушла. Файл мост был создан. Android.JNI.Yandex.pas.7z Осталось подключить его к моему приложению. Был создан класс, который работал с нужными мне методами SDK Yandex аналитики (Android.JNI.Yandex): unit YandexAnalytics; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, {$IFDEF ANDROID} Android.JNI.Yandex, Androidapi.Helpers, Androidapi.JNI.JavaTypes, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Os, Androidapi.JNI.App, {$ENDIF} FMX.Types; type TYandexMetrica = class private public {$IFDEF ANDROID} YAC : JYandexMetricaConfig; YA : JYandexMetrica; {$ENDIF} constructor Create; procedure SendEvent(Category, Action, LabelName : String; LabelValue : Integer); end; implementation constructor TYandexMetrica.Create; var AnKey, AnRepKey : JString; begin try AnKey := StringToJString('86e64a77-XXXX-XXXX-XXXX-XXXXXXXcbbc'); AnRepKey := StringToJString('20799a27-XXXX-XXXX-XXXX-XXXXXXX14180'); YAC := TJYandexMetricaConfig.JavaClass.newConfigBuilder(AnKey).withLogs().build; YA := TJYandexMetrica.Create; TJYandexMetrica.JavaClass.activate(TAndroidHelper.Context, YAC); TJYandexMetrica.JavaClass.enableActivityAutoTracking( TAndroidHelper.Activity.getApplication ); Log.d('================= TYandexMetrica.Created ======================'); EXCEPT on E : Exception do Begin Log.d( E.ClassName + 'YandexMetrica.Create -> ' + E.Message ); End; END; end; procedure TYandexMetrica.SendEvent(Category, Action, LabelName : String; LabelValue : Integer); begin {$IFDEF ANDROID} try Log.d( 'TRY YandexMetrica.SendEvent -> ' + Category + ',' + Action + ',' + LabelName + ',' + LabelValue.ToString ); TJYandexMetrica.JavaClass.reportEvent(StringToJString(Category), StringToJString('{"Action":"' + Action + '", "LabelName":"' + LabelName + '", "LabelValue":"' + LabelValue.ToString + '"}')); Log.d('================= Event Sended ======================'); EXCEPT on E : Exception do Begin Log.d( E.ClassName + 'YandexMetrica.SendEvent -> ' + E.Message ); End; END; {$ENDIF} end; end. В событии приложения onCreate создал экземпляр класса, и отправил событие YA := TYandexMetrica.Create; YA.SendEvent('AppEvent','Started',User.Client_Id, 0); Было добавлено в файл AndroidManifest.template.xml (информация из яндекс документов по интеграции) <%services%> <service android:name="com.yandex.metrica.MetricaService" android:enabled="true" android:exported="true" android:process=":Metrica"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="com.yandex.metrica.IMetricaService" /> <data android:scheme="metrica" /> </intent-filter> <meta-data android:name="metrica:api:level" android:value="16" /> </service> <receiver android:name="com.yandex.metrica.MetricaEventHandler" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.yandex.metrica.intent.action.SYNC" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.PACKAGE_ADDED" /> <action android:name="android.intent.action.PACKAGE_DATA_CLEARED" /> <data android:scheme="package" /> </intent-filter> <!-- Необходимо для трэкинга кампаний --> <intent-filter> <action android:name="com.android.vending.INSTALL_REFERRER" /> </intent-filter> </receiver> Пример логов из logcat, из которых видно что библиотека инициализирована, и отправлены два события [AppEvent] и [Balance] 2021-07-01 14:02:17.108 15138-15168/? I/AppMetrica: [ru.yandex.mobile.appmetrica] : [27889a6e-xxxx-xxxx-xxxx-xxxxxxxx3c64] Initializing of Metrica, Release type, Version 3.5.3, API Level 76, Dated 30.01.2019. 2021-07-01 14:58:48.979 18460-18460/? I/AppMetrica: Initializing of Metrica, Release type, Version 3.20.1, API Level 94, Dated 14.04.2021. 2021-07-01 14:58:49.033 18460-18531/? I/AppMetrica: Activate AppMetrica with APIKey 86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc 2021-07-01 14:58:49.033 18460-18531/? I/AppMetrica: [com.soclikes_ig] : [86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc] Enable activity auto tracking 2021-07-01 14:58:49.033 18460-18531/? I/AppMetrica: [com.soclikes_ig] : [86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc] Event received: AppEvent. With value: {"Action":"Started", "LabelName":"2905202123125", "LabelValue":"0"} 2021-07-01 14:58:49.034 18460-18531/? I/AppMetrica: Activate reporter with APIKey 20799a27-xxxx-xxxx-xxxx-xxxxxxxx4180 2021-07-01 14:58:49.233 18542-18567/? I/AppMetrica: Initializing of Metrica, Release type, Version 3.20.1, API Level 94, Dated 14.04.2021. 2021-07-01 14:58:49.263 18542-18567/? I/AppMetrica: Activate reporter with APIKey 20799a27-xxxx-xxxx-xxxx-xxxxxxxx4180 2021-07-01 14:59:13.975 18460-18531/? I/AppMetrica: [com.soclikes_ig] : [86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc] Event received: AppEvent. With value: {"Action":"ProfilesDeleted", "LabelName":"alex", "LabelValue":"319"} 2021-07-01 14:59:31.368 18460-18531/? I/AppMetrica: [com.soclikes_ig] : [86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc] Event received: Balance. With value: {"Action":"TrStart", "LabelName":"2905202123125", "LabelValue":"3"} Вот такие данные пришли в аналитику. +1 пользователь +2 события
    1 балл
  32. A_l_ex

    Андроид 9 и Интернет

    Если кто-то когда-то столкнется с подобной проблемой, обязательно добавляйте в манифест эту строчку, она спасет Вам дни или Недели тупого бездумного кодинга, в надежде понять почему TWebBrowser не в силах отобразить фрейм(iframe в котором как оказалось потом есть обращение к HTTP). А вы сидите на Андройде 8.1 или ниже а заказчик например на 9 и выше.
    1 балл
  33. Ну смотрите: 1) Как я уже говорил, вам необходимо ознакомиться с основами транслирования и использования АПИ. Например тут: Как создавать обёртки для JAVA-кода и тут: Как подключить и использовать свой JAVA-класс (статьи "малость" старые, но суть сохранилась.) Единственное, что могу добавить (про обёртки): Всё, что находится в interface(JObjectClass) вызывается так: TJНазваниекласса.JavaClass.НазваниеМетода/Поля Всё, что находится в interface(JObject) вызывается только через предварительно созданный/полученный объект. 2) На форуме, для кода используйте тег "Код", без подсветки кода (или как вам угодно). Это помогает повысить читабельность поста, отделить код от текста. Если вы используете обёртку не из стандартной поставки, то прикладывайте её к посту. Не редкость, что ошибки бывают в самих обёртках. 3) Из-за первого пункта вы начали копировать другие решения (не обдумывая). Я буду исходить из вашего изначального кода. Вам должно быть достаточно подключения AndroidAPI.JNI.GraphicsContentViewText, там всё уже реализовано (это я про обёртку для использования JBitmap и JBitmapFactory). Далее моё "гадание на кофейной гуще" (т.к. обёртку для WallpaperManager в вашем сообщении я не вижу). Исхожу из того, что она сгенерирована правильно. Значит в вашем коде, перед использованием метода setBitmap(Image); необходимо получить доступ к объекту WallpaperManager. Заходим по ссылке Android API: WallpaperManager, смотрим на описание и методы, видим метод Android API: WallpaperManager#getInstance, делаем вывод, что с помощью этого метода сможем получить доступ к объекту WallpaperManager, а далее попытаться использовать метод setBitmap. На этом, моё предсказание завершено (само собой не факт, что оно верное, но если бы передо мной стояла такая задача, то в самом начале, я поступил бы именно так), остаётся только попробовать. p.s. Автоматический генератор обёрток иногда сбоит, рекомендую всегда проверять генерируемые обёртки. Результаты этих сбоев встречались как в личном опыте, так и у других разработчиков на форуме.
    1 балл
  34. У меня исчезает при запуске приложения. А вообще, если Вы пользовались примером Равиля для отправки пуша, то в нем функция, в ней параметр badge отвечает за цифру function pushSend($title, $text, $tokens, $server_key) { $url = 'https://fcm.googleapis.com/fcm/send'; $headers = array('Authorization: key=' . $server_key, 'Content-Type: application/json'); if (is_array($tokens)) $fields['registration_ids'] = $tokens; else $fields['registration_ids'] = array($tokens); $fields['priority'] = 'high'; $badge = 1; $fields['notification'] = array('body' => $text, 'title' => $title, 'sound' => 'default', 'badge' => $badge); $fields['data'] = array('message' => $text, 'title' => $title); $jsonfields = json_encode($fields); print_r($jsonfields); $ch = curl_init(); curl_setopt_array($ch, array( CURLOPT_URL => $url, CURLOPT_POST => true, CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYHOST => 0, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_POSTFIELDS => json_encode($fields) )); $result = curl_exec($ch); curl_close($ch); if ($result === false) return false; $json = json_decode($result, true); if ($json['success'] == 0) return false; else return true; }
    1 балл
  35. Для стандартного АПИ, в большинстве случаев, достаточно иметь только обёртку (.pas файл). Какая то часть обёрток для АПИ всегда идёт со студией в комплекте (найти можно тут: C:\Program Files (x86)\Embarcadero\Studio\версиястудии\source\). Если нужной вам обёртки нет в комплекте со студией, то либо генерите её самостоятельно, либо скачиваете с GitHub'а. На форуме есть упоминание об этом: Полностью транслированное Android API 7-23 уровня Для сторонних jar - библиотек, необходимо иметь саму библиотеку в виде jar файла и обёртку к ней. В вашем случае, должно хватить (если не брать во внимание callback OnColorsChangedListener) простого указания .pas файла в секции uses вашего приложения. p.s. Все начальные вопросы уже много раз обсуждались на форуме и в различных блогах, ищите, читайте, пробуйте p.s.2. Можете "покопаться", например, тут (https://delphifmandroid.blogspot.com/p/blog-page_27.html), тут (https://github.com/AndrewEfimov) и тут (http://yaroslavbrovin.ru/). Ну и конечно же, если вы хотите использовать специфичные функции Андроида, то необходимо ознакомиться https://developer.android.com
    1 балл
  36. Для одного своего проекта сделал, поделюсь, вдруг кому пригодится. Тестировал под Windows и Android. Для использования просто добавьте BitmapAsyncLoader в uses, а дальше все просто: ImageControl.Bitmap.LoadFromURLAsync('https://bipbap.ru/wp-content/uploads/2017/10/0_8eb56_842bba74_XL-640x400.jpg'); Код юнита хелпера: unit BitmapAsyncLoader; interface uses FMX.Graphics, System.Net.HttpClient, System.Types, System.Classes; type TBitmapAsyncLoader = class helper for TBitmap procedure LoadFromUrlAsync(const AUrl : String); end; implementation var AHTTPClient : THTTPClient; procedure TBitmapAsyncLoader.LoadFromURLAsync(const AURL : String); begin try AHTTPClient.BeginGet( procedure (const ASyncResult: IAsyncResult) var AHTTPResponse : IHTTPResponse; begin if Not ASyncResult.IsCompleted then exit; try AHTTPResponse:=THTTPClient.EndAsyncHTTP(ASyncResult); except end; if Assigned(AHTTPResponse) and (AHTTPResponse.StatusCode = 200) then TThread.Synchronize(Nil, procedure begin try Self.LoadFromStream(AHTTPResponse.ContentStream); except end; end ); end, AURL ); except end; end; initialization AHTTPClient:=THTTPClient.Create; finalization if Assigned(AHTTPClient) then begin AHTTPClient.DisposeOf; end; end. Архив с тестовым проектом прилагаю. BitmapAsyncLoader.7z
    1 балл
  37. Пока тестировал хелпер в боевом проекте он потихоньку оброс исрпавлениями/улучшениями: Загрузка из потока сделана через TBitmapSurface - это позволяет избежать множества глюков. LoadFromStream вынесен из Synchronize (основного потока) в поток HTTPClient - по результатам бенчмарка операция оказалась самая жручая. После исправления интерфейс перестал залипать совсем. Добавлен overload вариант с передачей в процедуру TListItemImage - для использования в TListView и корректной перерисовки подгруженных картинок через AListItemImage.Invalidate. unit BitmapAsyncLoader; interface uses FMX.Graphics, FMX.Surfaces, System.Net.HttpClient, System.Types, System.Classes, FMX.ListView.Types, FMX.ListView.Appearances; type TBitmapAsyncLoader = class helper for TBitmap procedure LoadFromURLAsync(const AUrl : String); overload; procedure LoadFromURLAsync(const AUrl : String; const AListItemImage : TListItemImage); overload; end; implementation var AHTTPClient : THTTPClient; procedure TBitmapAsyncLoader.LoadFromURLAsync(const AURL : String); begin try AHTTPClient.BeginGet( procedure (const ASyncResult: IAsyncResult) var AHTTPResponse : IHTTPResponse; ABitmapSurface : TBitmapSurface; begin if Not ASyncResult.IsCompleted then exit; try AHTTPResponse:=THTTPClient.EndAsyncHTTP(ASyncResult); except end; if Assigned(AHTTPResponse) and (AHTTPResponse.StatusCode = 200) then begin ABitmapSurface:=TBitmapSurface.Create; if TBitmapCodecManager.LoadFromStream(AHTTPResponse.ContentStream, ABitmapSurface, CanvasClass.GetAttribute(TCanvasAttribute.MaxBitmapSize)) then TThread.Synchronize(Nil, procedure begin if Assigned(Self)then Assign(ABitmapSurface); ABitmapSurface.Free; end ) else ABitmapSurface.Free; end; end, AURL ); except end; end; procedure TBitmapAsyncLoader.LoadFromURLAsync(const AURL : String; const AListItemImage : TListItemImage); begin try AHTTPClient.BeginGet( procedure (const ASyncResult: IAsyncResult) var AHTTPResponse : IHTTPResponse; ABitmapSurface : TBitmapSurface; begin if Not ASyncResult.IsCompleted then exit; try AHTTPResponse:=THTTPClient.EndAsyncHTTP(ASyncResult); except end; if Assigned(AHTTPResponse) and (AHTTPResponse.StatusCode = 200) then begin ABitmapSurface:=TBitmapSurface.Create; if TBitmapCodecManager.LoadFromStream(AHTTPResponse.ContentStream, ABitmapSurface, CanvasClass.GetAttribute(TCanvasAttribute.MaxBitmapSize)) then TThread.Synchronize(Nil, procedure begin if Assigned(Self) and Assigned(AListItemImage) then begin AListItemImage.BeginUpdate; Assign(ABitmapSurface); AListItemImage.Invalidate; AListItemImage.EndUpdate; end; ABitmapSurface.Free; end ) else ABitmapSurface.Free; end; end, AURL ); except end; end; initialization AHTTPClient:=THTTPClient.Create; finalization if Assigned(AHTTPClient) then AHTTPClient.DisposeOf; end. Тестовый проект, на этот раз с ListView (по кнопке добавляется 100 итемов) прилагаю. BitmapAsyncLoaderListView.7z
    1 балл
  38. Из PlatformSDK (PlatformSDKs\android-sdk-windows\sources\android-23\android\support\v4\content\) портировал в Delphi класс TJLocalBroadcastManager. Это очень полезный класс, если вы не хотите рассылать сообщения по всей системе, а есть необходимость общаться только внутри приложения или между хост-приложением и сервисом. Во вложении сам класс, в своем приложении убедитесь, что в Target Platforms (Android) → Android → Libraries включена библиотека android-support-v4.dex.jar. Прилагаю пример, для изучения и использования в работе, который демонстрирует работу обычного BroadcastReceiver и LocalBroadcastReceiver. В примере демонстрируется работа сообщений в приложении и сервисе. Сначала делаем build проекта LBCRService, потом будет доступна возможность собрать LocalBCR. Собираю в Berlin 10.1, но на младших версиях тоже должно работать, по крайней мере в Seatlle. В реализации методов procedure RegisterReceiver(); procedure UnRegisterReceiver(); необходимо снять комментарий с соответствующих строчек, в зависимости от того, какой тип ресивера вы хотите использовать. Androidapi.JNI.LocalBroadcastManager.pas.zip LocalBroadCastReceiver.zip
    1 балл
  39. Попробовал AlarmManager. Интервал 30 секунд. Запускал сервис следующим образом: procedure TFormMain.InitServiceAlarmManager; var Intent: JIntent; PendingIntent: JPendingIntent; ATimerInterval : Integer; begin ATimerInterval:=30; Intent := TJIntent.Create; Intent.setClassName(TAndroidHelper.Context, StringToJString('com.embarcadero.services.ServiceTest090Service')); PendingIntent := TJPendingIntent.JavaClass.getService(TAndroidHelper.Context, 1, Intent, 0); TAndroidHelper.AlarmManager.&setRepeating(TJAlarmManager.JavaClass.RTC_WAKEUP, getTimeAfterInSecs(ATimerInterval), ATimerInterval * 1000, PendingIntent); end; procedure TFormMain.FormCreate(Sender: TObject); begin InitServiceAlarmManager; // FService:=TLocalServiceConnection.Create; // FService.StartService('ServiceTest090Service'); end; function TFormMain.getTimeAfterInSecs(Seconds: Integer): Int64; Var Calendar: JCalendar; begin Calendar := TJCalendar.JavaClass.getInstance; Calendar.add(TJCalendar.JavaClass.SECOND, Seconds); Result := Calendar.getTimeInMillis; end; end. Результат - та же хрень, вид сбоку: 2017-02-25 21:35:40 195.22.104.13 AlarmManager в сервисе. Запрос раз в 0 сек. 2017-02-25 21:35:40 195.22.104.13 AlarmManager в сервисе. Запрос раз в 0 сек. 2017-02-25 21:34:40 195.22.104.13 AlarmManager в сервисе. Запрос раз в 0 сек. 2017-02-25 21:34:40 195.22.104.13 AlarmManager в сервисе. Запрос раз в 0 сек. 2017-02-25 21:33:38 195.22.104.13 AlarmManager в сервисе. Запрос раз в 0 сек. 2017-02-25 21:33:10 195.22.104.13 AlarmManager в сервисе. Запрос раз в 0 сек. 2017-02-25 21:32:45 195.22.104.13 AlarmManager в сервисе. Запрос раз в 0 сек. 2017-02-25 21:32:10 195.22.104.13 AlarmManager в сервисе. Запрос раз в 0 сек. 2017-02-25 21:32:10 195.22.104.13 AlarmManager в сервисе. Запрос раз в 0 сек. 2017-02-25 21:31:06 195.22.104.13 AlarmManager в сервисе. Запрос раз в 0 сек. 2017-02-25 21:30:59 195.22.104.13 AlarmManager в сервисе. Запрос раз в 0 сек. А тут я заблокировал телефон кнопкой и началось.... 2017-02-25 21:30:06 195.22.104.13 AlarmManager в сервисе. Запрос раз в 0 сек. 2017-02-25 21:29:36 195.22.104.13 AlarmManager в сервисе. Запрос раз в 0 сек. 2017-02-25 21:29:06 195.22.104.13 AlarmManager в сервисе. Запрос раз в 0 сек. 2017-02-25 21:28:36 195.22.104.13 AlarmManager в сервисе. Запрос раз в 0 сек. 2017-02-25 21:28:06 195.22.104.13 AlarmManager в сервисе. Запрос раз в 0 сек. 2017-02-25 21:27:36 195.22.104.13 AlarmManager в сервисе. Запрос раз в 0 сек. 2017-02-25 21:27:06 195.22.104.13 AlarmManager в сервисе. Запрос раз в 0 сек. 2017-02-25 21:26:36 195.22.104.13 AlarmManager в сервисе. Запрос раз в 0 сек. 2017-02-25 21:26:07 195.22.104.13 AlarmManager в сервисе. Запрос раз в 0 сек. 2017-02-25 21:25:36 195.22.104.13 AlarmManager в сервисе. Запрос раз в 0 сек. 2017-02-25 21:25:06 195.22.104.13 AlarmManager в сервисе. Запрос раз в 0 сек. Оставлю на ночь, посмотрим что будет....
    1 балл
  40. Axbor

    Диалоговое окно на Андроид.

    Хотел бы поделиться опытом. Рассмотрим случай, когда вам необходимо использовать кастомное диалоговое окно с затемнением. Вроде вот такого: Первое, что приходит в голову, это использование Rectangle’ов. Но такой подход показался мне очень сложным, и я нашёл другой способ (многие о нём уже знают) создания кастомного окна. Сам способ: Создаем вторую форму, и изменяем следующие свойства: Transparency = True Fill->Color = #78000000 Fill->Kind = Solid Поместим туда один TLayout, выставим свойство «Align» в значение «Center». И зададим нужный размер. Потом кидаем на TLayout компонент «TRectangle» со свойством «Align – Content». Чтобы TLayout не мешался во время design-time, присвоим свойству Locked значение True. Кидаем остальные компоненты, чтобы получить окно нужного нам вида. В итоге у меня получилась вот такая иерархия компонентов: Компонент TRectAnimation используем для анимирования процесса появления окна. Вы можете придумать свою анимацию. В данном случае анимируется свойства формы «Padding». Напишем следующий код, для того, чтобы при клике на тёмную область формы окно закрылось (событие формы OnTap работает на сенсорных экранах, если вам нужен OnClick тогда воспользуйтесь Layout’ми или Rectangle’ми): void __fastcall TForm2::FormTap(TObject *Sender, const TPointF &Point) { Close(); } Вот и всё. К сообщению, я приложил демо приложение с примером такого окна. У администраторов просил бы поправить допущенные ошибки так как я не владею русским языком очень хорошем уровне. Или же добавит кое какие дополнительные информации ссылки и т.д. Demo.zip
    1 балл
  41. В настройках проекта выведены эти опции: Menu -> Project -> Project options Application -> Orientation
    1 балл
  42. Задавайте свойство главной формы FormFactor.Orientations для различных представлений (View).
    1 балл
  43. var ScreenService: IFMXScreenService; begin ScreenService:= TPlatformServices.Current.GetPlatformService(IFMXScreenService) as IFMXScreenService; ScreenService.SetScreenOrientation([TScreenOrientation.Landscape]); end;
    1 балл
  44. В файле dpoj : begin Application.Initialize; Application.FormFactor.Orientations := [TScreenOrientation.Portrait]; Application.CreateForm(.....); Application.Run; end.
    1 балл
  45. Project -> Options -> Application -> Orientation -> Enable custom orientation
    1 балл
  46. Подскажите в чем хранить небольшие сбережения, в долларах, рублях или купить на все деньги гречневой крупы?
    1 балл
  47. купите лицензию на абракадабру !))
    1 балл
  48. Открытие любого файла в подходящем приложении в операционной системе Андроид выполняются одинаковым способом. Путем посылки намерения (Интент) с указанием файла и типа данных. Далее система ищет по указанному типу файла, какие приложения зарегистрированы на обработку файлов этого типа, Если приложение, которое может обработать этот файл, одно, то запускает активити приложения и передает туда ваш файл/данные. Если приложений несколько - запускает диалоговое окно выбора приложения, которое будет выполнять обработку вашего файла. Резюмируя это, смотрим на код: uses System.IOUtils, FMX.Helpers.Android, Androidapi.JNI.Net, Androidapi.JNI.GraphicsContentViewText; procedure TForm7.btnOpenPDFClick(Sender: TObject); const SAMPLE_PDF_FILENAME = 'example.pdf'; var Uri: Jnet_Uri; OpenLinkIntent: JIntent; PDFFileName: string; begin PDFFileName := TPath.Combine(TPath.GetDocumentsPath, SAMPLE_PDF_FILENAME); { Внутренний доступ} Uri := StrToJURI(PDFFileName); // Формируем намерение об открытии файла в стандартном приложении OpenLinkIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, Uri); // Устанавливаем тип данных OpenLinkIntent.setType(StringToJString('application/pdf')); OpenLinkIntent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_TOP); // Запускаем приложение и передаем ему наше намерение try SharedActivity.startActivity(OpenLinkIntent); except on E: Exception do ShowMessage('Не удалось открыть PDF. В системе нет доступных приложения для просмотра pdf'); end; end; В этом код pdf файл берется из самого пакета приложения (я включил pdf файл в пакет приложения). Если вам нужно вытащить файл в любом другом месте, просто укажите в PDFFileName полный путь к файлу в файловой системе вашего устройства. Проект доступен тут: OpenPDF.zip
    1 балл
  49. За постоянное нарушение этих правил пользователь может быть забанен, в том числе по адресу IP.Если тема оформлена не правильно, то она будет закрыта. 1. Общие правила Перед тем как создать тему по вашему вопросу, воспользуйтесь поиском по форуму. Форум рассчитан на консультирования применения FireMonkey, решения прикладных задач с использованием FireMonkey. Запрещено публиковать найденные ошибки. Для публикации и решения вопросов ошибок FMX существует специальный ресурс Embarcadero Quality Central. Запрещается обсуждение вопросов не связанных с разработкой и FireMonkey Запрещается использовать нецензурные выражения в тексте и заголовке сообщений 2. Создание темы Одна тема — один вопрос. Два вопроса в одной теме задавать запрещено. Запрещено создавать несколько тем для одного вопроса. Тема должна быть размещена в наиболее подходящем для нее по смыслу разделе. Если такового не имеется, то размещать тему на свое усмотрение. 2.1 Каким должен быть заголовок темы? Вопрос должен быть сформулирован в заголовке темы. Заголовок темы должен содержать не менее 4 слов. Заголовок темы должен формулировать вопрос как можно подробнее. 2.2. Каким должен быть текст вопроса? Текст вопроса нужно начать с указания используемой версии RAD Studio, Версии ОС и модель устройства (если речь идет о мобильной разработке) Текст темы должен максимально подробно описывать суть вопроса. Текст темы должен по возможности содержать иллюстрации. Иллюстрации должны быть не от балды, а иллюстрировать текущее состояние вопроса: то есть, наглядно показывать факт существования описанного поведения. Если ваш вопрос касается конкретного случая разработки, нужно прикрепить проект (только исходные коды в zip архиве) к сообщению. Вставляя код в текст темы, позаботьтесь о том, чтобы он соответствовал стандарту «Руководство по оформлению кода на Pascal» (это можно сделать, при помощи средств автоматического форматирования кода, которые есть в RAD Studio Edit -> Format Source или Ctrl + D), а также не забудьте использовать тег «Код» при оформлении кода в сообщении. 3. Ответы в темы Задавать свой вопрос в чужой теме можно только в случае если ваш вопрос совпадает с вопросом в теме. Отвечать можно на любые темы. При ответе старайтесь подробно описывать решение вопроса. Избегайте лишних сообщений не касающихся решения вопроса.
    1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...