Перейти к содержанию

Лидеры


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

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

  1. 14 баллов
    Всем добрый вечер, Вот и прошло лето, а вместе с этим подходит к концу закрытое бета тестирование библиотеки FGX Native. Проделана огромная работа, как в разработке самой библиотеки, так и в разработке нового портала. Плодотворная работа во время бета тестирования принесла свои плоды. В результате: Были разработаны несколько новых интересных мобильных проектов: ? Аналог сервиса распознавания музыки Shazam на Delphi и FGX Native! ? Температурный дневник. Фиксация температуры, приема лекарств, построение графиков и рекомендации о приеме лекарств. ? Электронный конспект лекций по теме "Слесарное дело" с функциями самопроверки. ? Домашняя аптечка. ? Большой проект с демонстрацией возможностей библиотеки. Добавлены новые возможности и компоненты. Повышена стабильность работы библиотеки. И многое другое. Я рад с вами поделиться отличной новостью, которую многие с нетерпением ждали. До нового года запланирован ? релиз библиотеки FGX Native ? под Андроид, который будет доступен для РФ и стран СНГ: Разработка кроссплатформенных приложений под Андроид ?. Русскоязычная документация. Набор демонстрационных проектов. Более 40 готовых компонентов. Свой дизайнер форм. В течении следующих двух недель будет опубликована ссылка на сайт, посвященный библиотеке FGX Native. На нем вы сможете найти: описание возможностей, документацию, тарифы и многое другое - всё это поможет вам предварительно оценить возможности библиотеки для реализации своих проектов. Позже, ближе к новому году, будет выложена Trial сборка библиотеки и открыта продажа. Если у вас есть какие-либо вопросы - задавайте. Всем отличной рабочей недели! ??? P.S. - Релиз под iOS запланирован на весну/лето 2020 года. - Релиз для других стран будет позже, после локализации документации.
  2. 9 баллов
    У меня в работе два приложения, и оба они не предназначены для 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. Для того, чтобы системный инсталлер запускался, нужно не забыть отметить еще одну галочку
  3. 6 баллов
    Brovin Yaroslav

    [FGX Native] Релиз!!!

    Поздравляю всех с наступающим новым годом и рад сообщить вам о релизе FGX Native. ??? Это были 3 года плодотворной работы над этим проектом. За это время была проделана колоссальная работа. И еще многое предстоит преодолеть и реализовать. Рад, что успел зарелизить проект до 2020 года. Спасибо всем участника альфа и бета тестирования за оказанную помощь, обратную связь и поддержку. Надеюсь, что вам понравится полученный продукт и с каждым днем он будет лучше и интереснее. Так же рад поделиться, что в моей команде прибыл один разработчик Виктор. Который помог мне подготовить релиз и продолжить трудится со мной над развитием проекта FGX Native. Это позволит делать больше крутых фич и естественно заниматься поддержанием качества продукта. Триал можно скачать здесь: https://forum.fgx-native.com/. Продажа начнется 1 января 2020 года. Всех с новым "безбажным" годом.
  4. 6 баллов
    сделано на Datasnap - 3х звенка MsSql- Сервис Https - Клиент ( Андроид, Ios, Win, Mac) Личный кабинет пациента клиники (www.familydoctor.ru) открывает зарегистрированным пользователям доступ к медицинской карте (результаты лабораторных исследований и функциональной диагностики, описание приемов врачей, направления и рекомендации, истории посещений клиники (дата, время, специалист), программам медицинского наблюдения (перечень, период прикрепления), информации о движении средств по депозитам. Для пересылки выписок (файлов) из медицинской карты используется электронная почта (в системе должен быть настроенный Майл Агент на отправку почты).Полной версией приложения могут воспользоваться только пациенты, подключившие услугу "Личный кабинет" в регистратуре любого корпуса клиники "Семейный доктор".В новой версии изменен дизайн, появились новые функции и разделы:вход по номеру медкарты или ФИО;запрос нового пароля;заявка на онлайн запись;отмена приема;прейскурант услуг клиники;справочник адресов клиники. сервис оплаты услуг клиники через приложение.В ближайшем будущем функционал личного кабинета будет дополнен онлайн расписанием специалистов, возможностью электронной записи на приём. в гугл плее https://play.google.com/store/apps/details?id=com.familydoctor.FD Есть тестовый вход, обращайтесь.
  5. 5 баллов
    Обновлена серия статей на тему использования Uses Permissions. Uses Permissions: Теория Uses Permissions: Добавляем метод onRequestPermissionsResult в приложение (для Delphi 10.1/10.2) Uses Permissions: Практика (для Delphi 10.3) Автор: Андрей Ефимов
  6. 5 баллов
    krapotkin

    Фреймворк для стандартного ListView

    еще один пример раскладки из реального проекта { "Columns":[], "Variables": [ {"Y_UNIT":"12"}, {"GAP":"8"}, {"ITEM_H":"2*GAP+5*Y_UNIT"}, {"IMG_H":"76"}, {"IMG_W":"76"}, {"STOCK_SIZE":"48"}, {"PRICE_COLW":"53"} ], "Objects": [ {"Name":"ID","Kind":"data"}, , {"Name":"img","Kind":"image", "Place":{"X":"0","Y":"0","W":"IMG_W","H":"IMG_H"}, } , {"Name":"Text","Kind":"text","TextHAlign":"leading","TextVAlign":"leading", "Place":{"X":"img.right","Y":"GAP","W":"itemwidth - IMG_W - GAP - 2*PRICE_COLW - GAP","H":"52"}, "WordWrap":true, "Color":"black", "Font":{"Size":12} } , {"Name":"earlier","Kind":"text","TextHAlign":"leading","TextVAlign":"leading", "Place":{"X":"text.left","Y":"ITEM_H-2*GAP+2","W":"itemwidth - 2*PRICE_COLW","H":"Y_UNIT"}, "WordWrap":false, "Color":"green", "Font":{"Size":10} } , {"Name":"price1","Kind":"text","TextHAlign":"trailing","TextVAlign":"trailing", "Place":{"X":"itemwidth-GAP-PRICE_COLW-W","Y":"GAP+2*Y_UNIT","W":"auto","H":"Y_UNIT*1.5", "priority":"WXYH"}, "WordWrap":false, "Color":"black", "Font":{"Size":15} } , {"Name":"imgstrike","Kind":"image", "Place":{"X":"price1.x-5","Y":"price1.y","W":"price1.w+8","H":"price1.h"}, } , {"Name":"price2","Kind":"text","TextHAlign":"trailing","TextVAlign":"trailing", "Place":{"X":"price1.right-W","Y":"ITEM_H-GAP-Y_UNIT*1.5","W":"auto","H":"Y_UNIT*1.5", "priority":"WXYH"}, "WordWrap":false, "Color":"black", "Font":{"Size":15, "style":"bold"} } , {"Name":"qty","Kind":"text","TextHAlign":"trailing","TextVAlign":"center", "Place":{"X":"itemwidth-PRICE_COLW-GAP","Y":"GAP","W":"PRICE_COLW","H":"2*Y_UNIT"}, "WordWrap":false, "Color":"black", "Font":{"Size":27, "style":"bold"} } , {"Name":"imgstock","Kind":"image", "Place":{"X":"itemwidth-STOCK_SIZE-3","Y":"ITEM_H-STOCK_SIZE-4","W":"STOCK_SIZE","H":"STOCK_SIZE"}, } ], "ItemHeight":"ITEM_H", "ItemSpaces": {"X":"0","Y":"0","W":"0","H":""}, "SideSpace":"0" }
  7. 5 баллов
    Владимир Б.

    TInstructor - Step-By-Step инструкция

    Собственно понадобился подобный компонент для FMX, но готового решения найти не смог - пришлось ваять свой. Использовать проще простого: var scenaries: TDictionary<TFmxObject, string>; begin scenaries := TDictionary<TFmxObject, string>.Create; scenaries.Add(btn_1, '1 Button'); scenaries.Add(btn_2, '2 Button'); scenaries.Add(btn_3, '3 Button'); scenaries.Add(rctngl, 'Rectangle'#13#10'Rectangle'#13#10'Rectangle'#13#10'Rectangle'#13#10'Rectangle'#13#10'Rectangle'#13#10'Rectangle'); scenaries.Add(pnl_1, 'Panel Panel Panel Panel Panel Panel Panel Panel Panel Panel'#13#10'Panel'); scenaries.Add(nil, 'Msg without target control!'); try instructor.LoadSteps(scenaries); finally FreeAndNil(scenaries); end; Репозиторий GitHub: https://github.com/ange007/TInstructor/
  8. 4 балла
    Дмитрий Потапов

    BlurBehind Control

    BlurBehind Control. Компонент позволяет использовать размытие, по типу, которое реализовано в WIndows 10, т.е компонент позволяет "размыть" то, что находится под ним. Пусть и увидел это непосредственно в самой студии на стартовой странице (Welcome Page), но все-таки подумал скинуть ссылку сюда. Исходники: https://github.com/grijjy/CodeRage2019/tree/master/BlurBehind Видео:
  9. 4 балла
    Eric Myval

    Unable to create process

    Результат следующий Мой проект корректно работает под 1) Windows 32/64 2) Android 32/64 3) iOS 32/64 (обязательно настроить сертификаты, которые можно создать и прикрепить в Xcode + настроить их в Rad Studio в разделе Project-Deployment-Provisioning, выбрать там ключи как вы их настроили на вашем маке + ОБЯЗАТЕЛЬНО в version info удалить текст в CFBundleIdentifier, должно быть пусто) 4) MacOS 32/64 5) iOS 32/64 simulator - не работает!!!
  10. 4 балла
    Maka

    переход к x64?

    Отвечают долго, 10-14 дней, а потом еще около 7 дней переписка, проверки и ожидание решения. Наберитесь терпения
  11. 4 балла
    krapotkin

    Загрузка настроек приложения из БД

    правильный ответ - не делать так )) нужно хранить настройки приложения в отдельном классе тогда кроме самого класса нужны методы, которые 1) читают пишут его из ... файла, БД, интернета и т.д. 2) в нужный момент (обычно чтобы изобразить форму и заполнить св-ва компонентов или еще для чего угодно) использовать эти настройки 3) вытекает из 2) сохранять в нужный момент новые значения в переменную, где лежат настройки для хранения настроек отлично подходит JSON. Т.к. он может иметь иерархическую структуру, что очень удобно. Его и хранить в БД. Можно и прямо поля, строки и все такое, но все равно, собирать их нужно в некое хранилище в программе. Пример разбирал тут http://www.cyberforum.ru/blogs/469693/blog4883.html
  12. 4 балла
    Отвечу сам себе. Проблема решена. Всего два дня поисков и вот он, случай - краеугольный камень поиска ошибок! Меня аж забомбило, когда я это откопал. Оказалось, что мой грид лежит на лайоуте, у которого hittest = false. Так вот до тех пор, пока я не перевел его в true грид отказывался принимать ondragover. Но как только layout.hittest:=true все заработало. Дальше дело техники.
  13. 3 балла
    Slym

    multicast udp

    А в инде все готово... procedure TForm1.FormCreate(Sender: TObject); begin IdUDPServer1.ReuseSocket:=TIdReuseSocket.rsTrue; IdUDPServer1.DefaultPort:=9898; IdUDPServer1.Active:=true; end; procedure TForm1.IdUDPServer1AfterBind(Sender: TObject); begin IdUDPServer1.Bindings[0].AddMulticastMembership('224.0.0.50'); end;
  14. 3 балла
    Может кому пригодится. вот решение. procedure TfrmSendEmail.SendEmail(); {$IF DEFINED(ANDROID)} var lIntent: JIntent; lJRecipient: TJavaObjectArray<JString>; lURI: Jnet_Uri; lJFile: JFile; lFileName: string; lFilePath: string; {$ENDIF} begin {$IF DEFINED(ANDROID)} lJRecipient:= TJavaObjectArray<JString>.Create(1); lJRecipient.Items[0]:= StringToJString(eEmail.Text); lFileName:= AttachFileName; lFilePath:= System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetSharedDownloadsPath, lFileName); lIntent:= TJIntent.Create; lIntent.setType(StringToJString('application/excel')); lIntent.setAction(TJIntent.JavaClass.ACTION_SEND); lIntent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK); lIntent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, lJRecipient); lIntent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString(eSubject.Text)); lIntent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(mEmailMessage.Text)); lJFile:= TJFile.JavaClass.init(StringToJString(lFilePath)); lURI:= TAndroidHelper.JFileToJURI(lJFile); lIntent.setData(lURI); lIntent.putExtra(TJIntent.JavaClass.EXTRA_STREAM, TJParcelable.Wrap((lURI as ILocalObject).GetObjectID)); TAndroidHelper.Activity.startActivity(lIntent); {$ENDIF}
  15. 3 балла
    slav_z

    Срабатывает OnClick на ListBox при скроллинге

    в OnClick элемента списка сделайте проверку: procedure TForm1.ListBoxItemClick(Sender: TObject); begin if not ListBox.AniCalculations.Moved then DoItemClick; end;
  16. 3 балла
    krapotkin

    Не подключается Huawei

    Короче, действуем примерно так. Я надеюсь, что базовые действия - скачать 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
  17. 3 балла
    Приложение для получения информации расчётным путём об углах: - вертикальной плоскости; - в горизонтальной плоскости; - объёмный; - эквивалентный в шарнирах карданных валов на основе сделанных замеров на собранном автобусе, троллейбусе, грузовике. Может пригодиться работникам сервисных служб, лицам эксплуатирующим грузовую или пассажирскую автомобильные техники, лицам не конструкторских служб. Особенно в случае нахождения в месте недоступном к интернету и компьютеру. Работает на устройствах под OS Android. Существует и более расширенная версия для OS Windows. Пожалуйста, с предложениями и пожеланиями обращайтесь к разработчику: Кирееву Олегу по тел. +375 29 676 13 84 или пишите на kireevoleg1966@gmail.com. Буду рад Вашему любому отзыву. С Уважением. UgolKardZamer_v5.rar
  18. 3 балла
    Коллеги, я опубликовал на сайте FGX свое приложение. Можете «щупать». ? https://forum.fgx-native.com/topic/76-медицинская-программа-для-оценки-взаимодействия-препаратов/
  19. 3 балла
    В процессе разработки столкнулся с очень странной ситуацией, корни которой до сих пор неясны, но решение нашлось. Итак. Делфи 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
  20. 3 балла
    В телефоне нет никаких гарантированных аппаратных данных - или по причине китайщины, или по тому что их можно изменить. Если уже вам так хочется "привязаться" к чему то неизменному, то привязывайтесь к телефонному номеру. Хотя и его может не быть. Палец не панацея - у вас нет никаких гарантий что палец принадлежит владельцу персональных данных. 100% дактилоскопических данных пользователя у вас нет, а на этапе "привязки" пальца, телефон уже может быть в руках злоумышленника. У вас не получится сделать идеальную систему с абсолютной системой от дурака. Поэтому я и предложил исходить из того что приложение на телефоне запускает легальных пользователь. Все иное должно описываться в политике конфиденциальности, типа мы чтим закон о ПД, но если вы долбоклюй и отдали телефон и пинкод постороннему, то вы сами пролюбили свою медкарту. И пинкод никак не позволит войти на другом устройстве - пин код сохраняется локально на устройстве, в папке приложения. И если пользователь ввел его верно, то запросы на сервер авторизуются с заранее сохраненного на устройстве токена (guid, куки или что вам больше нравится). Ситуации "А если кто взломает телефон и перенесет какой то файл на другое устройство" вас не должны волновать абсолютно. Вы предоставили пользователю приложение, а задача пользователя - не пролюбить телефон и свои персональные данные. Дополнительно вы прикрываете свою задницу политикой конфиденциальности, где описываете что не обязаны охранять пользователя и его телефон круглые сутки.
  21. 3 балла
    Проблема была в правах доступа на МАКе. Выяснилось случайно, когда попробовал делоить тот же проект под МАК и IDE выдала явную ошибку о невозможности создать файл во вложенной в /Users/macuser/PAServer директории. Вылечилось раздачей прав Read & Wtite для ролей staff/everyone для папки PAServer и вложенных директорий (Apply to enclosed items). На quality.embarcadero.com есть по крайней мере две заявки на эту тему, почему-то закрытые: RSP-25526 и RSP-26093 В первой автор откатился на Mojave, во второй стоит «Resolution: Cannot Reproduce». Так что описанная проблема спорадический возникает. Всем успехов и поменьше граблей на пустом месте :)
  22. 3 балла
    Пока не изменились. Сейчас активно ведется работа над подготовкой релиза. Сюда входит ряд работ: Подготовка триал версии библиотеки. Библиотека уже собирается для триала, но остается еще работа по подготовке установщика. Создание EULA Налаживание процесса продажи по подписке. Решение лицензионных вопросов. и другие момент. Но перед тем, как выбирать на чем делать проект я все-таки рекомендую вначале ознакомиться с будущем триалом, чтобы понять о возможностях продукта. Чтобы Ваши ожидания оправдались или не оправдались заранее. Из доп. бонусов в этом месяце еще добавлен новый компонент камера, которая позволяет использовать камеру прямо в вашем приложении с превью и без тормозов. Так же параллельно ведется работа над сканером штрихкодов.
  23. 3 балла
    Barbanel

    Динамическое изменение массива записей

    Большое количество - это сколько? 100, 100 000, 100 000 000? Каждый раз увеличивая размер на один элемент, менеджер памяти ищет непрерывный незанятый кусок памяти такой длины, чтобы уместить все элементы. Хорошо если место под уже выделенный массив позволяет увеличить размер, не упираясь в участики памяти занятые другими данными. Иногда после очередного увеличения массива, уже выделенного участка памяти более не хватает. В таком случае менеджеру приходится искать новый, и копировать старые данные в новый участок памяти, а старый участок помечать как свободный. Разумеется это занимает время. Именно это и приводит к "не так быстро, как хотелось бы". Чтобы избежать этого: 1 Способ курильщика, простой: Увеличиваем размер массива не на 1 элемент, а сразу на 16/32/128/1024 элемента (вам виднее, в зависимости от того сколько у вас может быть элементов в массиве). Также заводим счетчик - номер последнего занятого элемента в массиве, и после каждого добавления - увеличиваем этот счетчик на единицу. Этот способ не избавит от проблемы, но будет приводить к менее частому перераспределению памяти. 2 Способ здорового человека, чуть сложнее: используйте указатели. Заведите массив указателей (либо TList), выделяйте место под каждую новую запись (ваш record) вручную, и помещайте указатель на него в ваш массив указателей (или в TList). Не забывайте освобождать выделенную память, когда ваши обьекты больше не нужны. Этот спобоб более правильный, так как в этом случае перераспределение происходит очень редко. Кстати, реализация TList использует внутри себя первый способ.
  24. 3 балла
    CyberStorm

    Ошибка "Java class JAdSize could not be found"

    Нужно библиотеки почистить: Вот тут еще много написано:
  25. 3 балла
    CyberStorm

    Android 64

    Спасибо! Благодаря вашим наводкам наткнулся на инструкцию как собрать бандлы: http://docwiki.embarcadero.com/RADStudio/Rio/en/Submitting_Your_Android_App_to_Google_Play Пришлось грузить гуглу зашифрованный ключ, пришлось помучаться (https://stackoverflow.com/questions/44103024/how-to-enable-google-play-app-signing) И теперь собираются полноценные рабочие приложения!
  26. 3 балла
    Brovin Yaroslav

    [FGX Native] Сайт библиотеки

    Рад представить вашему вниманию сайт библиотеки FGX Native https://fgx-native.com ?? Здесь Вы сможете найти: ? описание возможностей, ? документацию, ? тарифы и многое другое. Всё это поможет вам предварительно оценить возможности библиотеки для реализации своих проектов. P.S. Trial версия и открытие продаж запланированы на конец декабря.
  27. 3 балла
    krapotkin

    не отрабатывает TThread.synchronize

    ну, есть идеи, как бы модифицировать код, но и так сойдет я бы перефразировал if frmScanWindow = nil then frmScanWindow := TFrmScanWindow.Create(NIL); frmScanwindow.showModal( procedure (const AResult:TModalResult) begin if AResult = mrOK then begin ....... и может быть даже FreeAndNil(frmScanwindow); end; end);
  28. 3 балла
    gonzales

    переход к x64?

    Вот моя переписка. Прислали вот такое письмо с вопросами Hello Alexey, Thanks for contacting Google Play Developer Support. Apologies for the delayed response. I understand you would like an extension to become 64-bit compliant. In order to submit your request, can you please provide the following: Reason for not being able to be compliant in time (if there’s a dependency on third party tools, please specify it) Reason for your request and your plan for migration Specific plan on how you will become compliant, with an estimation date for building 64-bit support that you can commit (For example: The app will be compliant 2 weeks after Embarcadero is compliant.) I look forward to your reply and assisting you further. Regards, Liz Google Play Developer Support я ответил так Hello Liz! Thank you for your letter. In answer to your questions, i provide that as soon as Embarcadero will make a 64x-compiler for Android, i will use it and make a compatible application. I hope, that it won't take long, i dont use any third party tools, only Embarcadero RAD Studio. I'm disappointed, that Embarcadero do not release a new version in time, like they still don't announce it. Also to this I want to ask, if i need to update my application in Google Play Market, i need to reques this extension every time, or only onсe? My application is made for users of our smart home system, and I'm very worried, that our new customers can't download it from Play Market, so I hope for a positive decision of my request!
  29. 3 балла
    krapotkin

    StatusBar Color

    Запустил код по ссылке на delphi 10.3.2, android 8.1 Xiaomi redmi 5 plus В моем случае выяснилось, что поведение зависит от состояния Mainform.Borderstyle Если none - ведет себя как Fullscreen, статусбар прячется Дополнено! Чистый проект на 10.3.2 сам добавляет в Deployment файл styles-v21.xml Его нужно отключить! иначе будет только вариант Fullscreen (он же Borderstyle=none) когда статусбар скрыт и выезжает полупрозрачный, либо обычный неокрашенный статаусбар. Если без него впоследствии что-то не взлетит, можно так же как с основным styles.xml добавить в deployment свой, модифицированный, со строками <item name="android:windowTranslucentStatus">true</item> <item name="android:windowTranslucentNavigation">false</item> У меня после отключения окрашивание статусбара работает корректно.
  30. 3 балла
    Нужно в настройках проекта изменить имя пакета. В 10.3 это в Project -> Options -> Application -> Version Info -> Key: ProgramID
  31. 3 балла
    Короче уточнил: бета-версия 10.3.3 будет называться Sugarloaf, она выйдет до конца этого месяца, там будет 64-битный компилятор под Андроид, но так и не понял по поводу - дадут ли "коммунякам" или нет так в ближайшие 7 дней ждем Sugarloaf
  32. 3 балла
    Евгений Корепов

    Затирание bitmap canvas при map-unmap

    Я разобрался в чем дело: Вместо TMapAccess.Write используйте TMapAccess.ReadWrite. TMapAccess.Write по какой то причине затирает если не все, то некоторые последние изменения канваса. В доке http://docwiki.embarcadero.com/Libraries/Rio/en/FMX.Graphics.TBitmap.Map не нашел упоминания о таком поведении.
  33. 3 балла
    Хорошая новость: вместо ожидания 10.4 - выйдет версия 10.3.3 в 2019 году, в котором появится компилятор для Андроид 64-бит Новый роадмап найдете здесь: https://community.idera.com/developer-tools/b/blog/posts/august-2019-delphi-android-beta-plans-august-roadmap-update
  34. 3 балла
    добавьте дополнительный layout (align = contest) и на него поместите все компоненты и у MultiView parent укажите layout
  35. 3 балла
    #WAMACO

    Как получить значения переменных пакета?

    с помощью SQL select * from GLOBALS
  36. 3 балла
    В общем удалось решить проблему с кнопками пульта. Теперь приложение распознает все кнопки с пульта. Если кому-то нужно, прикрепил архив. (Delphi 10.3.1 Rio) fmx_androidkey_fix.zip
  37. 2 балла
    slav_z

    Rio 10.3. Выделение текста в TText

    минимальный код: unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.UIConsts, System.Classes, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Objects, FMX.TextLayout; type TForm1 = class(TForm) Text1: TText; procedure Text1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); procedure Text1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single); procedure Text1Painting(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); procedure FormCreate(Sender: TObject); private Range: TTextRange; function TextLayout: TTextLayout; public function GetSelectedText: string; end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormCreate(Sender: TObject); begin Text1.AutoCapture:=True; end; type TTextAccess = class(TText); function TForm1.TextLayout: TTextLayout; begin Result:=TTextAccess(Text1).Layout; end; function TForm1.GetSelectedText: string; begin Result:=Text1.Text.Substring(Range.Pos,Range.Length); end; procedure TForm1.Text1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin Range.Pos:=TextLayout.PositionAtPoint(PointF(X,Y)); Range.Length:=0; Text1.Repaint; end; procedure TForm1.Text1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single); begin if Text1.Pressed then begin Range.Length:=TextLayout.PositionAtPoint(PointF(X,Y))-Range.Pos; Text1.Repaint; end; end; procedure TForm1.Text1Painting(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); begin Canvas.Fill.Color:=claSilver; Canvas.Fill.Kind:=TBrushKind.Solid; for var R in TextLayout.RegionForRange(Range,False) do Canvas.FillRect(R,0,0,AllCorners,1); end; end. textselected.zip
  38. 2 балла
    Edward Tarasov

    TThread В фоновом режиме

    Сам недавно бился с этим вопросом. ответ нашел на этом форуме. Но после долгого гугления вопроса сложилось впечатление, что на сегодняшний день из ios можно выжать максимум три минуты работы приложения в фоне, потом приложение перестает реагировать. в моем случае было необходимо передавать координаты. Что только не перепробовал - три минуты и все. можно мухлевать: Воспроизводить аудио или записывать с микрофона - но ребята из apple при публикации к такому отнесутся не очень. вот исходники которые нарыл - пример отрабатывает в фоне три минуты BackgroundTaskManager.zip
  39. 2 балла
    Класс для работы с FastCGI серверами, такими как php-fpm. Для тех кто не в теме : веб-сервер, к примеру nginx, получает запросы и отправляет их на исполнение FastCGI серверу, к примеру php-fpm, php-fpm получает имя скрипта, параметры, выполняет все и возвращает результат в nginx, который в свою очередь возвращает этот результат запросившему клиенту. С помощью класса вы можете так же, выполнять php скрипты на локальном или удаленном сервере. Исходники https://github.com/EvgeniyKorepov/FastCGIClient Пример delphi var FFastCGI : TFastCGI; ... procedure TFormMain.FormCreate(Sender: TObject); var AHost : String; APort : Word; AScriptFileName, ARequest, AContent : String; begin AHost := '10.0.0.4'; APort := 9000; FFastCGI := TFastCGI.Create(AHost, APort); FFastCGI.KeepAlive := True; AScriptFileName := '/opt/xxx.php'; ARequest := 'request=1234567890'; if FFastCGI.Get(AScriptFileName, ARequest, AContent) then Memo.Text := AContent else Memo.Text := FFastCGI.StatusCode.ToString + ' ' + FFastCGI.StatusText; end; пример php <?php header('Content-Type: text/html; charset=utf-8'); if (isset($_REQUEST["request"])) if ($_REQUEST["request"] == "1234567890") { header("Status: 200"); echo 'OK'; } else { http_response_code(400); echo "ERROR"; }
  40. 2 балла
    Рабочий код: procedure TForm1.HandleActivityMessage(const Sender: TObject; const M: TMessage); var RequestCode, ResultCode: Integer; Intent: JIntent; uri : Jnet_Uri; bitmap: JBitmap; surface: TBitmapSurface; begin if not(M is TMessageResultNotification) then exit; TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, FMessageSubscriptionID); FMessageSubscriptionID := 0; RequestCode:=TMessageResultNotification(M).RequestCode; ResultCode:=TMessageResultNotification(M).ResultCode; Intent:=TMessageResultNotification(M).Value; if (ResultCode = TJActivity.JavaClass.RESULT_OK) and Assigned(Intent) then begin try uri:=Intent.getData; bitmap := TJImages_Media.JavaClass.getBitmap(SharedActivity.getContentResolver, uri); surface := TBitmapsurface.Create; JBitMapToSurface(bitmap,surface); Image1.Bitmap.Assign(surface); finally surface.Free; end; end;
  41. 2 балла
    OnePeople

    не работает в Андроид TTabTransition.Slide

    SetActiveTabWithTransitionAsync
  42. 2 балла
    Друзья, вы будете смеяться - Эмбаркадера наконец то обратила внимание на заявку по этой проблеме. Правда в стиле моя-твоя непонимай ))) https://quality.embarcadero.com/browse/RSP-16910
  43. 2 балла
    Delphi уже лет 20ть хоронят UniGUI не убил IntraWeb, FMX живет рядом с VCL. Есть шанс, что FGX наоборот поможет FMX, так как сможет добавить интерес к самой RAD
  44. 2 балла
    Andrey Efimov

    Покупки из приложения

    Вы пробовали пользоваться поиском на форуме? (Думаю нет...) Работа с TInAppPurchase p.s. Тему перенёс в соответствующий раздел "TInAppPurchase"
  45. 2 балла
    Это приложение: - помогает выбрать моменты затяжки резьбовых соединений согласно СТБ 1879-2008; - помогает производить расчёт момента затяжки и усилия других резьб; - подсказывает моменты затяжки в детали пневмокомпонентов; - даёт возможность вставки результата в буфер обмена а далее например в AutoCAD. Использовался СТБ 1879-2008 и справочник "Основы конструирования" под. ред. Орлова П.И. том 2 страницы 174 и 131. Разработал: Олег Киреев. г. Минск. т. +375 29 676 13 84. kireevoleg1966@gmail.com Приму любые замечания и предложения. Последнее обновление 29.10.2019г. Момент затяжки v.4.2.rar
  46. 2 балла
    juppy

    не прорисовывается часть интерфейса

    Ребя, сам разобрался. Спасибо всем переживающим ? Перенес апдейт листбокса туда, где он должен быть. Теперь кусочек стал выглядеть вот так: TThread.Synchronize(nil, procedure () begin lbTare.BeginUpdate; UpdateTareBalanceItems; Label7.Text := 'Обновлено'; lclCloseAnimationT; lbTare.EndUpdate; end); Теперь работает вот так: https://www.youtube.com/watch?v=XABighMePBo Если есть замечания по коду - поделитесь...
  47. 2 балла
    Tumaso

    Долгая реакция переключения вкладок

    Попробуй при создании приложения единоразово вызвать процедуру PreloadContent(TabControl2), где PreloadContent определена следующим образом: procedure PreloadContent(const AControl: TControl); {$IF DEFINED(ANDROID) or DEFINED(IOS)} var I: Integer; {$ENDIF} begin {$IF DEFINED(ANDROID) or DEFINED(IOS)} if AControl is TStyledControl then TStyledControl(AControl).ApplyStyleLookup; if AControl.ControlsCount > 0 then for I := 0 to AControl.ControlsCount - 1 do PreloadContent(AControl.Controls[I]); {$ENDIF} end;
  48. 2 балла
    я тоже не разобрался.. т.к. у меня в дизайнере создана custom item, все в Live Binding настроено.. поэтому ( для моего случая подходит - т.к. данных немного , не боле 100).. создал два одинаковых DataSet - один это результат запроса, никуда не приделан, второй ( полученный копированием в дизайнере первого) - прибайденный. Открываю запрос - заполняется первый датасет ( это в потоке без синхронайза, т.к. на экран ничего не выводится), на экране нет еще данных. Копирую из 1го во второй - и данные на экране появляются( это уже в синхронайзе). Это позволило развязать получение данных с сервера и отображение их на экране. Понятно, что данных в два раза больше, но для меня не критично.
  49. 2 балла
    Евгений Корепов

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

    Вы где то ошиблись. Или в левой кодировке сохранили файл, или еще что. На тестовом проекте добавил - все отлично собралось. Вот мой AndroidManifest.template.xml <?xml version="1.0" encoding="utf-8"?> <!-- BEGIN_INCLUDE(manifest) --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="%package%" android:versionCode="%versionCode%" android:versionName="%versionName%" android:installLocation="%installLocation%"> <uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" /> <%uses-permission%> <uses-feature android:glEsVersion="0x00020000" android:required="True"/> <application android:persistent="%persistent%" android:restoreAnyVersion="%restoreAnyVersion%" android:label="%label%" android:debuggable="%debuggable%" android:largeHeap="%largeHeap%" android:icon="%icon%" android:theme="%theme%" android:hardwareAccelerated="%hardwareAccelerated%" android:resizeableActivity="false" <!-- Вот сюда я добавил строчку --> android:usesCleartextTraffic="true"> <%provider%> <%application-meta-data%> <%uses-libraries%> <%services%> <!-- Our activity is a subclass of the built-in NativeActivity framework class. This will take care of integrating with our NDK code. --> <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" android:label="%activityLabel%" android:configChanges="orientation|keyboard|keyboardHidden|screenSize" android:launchMode="singleTask"> <!-- Tell NativeActivity the name of our .so --> <meta-data android:name="android.app.lib_name" android:value="%libNameValue%" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <%activity%> <%receivers%> </application> </manifest> <!-- END_INCLUDE(manifest) -->
  50. 2 балла
    Добрый вечер, Тут есть два способа: Работа с Deployment менеджером. Он довольно подробно описан на Embarcadero Doc Wiki: http://docwiki.embarcadero.com/RADStudio/XE5/en/Deployment_Manager Работа через менеджер ресурсов и их получение через ResourceStream. Этот способ описал MyDelphiPw в сообщении выше тут. 1. Deployment Manager Специальная настройка проекта, которая позволяет указать, какие файлы нужно включить в состав пакета (Андроид) или бандла (iOS). Суть его работы простая, вы указываете какие файлы с вашего компьютера нужно перенести на устройство (в какое место). А далее работаете с ними из приложения так, как при обычной работе с файлами под Windows. На мобильных платформах нужно учесть специфику возможных местоположений файла. Пакет/Бандл (приложение) не допускает изменения внутренних файлов, потому что подписывается сертификатом. Поэтому теоретически при изменении файлов приложения, вы нарушаете целостность подписи. Именно по этому файлы внутри пакета/бандла доступны только на ЧТЕНИЕ. Однако, мобильные платформы предлагают широкий круг специальных мест для хранения (временные папки, песочницы, документы, карточка памяти и тд) изменяемых файлов (например файл локальной базы данных, или настройки в ini файле и тд). Описание всех вариантов местоположений с описанием путей есть в записе TPath (RTL): http://docwiki.embarcadero.com/RADStudio/XE5/en/Standard_RTL_Path_Functions_across_the_Supported_Target_Platforms. Общие действия для использования менеджера развертывания такие: 1. Открываем менеджер развертывания: Системное Меню -> Project -> Deployment. 2. Выбираем в верхнем выпадающем меню платформу и конфигурацию сборки. 3. Нажимаем кнопку добавить файл и выбираем нужный файл. 4. Указываем местоположение файла, куда он должен поместиться после развертывания приложения на устройстве. Тут есть особенность, если файл нужен только на чтение, то пути менять не надо. Если возможна ситуация, когда файл может быт изменен, то файл нужно поместить под iOS в Startup\Documents\ (регистр важен) Под Андроид в assets\internal (регистр важен) - для внутреннего доступа из пакета приложения или assets - для внешнего доступа 5. Получаем пути к расположению файлов: Под iOS: TPath.Combine(TPath.GetDocumentsPath, 'filename') Под Андроид: TPath.Combine(TPath.GetDocumentsPath, 'filename') { Внутренний доступ} TPath.Combine(TPath.GetSharedDocumentsPath, 'filename') { Внешний доступ } Полезные ссылки Подробное руководство по добавлению файлов для iOS: http://docwiki.embarcadero.com/RADStudio/XE5/en/Creating_an_iOS_App#Loading_and_Deploying_Files Подробное руководство по добавлению файлов для Android: http://docwiki.embarcadero.com/RADStudio/XE5/en/Creating_an_Android_App#Loading_and_Deploying_Files
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...