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

Barbanel

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

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

  • Посещение

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

    36

Активность репутации

  1. Like
    Barbanel получил реакцию от Ingalime в Установить две версии программы на один Android-планшет   
    Нужно в настройках проекта изменить имя пакета.
    В 10.3 это в Project -> Options -> Application -> Version Info -> Key: ProgramID
  2. Like
    Barbanel отреагировална Евгений Корепов в Проверка наличия прав   
    Вам удалось решить проблему для камеры? Перелопатил весь интернет, но похоже Эмба не озаботилась этим вопросом. 
    Пока присобачил костыль из говна и палок - в AppEvent определяю что приложение стало не активным TApplicationEvent.WillBecomeInactive, значит вылез диалог спрашивания разрешений, После этого по событию TApplicationEvent.BecameActive (диалог завершен), проверяю что приходит от камеры в FCamera.OnSampleBufferReady - если черный-черный ничего, то можно подумать что разрешение не было дано )))))))) От этого костыля у меня кровь из глаз....
  3. Like
    Barbanel отреагировална gonzales в [Delphi Berlin FMX Win32] Как реализовать Drag and Drop у StringGrid?   
    Отвечу сам себе. Проблема решена.
    Всего два дня поисков и вот он, случай - краеугольный камень поиска ошибок! Меня аж забомбило, когда я это откопал. Оказалось, что мой грид лежит на лайоуте, у которого hittest = false. Так вот до тех пор, пока я не перевел его в true грид отказывался принимать ondragover. Но как только layout.hittest:=true все заработало. Дальше дело техники.
  4. Like
    Barbanel отреагировална Сергей Сергеев в Личный кабинет пациента поликлиники   
    сделано на Datasnap - 3х звенка
    MsSql- Сервис Https - Клиент ( Андроид, Ios, Win, Mac)
     
    Личный кабинет пациента клиники (www.familydoctor.ru) открывает зарегистрированным пользователям доступ
    к медицинской карте (результаты лабораторных исследований и функциональной диагностики,
    описание приемов врачей, направления и рекомендации,
    истории посещений клиники (дата, время, специалист),
    программам медицинского наблюдения (перечень, период прикрепления),
    информации о движении средств по депозитам.

    Для пересылки выписок (файлов) из медицинской карты используется электронная почта (в системе должен быть настроенный Майл Агент на отправку почты).
    Полной версией приложения могут воспользоваться только пациенты, подключившие услугу "Личный кабинет" в регистратуре любого корпуса клиники "Семейный доктор".
    В новой версии изменен дизайн, появились новые функции и разделы:
    вход по номеру медкарты или ФИО;
    запрос нового пароля;
    заявка на онлайн запись;
    отмена приема;
    прейскурант услуг клиники;
    справочник адресов клиники.
    сервис оплаты услуг клиники через приложение.
    В ближайшем будущем функционал личного кабинета будет дополнен онлайн расписанием специалистов, возможностью электронной записи на приём. 

     
    в гугл плее
     https://play.google.com/store/apps/details?id=com.familydoctor.FD
    Есть тестовый вход, обращайтесь. 
     
  5. Thanks
    Barbanel отреагировална Шамсуддин в Замена текста в Word и OpenDocument   
    Доброго времени суток!
    Сделал простенький компонент для замены текста в документах Word (docx) и OpenDocument (odt). Особенностью данного компонента является отсутствие необходимости какого-либо дополнительного ПО типа MS Office или OpenOffice и использует только встроенные библиотеки. В связи с чем он может работать на различных платформах (но ещё не проверял  ).
    DocumentProcessing.zip
    Как использовать:
    uses DocumentProcessing; ... procedure TForm2.Button1Click(Sender: TObject); var Document: TDocumentProcessor; begin Document:= TDocumentProcessor.Create(Self); Document.FilePath:= 'D:\test.docx'; Document.Open(TDocumentKind.dkDocx); Document.ReplaceText('Familiya', 'Cat'); Document.Save; Document.Open('D:\test.odt', TDocumentKind.dkOdt); Document.ReplaceText('Familiya', 'Cat', [rfReplaceAll]); Document.Save; end;  
    Немного о принципе работы:
    Проблемы:
     
  6. Like
    Barbanel получил реакцию от Андрей Рулин в Установить две версии программы на один Android-планшет   
    Нужно в настройках проекта изменить имя пакета.
    В 10.3 это в Project -> Options -> Application -> Version Info -> Key: ProgramID
  7. Like
    Barbanel получил реакцию от Ingalime в Не могу изменить размеры и формы компонентов   
    Зайдите в стайлбук и убедитесь что у вас отверстано для всех платформ, а не только для Виндовс.
    Аналогично, выйдя из стайлбука переключите IDE в режим отображения Андроид-инт  ерфейса.


  8. Like
    Barbanel отреагировална Олег Киреев в Приложение для расчёта сцепления автомобиля и его привода v.1.1   
    Это приложение для OS Windows выполняет:
    1.Расчёт сцепления:
    -расчёт и подбор геометрических параметров нажимного и 
    ведомого дисков, муфты выключения;
    -проверка параметров по теплонагруженности пар трения;
    -расчёт всех наиболее нагруженных деталей сцепления 
    (пружины, пластины, подшипник).
    2.Расчёт пневмогидравлического привода сцелпения:
    -подбор и проверка управляющего и исполнительного 
    органов;
    -объём жидкости.
    3.Возможность вноса и редактирования исходных данных и 
    результатов в БД.
    4.Распечатку всего расчёта с исходными данными, 
    формулами, графиками, используемой литературой и 
    результатами в MS Word.
    5.Просмотр и изучение нажимного, ведомого дисков
    и муфты выключения в 3D.
    Изначально для работы в приложении необходимы 
    некоторые
    знания конструкции сцепления и теории расчёта.
     Автор: Олег Киреев-ведущий инженер-конструктор,
                  kireevoleg1966@gmail.com, +375 29 676 13 84
                  БЕЛАРУСЬ, г.Минск.
    Приму Ваши замечания и предложения.
    По совету Равиля Зарипова РАЗМЕСТИЛ на файлообменнике 12.08.2019г по этой: https://mega.dp.ua/a27WmeXKwY ссылке. На этом ресурсе обещают хранить 90 дней. Интересно услышать Ваши отзывы.




  9. Like
    Barbanel отреагировална #WAMACO в Не могу изменить размеры и формы компонентов   
    Delphi может ВСЕ!
  10. Like
    Barbanel отреагировална Alex7wrt в android:minSdkVersion после 1 августа   
    Манифест нужно редактировать только в одном месте - в файле AndroidManifest.template.xml, который лежит непосредственно в папке вашего проекта
    На основе этого файла генерируется файл манифеста, который добавляется к приложению.
  11. Like
    Barbanel отреагировална Alex7wrt в android:minSdkVersion после 1 августа   
    Так как с 1 августа Google требует указывать targetSdkVersion 28 и выше, то логично будет использовать 28-ю версию.29-я это Android 10, который еще не вышел официально. Думаю, проблем с ней не должно быть, но я бы повременил с ее использованием.
    Обратите внимание, что использование все более новых targetSdkVersion может приводить к некоторым ограничениям, которые вводит Google в новых версиях андроида.
    Например, при переходе на targetSdkVersion 28 вы обнаружите, что ссылки, начинающиеся на "http" считаются небезопасными и по умолчанию не обрабатываются. Рекомендуется повсеместно переходить на "https".
    Так что, если вы в каком-нибудь THTTPClient или где-либо еще выполняли запрос на "http", а после перехода на targetSdkVersion 28 обнаружили, что ваш код перестал работать, то либо переходите на "https", либо, если все же необходимо выполнять запрос на "http",  внесите изменения в файле манифеста: в разделе application нужно добавить строку android:usesCleartextTraffic="true".
     
  12. Like
    Barbanel отреагировална Alex7wrt в android:minSdkVersion после 1 августа   
    Название SDK Version в FMX остается таким каким было при первой установке и не меняется при обновлении Android SDK. Если вы исправно обновляете Android SDK, то в SDK менеджере вы можете указать последние версии  ZipAlign Location и Aapt Location, в частности 28.
  13. Like
    Barbanel отреагировална Alex7wrt в android:minSdkVersion после 1 августа   
    В справке Google говорится исключительно о targetSdkVersion, а не о minSdkVersion. И targetSdkVersion="26" - это условие для прошлого года. В этом году нужно писать targetSdkVersion="28" 
  14. Like
    Barbanel отреагировална Евгений Корепов в Helper для TBitmap - асинхронная загрузка картинки из URL   
    Окончательный вариант. Долго бился с изменением размера картинки внутри потока (к примеру что бы в ListView не грузить картинки больше чем нужно). Средствами TBitmap это оказалось сделать невозможно (именно в потоке), чтение форумов, issue Эмбаркадеро, привело к туманному выводу что проблема в архитектуре FMX.  В Токио, TBitmap стал потокобезопасным - это означает что никогда не пытайтесь использовать Bitmap в потоке, рано или поздно получите артефакты и глюки.
    Я решил проблему отказавшись от работы с TBitmap в потоке, и использовав для этого TBitmapSurface (загрузка из stream, изменение размеров).
    Что умеет хелпер:
    1. Загрузка картинки в Bitmap и подгонкой размера (размер можно и не менять - не передавайте параметр ASize)
    procedure LoadFromURLAsync(const AURL : String; const ASize : TControlSize = nil); overload;
    2. Загрузка картинки в TListItemImage ListView. После Окончания загрузки хелпер выполнит AListItemImage.Invalidate в основном потоке приложения для отрисовки картинки.
    procedure LoadFromURLAsync(const AURL : String; const AListItemImage : TListItemImage); overload;
    3. Создание картинки. Тоже самое что и предыдущие, но можно сэкономить строчку кода ABitmap:=TBitmap.Create ?
    constructor CreateFromUrlAsync(const AURL : String; const AListItemImage : TListItemImage = nil);
    По картинкам в ListView - можете на свой страх и риск грузить 100500 картинок, но лучше использовать загрузку только для видимой части (+- еще сколько то итемов). Хелпер тупо грузит картинки и не обеспечивает механизм оптимальной загрузки.
    Протестировано на Windows и Android.
    Ответы на вопросы которые мне задавали:
    Почему не создавать отдельный поток для каждой картинки, в нем создавать THTTPClient и делать запрос - пробовал этот вариант, он медленнее на порядок, даже под виндой это чертовски медленно. AHTTPClient.BeginGet и так создает отдельный поток на каждый запрос. Почему AHTTPClient глобальный для юнита - в хелпере нельзя вводить свои переменные, а создавать AHTTPClient внутри функции не выйдет - он убьется до завершения потока. И текущий вариант быстрее. Код хелпера и архив с тестовым проектом:
    unit BitmapAsyncLoader; interface uses System.Net.HttpClient, System.Net.URLClient, System.SysUtils, System.Types, System.Classes, FMX.Graphics, FMX.Surfaces, FMX.Types, FMX.ListView.Types; type TBitmapAsyncLoader = class helper for TBitmap private function ResizeBitmapSurface(const ABitmapSurface : TBitmapSurface; const AWidth, AHeight : Integer) : TBitmapSurface; procedure SynchronizeAssignFromBitmapSurface(const ABitmapSurface : TBitmapSurface; const AListItemImage : TListItemImage = nil); procedure StartHTTPThread(const AURL : String; const AWidth, AHeight : Integer; const AListItemImage : TListItemImage = nil); public procedure LoadFromURLAsync(const AURL : String; const ASize : TControlSize = nil); overload; procedure LoadFromURLAsync(const AURL : String; const AListItemImage : TListItemImage); overload; constructor CreateFromUrlAsync(const AURL : String; const AListItemImage : TListItemImage = nil); end; implementation type THTTPClientListener = class class procedure HTTPClientValidateServerCertificate(const Sender: TObject; const ARequest: TURLRequest; const Certificate: TCertificate; var Accepted: Boolean); end; var AHTTPClient : THTTPClient; constructor TBitmapAsyncLoader.CreateFromUrlAsync(const AURL : String; const AListItemImage : TListItemImage = nil); begin Create; LoadFromURLAsync(AURL, AListItemImage); end; procedure TBitmapAsyncLoader.LoadFromURLAsync(const AURL : String; const AListItemImage : TListItemImage); var AWidth, AHeight : Integer; begin if Assigned(AListItemImage) then begin AWidth:=Round(AListItemImage.Width); AHeight:=Round(AListItemImage.Height); end else begin AWidth:=-1; AHeight:=-1; end; StartHTTPThread(AURL, AWidth, AHeight, AListItemImage); end; procedure TBitmapAsyncLoader.LoadFromURLAsync(const AURL : String; const ASize : TControlSize = nil); var AWidth, AHeight : Integer; begin if Assigned(ASize) then begin AWidth:=Round(ASize.Width); AHeight:=Round(ASize.Height); end else begin AWidth:=-1; AHeight:=-1; end; StartHTTPThread(AURL, AWidth, AHeight); end; function TBitmapAsyncLoader.ResizeBitmapSurface(const ABitmapSurface : TBitmapSurface; const AWidth, AHeight : Integer) : TBitmapSurface; begin if (AWidth <> -1) and (AHeight <> -1) then begin try Result:=TBitmapSurface.Create; Result.StretchFrom(ABitmapSurface, AWidth, AHeight, ABitmapSurface.PixelFormat); finally ABitmapSurface.Free; end; end else Result:=ABitmapSurface; end; procedure TBitmapAsyncLoader.SynchronizeAssignFromBitmapSurface(const ABitmapSurface : TBitmapSurface; const AListItemImage : TListItemImage = nil); begin TThread.Synchronize(Nil, procedure begin Assign(ABitmapSurface); ABitmapSurface.Free; if Assigned(AListItemImage) then AListItemImage.Invalidate; end ); end; procedure TBitmapAsyncLoader.StartHTTPThread(const AURL : String; const AWidth, AHeight : Integer; const AListItemImage : TListItemImage = nil); begin AHTTPClient.BeginGet( procedure (const ASyncResult: IAsyncResult) var AHTTPResponse : IHTTPResponse; ABitmapSurface : TBitmapSurface; begin if Not ASyncResult.IsCompleted then exit; try AHTTPResponse:=THTTPClient.EndAsyncHTTP(ASyncResult); except exit; end; if Assigned(AHTTPResponse) and (AHTTPResponse.StatusCode = 200) then begin ABitmapSurface:=TBitmapSurface.Create; if TBitmapCodecManager.LoadFromStream(AHTTPResponse.ContentStream, ABitmapSurface, Self.CanvasClass.GetAttribute(TCanvasAttribute.MaxBitmapSize)) then begin ABitmapSurface:=ResizeBitmapSurface(ABitmapSurface, AWidth, AHeight); SynchronizeAssignFromBitmapSurface(ABitmapSurface, AListItemImage); end; end; end, AURL ); end; class procedure THTTPClientListener.HTTPClientValidateServerCertificate(const Sender: TObject; const ARequest: TURLRequest; const Certificate: TCertificate; var Accepted: Boolean); begin Accepted:=True; end; initialization AHTTPClient:=THTTPClient.Create; AHTTPClient.OnValidateServerCertificate:=THTTPClientListener.HTTPClientValidateServerCertificate; finalization if Assigned(AHTTPClient) then AHTTPClient.DisposeOf; end.  
    BitmapAsyncLoader.7z
  15. Like
    Barbanel отреагировална Евгений Корепов в Работа с камерой - Rad 10.3   
    Обратите внимание к какой версии документации вы обращаетесь:
    http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Taking_Pictures_Using_FireMonkey_Interfaces
    http://docwiki.embarcadero.com/RADStudio/XE5/en/Mobile_Tutorial:_Taking_and_Sharing_a_Picture_(iOS_and_Android)
    Актуальная документация для 10.3
    http://docwiki.embarcadero.com/RADStudio/Rio/en/Taking_Pictures_Using_FireMonkey_Interfaces
    Разрешение на доступ Secure File Sharing возможно не понадобится если уберете галочку:

  16. Like
    Barbanel отреагировална Ingalime в переход к x64?   
    https://community.idera.com/developer-tools/b/blog/posts/google-play-store-android-32-bit-extension-for-delphi-and-c-builder-customers
  17. Like
    Barbanel получил реакцию от qz5 в переход к x64?   
    Т.е. в коммьюнити эдишн его не будет. Редиски!!! ?
  18. Like
    Barbanel отреагировална qz5 в переход к x64?   
    Вышла версия 10.3.2 - https://community.idera.com/developer-tools/b/blog/posts/announcing-the-release-of-delphi-c-builder-and-rad-studio-10-3-2
    Добавили поддержку macOS 64 бит, нотификации и поддержка Линукса новые теперь тоже из коробки поддерживаются
    но вот Андроид 64 - всё еще нет
  19. Like
    Barbanel отреагировална qz5 в переход к x64?   
    Нет, не игра, приложение.
    Просто на Java писать не охота, но желательно кроссплатформенно, чтобы потом на iOS тоже портировать.
    Лазарус - там Паскаль, его знаю. Unity - там C# и смогу разобраться.
    Код на Яве на Яблоко не перенесешь.
    Смотрел еще всякие Kotlin, React Native, но мне больше всего подходит именно Delphi Community Edition.
  20. Like
    Barbanel отреагировална qz5 в Версия андроид   
    И так я прошил этот телефон за 3000 рублей на Андроид 9 с помощью ADB, который идет вместе с Delphi!
    Примерно за 15 минус справился, вместе со скачиванием прошивки.
    Так что для тех, кто хочет иметь дешевый телефон с поддержкой Андроид 8.1, 9 и 10 - https://vk.com/wall-148943419_19677
    Делал по инструкции из ссылок, что выше дал, так что всё ОК.
  21. Like
    Barbanel отреагировална Ronalds Rizakovs в Работа с камерой - Rad 10.3   
    Заработала с TakePhotoFromCameraAction. Только одна строчка кода для обработчика TakePhotoFromCameraAction1DidFinishTaking
    Такие официальные мануалы только мозг пудрит... 
    Здесь правлений мануал. http://docwiki.embarcadero.com/RADStudio/XE5/en/Mobile_Tutorial:_Taking_and_Sharing_a_Picture_(iOS_and_Android)
    И нужно установить Project Options > Entitlements List > Secure File Sharing в значение true.      (Этого тоже нету в мануале...) 
  22. Like
    Barbanel отреагировална qz5 в THTTPClient   
    Подробности на английском языке: https://medium.com/@imstudio/android-8-cleartext-http-traffic-not-permitted-73c1c9e3b803
    https://medium.com/@son.rommer/fix-cleartext-traffic-error-in-android-9-pie-2f4e9e2235e6
    но достаточно, что я выше написал
  23. Like
    Barbanel отреагировална qz5 в THTTPClient   
    Сделайте как здесь написано http://fire-monkey.ru/topic/5631-не-открываются-страницы-на-android-9/#comment-36008
  24. Like
    Barbanel отреагировална qz5 в Версия андроид   
    Я разбавлю своим вариантом: Leagoo Power 2.
    У него цена около 3000 рублей, из коробки идет Андроид 8.1, но можно поставить Андроид 9 и даже... Android 10!!!
    С одной стороны у меня среди родственников есть смарты от 4ой до 9-ой версии Андроид, да и моя прога сейчас на всех работает (пока она простая).
    Но с другой стороны решил поискать дешевый смарт, на который можно несколько разных версий Андроид поставить, но:
    1. чтобы это было легко, без всяких разблокировок и т.п. (у новых Xiaomi, Huawei как раз проблемы с заблокированным загрузчиком)
    2. чтобы был максимально дешевый
    3. чтобы можно было поставить Андроид 8.1 и Андроид 9, причем разные сборки
    4. чтобы не надо было ставить всякие Flash Tools и т.п. - искал, чтобы прошивка была простой и максимально без лишних программ
    Оказалось, что Leagoo Power 2 Pro:
    1. Поддерживает GSI-прошивки от Project Treble (Андроид 8.1, Андроид 9 и Android 10)
    2. стоит около 3000 рублей
    3. Для прошивки не нужно никаких лишних программ! Достаточно ADB, а он и так уже идет вместе с Delphi (можно и самому ADB ставить на комп, если Delphi нет например)
    Взял на будущее, чтобы было дешевое устройство, на котором можно экспериментировать с прошивками
    Правда сам пока не пробовал - телефон получил, всё работает, но пока закинул его в коробочку, тестирую на смартфоне с Андроид 7 (он всё равно постоянно на столе и там нужные мне программы).
     
    Как прошить ТВРП: https://4pda.ru/forum/index.php?showtopic=928803&st=120#entry81458052
    Другие версии Андроид брать здесь: https://4pda.ru/forum/index.php?showtopic=892755
    Где купить: решайте сами, многие покупают на Пандао, но я почитал отзывы - Пандао какой-то странный магазин, ничего там не покупал и не стал из-за 200 рублей рисковать.
    Я взял там, где советует официальный производитель: https://vk.com/wall-148943419_19677
    Доставила почта Сингапура за 20 дней.
    p.s. я кучу разных вариантов пересмотрел и остановился именно на нем. Самая легкая перепрошивка из всех, недорогой смарт, есть запчасти, возможность ставить разные кастомы.
    может кому пригодится ?
     
  25. Like
    Barbanel получил реакцию от Anatoliy в ip адрес устройства Delphi fmx android   
    Не скажу как это сделать через Indy, но через системные обертки это можно.
    Обратите внимание на метод JWifiInfo.getIpAddress
    Надеюсь вам поможет.
    NetworkState.zip
×
×
  • Создать...