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

Barbanel

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

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

  • Посещение

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

    36

Сообщения, опубликованные Barbanel

  1. Всем доброго дня!

    Не хочу плодить новую тему, но мы все еще боремся с этой проблемой.
    iPhone 10, Delphi XE 11.3 верхний и нижний край приложения не достают до краев экрана.
    Не обрезаны, а именно не достают.

    А как у вас сегодня обстоят дела?
    Есть способы решения проблемы?
     

    13.12.27.png

  2. Эмулятор когда-то был, но если мне не изменяет память, в относительно последних версиях он не работал, это признавала сама эмбаркадеро.
    Вроде бы, но я не уверен точно, в студии 11.0 или 11.2 эмулятор уже работает.
    Речь идет о iOS, не MacOS.
    Существует ли эмулятор MacOS - я не уверен, мне лично это не требовалось т.к. был в наличии макбук.
    Поскольку в тебе стоит iOS, я исхожу из того что мы говорим о iOS.

    По аналогии с андроидами, эмулятор не даст тебе поведения, идентичного поведению на реальном железе.
    Категорически рекомендуется тестировать приложения на реальном железе. Именно поэтому, для разработки "больших" приложений, компании имеют зоопарк тестовых девайсов.

    В целом да, без работающей MacOS приложение
    а) не скомпилировать
    б) не выложить в эппстор.

    ПС. Чтобы выложить приложение в эппстор, нужно оплатить аккаунт разработчика, последний раз это было порядка 100$ в год.

  3. 6 минут назад, WebPuper сказал:

    зачем нужен PAServer

    Для общения студии с MacOS, т.к. с нее студия импортирует необходимые для компиляции приложения файлы (конкретнее - библиотеки из SDK или XCode)

    8 минут назад, WebPuper сказал:

    или нужен ПК с MacOS

    Да, обязательно нужен MacOS, либо ПК от Apple, либо Hackintosh.

     

    9 минут назад, WebPuper сказал:

    Когда я разрабатываю для Андроид, то все просто

    Я не стану тебя разочаровывать))))))))

  4. 1 час назад, WebPuper сказал:

    Шикарный форум

    Дык, обращайтесь, всегда рады)))

    19 часов назад, WebPuper сказал:

    что дальше?

    Ваш вопрос аналогичен такому: есть машина, сел в нее, что дальше?
    Если по делу, то читать. Можно начать со справки, там многое написано.

  5. В теории, должно получиться. На практике, есть неиллюзорная вероятность пролюбиться с USB портами для дебага на реальном железе.

    Можно конечно дебажить на эмуляторе, запускаемом под виндой, но это из серии "мсье знает толк в извращениях".

  6. Верно, и даже не только под убунту, в астре, будь она неладна, тоже работает.
    Простое приложение типа калькулятора делается и работает без проблем.
    В случае же чего-либо более специфического (из моего опыта), будьте готовы к тому что ваши возможности урезаны или ограничены.

    К примеру, работа с браузером очень ограничена, поскольку под линуксом дельфи используется какой-то сторонний костыльный браузер.

  7. Всем доброго дня!

    Заранее прошу прощения что размещаю подобное объявление здесь, пытаюсь использовать все возможные варианты.

     

    Ищем опытного программиста/дизайнера интерфейсов на удаленную работу, возможно на долгосрочную перспективу.

    Требуется поправить существующий или разработать новый UI/UX веб-приложения для школьного классного журнала.

    Речь идет не столько о внешнем виде, сколько о грамотном и сбалансированном интерфейсе, предоставляющем удобный доступ ко всем функциям. UI необходимо адаптировать под три категории устройств: настольные ПК, планшеты, мобильные телефоны.

    Буду рад как ссылкам на примеры работ, так и прямому общению.

    Подробнее в личке.

    Screenshot_41.png

  8. В 29.05.2021 в 13:50, Tumaso сказал:

    Ну почему же, начинают. Команда, в которой я сейчас работаю, начала ровно год назад новый проект именно на FMX для виндов и мака.

    И как говорится - почему бы и нет? Делфи достаточна хороша, всё можно делать быстро и хорошо)

    Поддержу. Тоже разрабатываем кроссплатформенное приложение. Пока все более-менее норм.

  9. Разобрался.

    function  HPEDetect(ABitmap: TBitmap): INT;
    var
        lBitmap   : jBitmap;
        libBitmap : JNIObject;
    begin
        result := 0;
        if ( HPELibraryHandle = 0 ) then
            exit;
    
        lBitmap := BitmapToJBitmap(ABitmap);
        libBitmap := (lBitmap as ILocalObject).GetObjectID; <- ключевой момент здесь
        result    := jniExtractGazes(PEnv, nil, libBitmap);
        gGazeVect := jniGetGaze();
    end;

    Главная моя ошибка была в том, что я передавал в библиотеку сам JBitmap.
    Вместо него нужно было передавать JNIObject.

  10. 13 часов назад, Slym сказал:

    DLIB_JNI_METHOD(jniBitmapExtractFaceGazes)(JNIEnv* env, jobject thiz, jobject bitmap, jobject gazesList)?

    Верно, был такой параметр. Я сознательно вырезал его из кода библиотеки и пересобрал библиотеку без этого списка, чтобы локализовать проблему.
    Исключение в библиотеке происходит при первой же попытке поработать с объектом bitmap.

    Другими словами, отсутствие gazesList не является причиной исключения, в этом я на 146% уверен ?

  11. Всем здравствуйте, и мое почтение!

    Возникла сильная необходимость передать объект JImage в so-библиотеку, написанную на c++

    Суть - нужно передать изображение в библиотеку распознавания лиц и ориентации головы.

    В библиотеке есть функция, объявленная так:

    jint JNIEXPORT JNICALL DLIB_JNI_METHOD(jniBitmapExtractFaceGazes)(JNIEnv* env, jobject thiz, jobject bitmap) {...}

    В Delphi я описал эту функцию следующим образом:

    var
      jniExtractGazes : function(PVM: PJNIEnv; Reserved: Pointer; bitmap: JObject): INT; cdecl;

    Гружу/ищу ее так:

    function HPELoadLibrary: boolean;
    var
        lJNIInt : JNIInt;
    begin
        Result  := False;
        HPEMode := MODE_ITERATIVE;
    
        {$IFDEF ANDROID}
            HPEDocDir := IncludeTrailingPathDelimiter(System.IOUtils.TPath.GetDocumentsPath);
        {$ELSE}
            exit;
        {$ENDIF}
    
        HPELibraryHandle := LoadLibrary(PChar(HPEDocDir + 'libhead_pose_det.so'));
        if ( HPELibraryHandle = 0 ) then
            Exit;
    
        PEnv := TJNIResolver.GetJNIEnv;
        PVM  := PJavaVM(System.JavaMachine);
    
        if HPELibraryHandle <> 0 then
        begin
            @OnLoadFunc := GetProcAddress(HPELibraryHandle, 'JNI_OnLoad');
            if not Assigned(OnLoadFunc) then
            begin
                FreeLibrary(HPELibraryHandle);
                Exit;
            end;
            lJNIInt := OnLoadFunc(PVM, nil);
    
            @jniInit         := GetProcAddress(HPELibraryHandle, 'Java_com_beraldo_hpe_dlib_HeadPoseDetector_jniInit'); //jniInit
            @jniDeInit       := GetProcAddress(HPELibraryHandle, 'Java_com_beraldo_hpe_dlib_HeadPoseDetector_jniDeInit'); //jniDeInit
            @jniExtractGazes := GetProcAddress(HPELibraryHandle, 'Java_com_beraldo_hpe_dlib_HeadPoseDetector_jniBitmapExtractFaceGazes');
    
            Result := True;
        end;
    end;

    Адреса всех функций находятся, jniInit и OnLoadFunc отрабатывают корректно.

    Проблема с функцией jniExtractGazes.

    function  HPEDetect(ABitmap: TBitmap): INT;
    var
        lBitmap : jBitmap;
    begin
        result := 0;
        if ( HPELibraryHandle = 0 ) then
            exit;
    
        lBitmap := BitmapToJBitmap(ABitmap);
        result  := jniExtractGazes(PEnv, nil, lBitmap);  <===== Project FaceLockClientMobile.apk raised exception class Aborted (6).
    end;

    На указанной строке всегда вылетает Exception Aborted. Стек ничего внятного не показывает.

    Путем долгих проб и ошибок прихожу к подозрению что я неправильно передаю Java-объект в библиотеку.

    Как его передавать из Дельфи правильно - не могу найти.

    Буду очень признателен за любые подсказки и догадки.

     

    PS речь идет о этой библиотеке: https://github.com/beraldofilippo/android-hpe-library

     

     

  12. 2 минуты назад, Android сказал:

    Они смотрят на наш рынок, как на страны третьего мира

    Не соглашусь. Не обязательно третий мир, скорее как источник опытных кадров. У нас очень похожая ситуация:
    находимся в Германии, ищем Delphi разработчика, желательно с опытом fmx. Компания небольшая, поэтому гугловских зарплат не предлагаем.
    Из моего опыта, предлагаемая ЗП соответствует уровню миддл-разработчика. Важно понимать, что речь идет о начальной ЗП, которая пересматривается со временем.
    Людей просто нет. Не то чтобы им ЗП мала, их (людей) нет. Присылают резюме всякие индусы да турки-арабы-хзкто, это не тот контингенс с которыми мы готовы работать.
    В итоге плюнули, и везем людей из экс-ссср. На собеседовании тупых вопросов про люки не задавали. Выделили месяц-два для работы в удаленном режиме, чтобы посмотреть как человек справляется, какие вопросы задает, насколько вообще активен.
    После этого принимаем решение о релокации.

    PS, друг работает в Голландии, разрабатывают ПО для аэропортов.
    Его компания за пять лет привезла более тридцати русскоговорящих разработчиков.
    Имхо, это говорит о многом.

  13. В 15.08.2020 в 20:37, Android сказал:

    Я не знаю, откуда ты высасываешь. Из пальца или из другого органа. Я не нашел в Сети, что есть Jedi для Firemonkey

    Воу-воу, палехше, на личности не надо переходить. Для этого есть личка.

  14. Разобрался, возможно проблема проявлялась только у меня.

    У меня установлен JCL и JVCL.

    Нужно было в меню Project -> JCL Debug Expert -> Generate .jdbg files выставить Enabled for this project (либо Always enabled)

    У меня было выставлено Always disabled, отладка не работала. В случае первых двух - отладка под Android64 работает.

    Delphi_DEBUG.thumb.png.fedf3d586eb516b1dfd6edc81322b96e.png

  15. Добрый день коллеги!

    Проблема с версией 10.3.3

    Возникла необходимость (внезапно, вот неожиданность!))) обновить приложение.
    Приложение работало в 32битной версии, при компиляции же в 64бита по непонятным причинам не может получить доступ к локальной БД.
    При попытке отладки приложения брекпоинты не срабатывают, в консоли видна запись: "no debug info".
    Порывшись в гугле обнаружил ссылку на патч (https://community.idera.com/developer-tools/b/blog/posts/delphi-10-3-3-android-debugging-patch), скачал/установил, но проблема так и не не решилась.

    Вопрос 1: у кого-нибудь работает отладка под х64?
    Вопрос 2: может есть размышления по этому поводу?
    Буду рад любым советам!
     

  16. Ну здаров, сталкер!

    19 часов назад, Stalker сказал:

    окно Form2 открывается на весь экран смарта (полностью закрывая собой основное окно Form1), а хотелось что бы оно было небольшого размера по центру основного окна (по типу ShowMessage)

    Это нормально для мобильных платформ.
    Чтобы это обойти придется кидать на Form1 прямоугольник (TRectangle емнип) и присваивать ему полупрозрачную заливку. Соост в центр твоего ректангла кидаешь еще одну непрозрачную панель и уже на ней размещаешь свои контролы.
    100%-го аналога ShowModal не получишь, придется логику чуть-чуть поправить.

     

    19 часов назад, Stalker сказал:

    2) И еще небольшой вопрос. В качестве Android устройства у меня смартфон Thl 5000 (с экраном 5"). В IDE в ModelView я соответственно выбираю строку Android 5" Phone. Но когда на смартфоне запускает приложение, то я вижу что размер формы созданный Delphi  в ModelView больше чем реальный размер окна (часть элементов на нем не видна, она получилась за границами экрана).

    Вопрос: В чем тут может быть причина ?

    Скорее всего это масштабирование для конкретно твоего устройства, усугубленное тем что ты не используешь Align или Anchors. Используй их и будет тебе счастье.
    Можно еще почитать про масштабирование чтобы лучше понимать что конкретно происходит.

     

    19 часов назад, Stalker сказал:

    3) Кидаю на форму GroupBox, внутрь помещаю TEdit и устанавливаю у него Align = Top. В результате TEdit залазит на заголовок (Caption) у GroupBox'a.

    Не сталкивался с таким, не могу сказать. Возможно баг самой FMX, возможно баг в файле стиля (даже не баг, а внутренняя область гроупбокса неправильно описана). Я бы начал проверку со стиля.
    Есть костыльное решение - установи Margins.Top побольше))))))

  17. Большое количество - это сколько?
    100, 100 000, 100 000 000?

    Каждый раз увеличивая размер на один элемент, менеджер памяти ищет непрерывный незанятый кусок памяти такой длины, чтобы уместить все элементы. Хорошо если место под уже выделенный массив позволяет увеличить размер, не упираясь в участики памяти занятые другими данными.
    Иногда после очередного увеличения массива, уже выделенного участка памяти более не хватает. В таком случае менеджеру приходится искать новый, и копировать старые данные в новый участок памяти, а старый участок помечать как свободный.
    Разумеется это занимает время. Именно это и приводит к "не так быстро, как хотелось бы".

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

    Кстати, реализация TList использует внутри себя первый способ.

  18. Всем хай!

    Использую этод код в нашем проекте (БОЛЬШОЕ спасибо за исходники!).

    Описал шаблон pattern.json, разнам полям назначил разный размер шрифта.
    Поля создаются, текст присваивается, но по непонятной для меня причине размер шрифта на правильный меняется только после возникновения события OnResize, причем меняется только для видимых в данный момент итемов.

    Проблема была в том, что по непонятным причинам в стайлбуке для итемов был выставлен размер шрифта=16, т.е. не дефолтный.
    Как только убрал 16 и оставил дефолтный (12, емнип), все стало работать как надо.

    Буду благодарен если кто-то сможет пояснить причину такого, чтобы пофиксить для будущих проектов!

×
×
  • Создать...