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

Sergionn

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

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

  • Посещение

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

    2

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

  1. Like
    Sergionn отреагировална Vladimir Cheplygin в Контора ищет FMX разработчика   
    Привет,
    Контора ищет FMX разработчика для помощи в миграции приложения  c VCL на FMX.
    Начальник по-русски не говорит, вот его объявление по-английски:
    =================================================
    Hello,
    We are looking for an FMX developer, experience required.
    We are located in the Netherlands, but working remote is possible.
    This is a long term project for at least 3 days per week.
     
    Thanks, Kees Vermeulen, A-dato
    =================================================
    Соответственно, требуется общение по-английски (или по-голландски).
     
  2. Like
    Sergionn отреагировална Barbanel в Контора ищет FMX разработчика   
    Не соглашусь. Не обязательно третий мир, скорее как источник опытных кадров. У нас очень похожая ситуация:
    находимся в Германии, ищем Delphi разработчика, желательно с опытом fmx. Компания небольшая, поэтому гугловских зарплат не предлагаем.
    Из моего опыта, предлагаемая ЗП соответствует уровню миддл-разработчика. Важно понимать, что речь идет о начальной ЗП, которая пересматривается со временем.
    Людей просто нет. Не то чтобы им ЗП мала, их (людей) нет. Присылают резюме всякие индусы да турки-арабы-хзкто, это не тот контингенс с которыми мы готовы работать.
    В итоге плюнули, и везем людей из экс-ссср. На собеседовании тупых вопросов про люки не задавали. Выделили месяц-два для работы в удаленном режиме, чтобы посмотреть как человек справляется, какие вопросы задает, насколько вообще активен.
    После этого принимаем решение о релокации.

    PS, друг работает в Голландии, разрабатывают ПО для аэропортов.
    Его компания за пять лет привезла более тридцати русскоговорящих разработчиков.
    Имхо, это говорит о многом.
  3. Like
    Sergionn отреагировална Евгений Корепов в 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
  4. Like
    Sergionn получил реакцию от Ingalime в Не могу выложить программу в гугл магазин   
    пообещали в бете 10.4, т.е. если разработчик на комьюнити или на лечении, то тогда ждет до релиза в конце 2019((,
    как бы с такими сроками все во флаттер не ушли, окончательно((
  5. Like
    Sergionn получил реакцию от Barbanel в Не могу выложить программу в гугл магазин   
    пообещали в бете 10.4, т.е. если разработчик на комьюнити или на лечении, то тогда ждет до релиза в конце 2019((,
    как бы с такими сроками все во флаттер не ушли, окончательно((
  6. Like
    Sergionn отреагировална #WAMACO в Мобильная разработка на Delphi - программа для врачей по оценке взаимодействий лекарств.   
    Кстати, за Android подробно не скажу, но приложения FireMonkey на iOS вполне себе быстро работают!  
  7. Like
    Sergionn отреагировална #WAMACO в Мобильная разработка на Delphi - программа для врачей по оценке взаимодействий лекарств.   
    Отличное начало!
    Вопрос: а почему не на FireMonkey делали? было бы сразу и под iOS!
    у многих врачей же смартфоны Apple!
     
  8. Like
    Sergionn отреагировална Tumaso в Мобильная разработка на Delphi - программа для врачей по оценке взаимодействий лекарств.   
    А потестировать её как нибудь можно на своих аппаратах?
  9. Like
    Sergionn отреагировална Vitaldj в Мобильная разработка на Delphi - программа для врачей по оценке взаимодействий лекарств.   
    Уважаемый коллеги! Пришло время показывать результаты работы нового фреймворка FGX native в деле и в реальном приложении. В рамках XXVI РОССИЙСКОГО НАЦИОНАЛЬНОГО КОНГРЕССА «ЧЕЛОВЕК И ЛЕКАРСТВО» будет представлен доклад:
    «Контроль полипрагмазии «в кармане», мобильная разработка основанная на FGX Native» 
    Будет представлена мобильная программа, написанная с использованием вышеназванного фреймворка для Андроида. Конечно конгресс для врачей, но если кому будет интересно, приходите послушать доклад 9-го апреля в ЦМТ ( Москва, Краснопресненская набережная, 12). С 16-00 до 20-00. Доклад последний,  поэтому, думаю к 18-30 можно подтягиваться! 
    Программа конгресса
  10. Like
    Sergionn отреагировална krapotkin в Переезд на 10.3 Rio   
    сколько бед принесла уже стрельба в ногу под названием ProcessMessages
    как хорошо, что в Андроиде наконец всех отучат от этого крайне вредного трюка
    давайте формально 
    все что там у вас "высоконагруженное" выносите в потоки и пусть они работают. Ваши "потоки" пасутся в главном (Synchronize) и никакого толка нет
    концепцию надо поменять. запустили поток и занимайтесь своим делом. например покажите Splash
    а вернется поток - вот по возвращению и сделаете то, что этот Splash закроет.
    и уж точно потоки не должны ничего общего иметь с формами
    я писал статью про потоки, там про сплеши тоже есть в блоге и про ProcessMessages отдельная боль...
    http://www.cyberforum.ru/blogs/469693/blog4875.html
     
  11. Like
    Sergionn отреагировална yooSee в Runtime permissions in Delphi 10.3 Rio   
    Всем привет, вот и я решил внести свою лепту в жизнь форума и сегодня мы разберемся с разрешениями на Delphi Rio под Андроид. 
    Для примера мы будем использовать разрешения на чтение и запись с памяти устройства, для начала в нашем проекте выставим в Delphi>Project>Application>Uses Permissions галочки на Read External Storage и Write External Storage.
    в uses проекта добавьте следующее
    uses System.Permissions, Androidapi.Jni.Os, Androidapi.Helpers, далее  создадим переменные
    var Form: TForm; .... FPermissionWrite: string; FPermissionRead: string; в Form.Create добавим следующий код
    procedure TForm.FormCreate(Sender: TObject); begin FPermissionWrite := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE); //Значение на запись FPermissionRead := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE); //Значение на чтение end; и теперь сам не посредственно запрос на подтверждение наших прав
    procedure TForm.Button1Click(Sender: TObject); begin PermissionsService.RequestPermissions ([FPermissionWrite, FPermissionRead], nil); end; //это вызовет окно с запросом разрешения прав ну и для проверки бросим на форму TMemo и пару TButton , в них реализуем сохранение и чтение из файла с памяти устройства
    procedure TForm.Button1Click(Sender: TObject); begin Memo1.Lines.LoadFromFile(TPath.Combine(TPath.GetSharedDocumentsPath, 'test.txt')); end; procedure TForm.Button2Click(Sender: TObject); begin Memo1.Lines.SaveToFile(TPath.Combine(TPath.GetSharedDocumentsPath, 'test.txt')); end; P.S. Напоминаю что для работы TPath нам понадобится подключить в Uses 
    uses System.system.ioutils; Надеюсь материал будет полезен! 
     
     
     

    video_2019-02-08_00-11-36.mp4 Permissions.zip
  12. Like
    Sergionn отреагировална Brovin Yaroslav в С днем рождения Андрей Ефимов ???   
    Хочу от всей души поздравить с днем рождения нашего модератора Андрея Ефимова @Andrey Efimov. Человек, на которого можно положиться и который всегда готов прийти на помощь. Из года в год помогает нашему форуму становиться лучше. 
    С днем рождения! Успехов тебе в работе, в личных делах. И не забывать про Делфи!
  13. Like
  14. Like
    Sergionn отреагировална Tumaso в ErrorSoft TurboUpdate - Автообновление ваших Windows приложений   
    Ничего личного, но само название ErrorSoft как бы намекает....
  15. Like
    Sergionn отреагировална Maximus в Ура! Вышла 10.3 Rio!   
    Сырая как обычно. Вот как они тестировали?
     
  16. Like
    Sergionn отреагировална sinuke в [Android] Прозрачный StatusBar в RAD 10.3 Rio   
    Привет
    Вчера была выпущена финальная версия RAD Studio 10.3 Rio, в которой много нововведений для Андройд. Но вот про статусбар снова "забыли". Хотя не совсем, добавили файлик styles-v21.xml, который превносит новую материальную тему на устройствах под управлением Android 5.0 и выше вместо устаревшей Holo.
    Но все равно свойство формы SystemStatusBar так и не реализовали. Поэтому при запуске статус бар будет окрашен в унылый серый цвет (см. скриншот).

    Для того, чтобы сделать статусбар прозрачным и поместить под него содержимое формы, то достаточно сделать несколько несложных шагов:
    1. Убираем из деплоймента (Project -> Deployment) файл styles-v21.xml (можно просто снять галочку рядом с именем файла)

    2. Добавить в деплоймент проекта новый файл styles-v21.xml (styles-v21.zip) и прописать ему путь res\values-v21\

    3. В результате получится следующий вид

     
    P.S. В новом файле по сравнению со стандартным добавилась строчка <item name="android:windowTranslucentStatus">true</item>, которая и отвечает за прозрачный статусбар
    P.P.S. Чтобы определять размер статус бара, все также можно воспользоваться решеним ZuBy - http://blog.rzaripov.kz/2016/12/android-ios.html
    P.P.P.S. Тестовый проектик - StatusBar.zip
  17. Like
    Sergionn отреагировална ENERGY в Не оптимизированный TLabel и TText (решение)   
    Есть такая процедура, function DelAmp(const Text: string): string; в FMX.Types.
    Которая 2 раза выделяет память для всей строки, и сканирует все символы в строке, в поисках &.
     
    TLabel.Text  := 'Text';  - эта процедура  выполнится 2 раза, на любой платформе. Чтобы она выполнилась 1 раз, нужно сделать
    TLabel.PrefixStyle := TPrefixStyle.NoPrefix;
     
    TText 
    TText.Text  := 'Text'; Процедура DelAmp выполниться в любом случае на любой платформе
    procedure TText.SetText(const Value: string); [..] begin   if Text <> Value then   begin     NewText := ConvertText(DelAmp(Value)); [..] Стили состоят из множества TText элементов. Теперь представьте сколько ресурсов тратиться впустую.
     
    function DelAmp(const Text: string): string; var I, J: Integer; Sb: TCharArray; begin Result := ''; if Text <> '' then begin SetLength(Sb, Text.Length); I := Low(Text); J := 0; while I <= High(Text) do begin if (Text[I] <> '&') then begin Sb[J] := Text[I]; Inc(J); end else begin if ((I < High(Text)) and (Text[I + 1] = '&')) then begin Sb[J] := Text[I]; Inc(J); Inc(I); end; end; Inc(I); end; Result := string.Create(Sb, 0, J); end; end;  
     
    Решение - скопировать FMX.Types в папку с проектом, и переделать функцию на:
     
    function DelAmp(const Text: string): string; begin   Result := Text; end;  
  18. Like
    Sergionn отреагировална x11 в Embarcadero.... Community Edition!   
    Если бы они это сделали сразу, т.е. чтобы FMX была бесплатно доступна, то сообщество Firemonkey было бы значительно обширнее.
    Глядишь, и в ВУЗах бы изучали.
  19. Like
    Sergionn отреагировална Равиль Зарипов (ZuBy) в Производительность отрисовки текста на мобильных платформах   
    Так у вас такой же велосипед.
    Сейчас он напишет «готовое решение» и тоже поставит ценник. 
  20. Like
  21. Like
    Sergionn отреагировална haword в [Вебинар] FGX Native. Новейшая кроссплатформенная платформа для мобильной разработки на Delphi   
    сколько будет стоить и будет ли совместимость с vcl по методам и параметрам? 
  22. Like
    Sergionn отреагировална Brovin Yaroslav в [Вебинар] FGX Native. Новейшая кроссплатформенная платформа для мобильной разработки на Delphi   
    FGX Native полностью независимый от FMX фреймворк на мобильных платформах. Однако, все невизуальные компоненты будут доступны (уведомления, работа с БД, REST API и тд). Прежде всего это сделано, поскольку архитектура FMX не рассчитана для производительной работы с нативными контролами. Под этим я подразумеваю ряд взаимодействий с системой, которые жестко сидят в ядре FMX (работа с текстом, система событий OnMouseXXX, принцип отрисовки, завязка на старое API и многое другое). Помимо этого, разработка мобильного приложения кардинально отличается от разработки приложения для настольных платформ из-за разных подходов к проектированию интерфейсов и заканчивая принципиально разными и специфичными компонентами. 
    Кстати, первая экспериментальная версия FGX Native (которая так и осталась не опубликованной) была построена мною на базе FMX. Однако эксперименты на практике показали, что такой подход тупиковый и ведет к значительному усложнению системы без адекватной выгоды для пользователей. А большая зависимость от FMX является для меня потенциальным риском быть связанным по рукам от ошибок. Поэтому было принято решение сделать FGX Native полностью независимым. За год работы была реализована (и продолжает реализовываться) платформа и совершенно новый и дизайнер форм с нуля. Это дает мне большую гибкость в расширение функционала, как самой библиотеки, так и дизайнера. Имея свой дизайнер, я могу реализовать любую идею, которая повысит удобство пользователя при работе с библиотекой.
    А вообще это тема интересная и я постараюсь немного рассказать про это на вебинаре.
    Частично информация освещается на официальном телеграмм канале https://t.me/cross_delphi, где я с недавнего времени стал публиковать процесс текущий разработок по библиотеке.
  23. Like
    Sergionn отреагировална Brovin Yaroslav в [Вебинар] FGX Native. Новейшая кроссплатформенная платформа для мобильной разработки на Delphi   
    Тема: FGX Native. Новейшая кроссплатформенная платформа для мобильной разработки на Delphi Дата и время: 27 марта 2018 года в 12:00 Участники: @Brovin Yaroslav, Андрей Совцов Регистрация: ссылка Ссылка на официальный телеграмм канал: https://t.me/fgx_native Участие бесплатное На вебинаре познакомимся с текущей разработкой новой кроссплатформенной платформы, позволяющей создавать нативные приложения с быстрым откликом, плавной анимацией, продвинутой системой выраванивания, поддержкой RTL языков, оптимизированной работой с изображениями, быстрой канвой и многим другим. RAD Studio, Android/iOS В вебинаре принимает участие автор разработки Ярослав Бровин
     





  24. Like
    Sergionn отреагировална Равиль Зарипов (ZuBy) в Что невозможно сделать на Delphi для Android?   
    Выучить?)
    Понять как все устроено хватило недели, когда писал один проект для работы. Писал и сразу учился, без гугла никак. В интернете куча материала, причём есть и на русском.
    Новый проект начал на котлине, если с нуля изучать, то лучше котлин. Синтаксис приятней 
  25. Like
    Sergionn отреагировална Ingalime в Что невозможно сделать на Delphi для Android?   
    Если, главный модератор и разработчик, Равиль Зарипов, говорит, что у дельфи  нет будущего и надо уходить с Дельфи. То это диагноз FMX на сегодняшний день. Грустно...
×
×
  • Создать...