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

Belov.V.

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

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

  • Посещение

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

    6

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

  1. Предлагаю поделиться практикой сборки приложений под Linux, набором ошибок и глюков.

    Решил сделать пару экспериментов в связке RAD-Linux.

    1) Есть рабочий Debian7. На нем не пошел PAServer. Требует glib версии 2.14 или 2.17 (на 7-ке 2.12). Добавил в репозиторий ссылку на пакеты от debian 8. Обновил. PAServer стартует, но тут же валится по ошибке сокета (не записал как звучит). Пока все пакеты подряд.

    2) Поднял Debian8. Чистый.

    • PAServer стартует, SDK в RAD студию загружается.
    • При попытке сборки ошибка "[DCC Error] E2597 C:\Program Files (x86)\Embarcadero\Studio\19.0\bin\ld-linux.exe: error: cannot find -lgcc_s"
    • При обновлении кеша файлов SDK ругается:
    Directory does not exist: /usr/include/c++/
    Directory does not exist: /usr/include/x86_64-linux-gnu/ (исчезла после gcc-6)
    Directory does not exist: /usr/include/x86_64-linux-gnu/c++/
    Directory does not exist: /usr/include/c++/
    Directory does not exist: /usr/lib/gcc/x86_64-redhat-linux/
    Directory does not exist: /usr/lib/gcc/x86_64-redhat-linux/
    Directory does not exist: /usr/lib64/
    • Доставил пакеты gcc-6 и linux-compiler-gcc-6-x86, обновил файлы кеша SDK (исчезла вторая строчка в предупреждении при обновлении).

    Ура!  Простейший пример собирается и стартует. Под отладчиком работает. Но остались шесть предупреждений при обновлении linux SDK.

    Где это может вылезти?

  2. Олег, хорошо бы темы закрывать описанием способа решения вопроса.

    У Вас второй вопрос подряд и в итоге просто "Спасибо разобрался". Что было, в чем отличие FMX на Win и Андроид, можно просто погадать.

     

    Удачи и с уважением! 

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

     

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

  4. После перехода на RX и попытке запуска отладки приложения на девайс с 3.2 при загрузке в устройство выдается вот такая ошибка (в теме). Изменение в настройках Option-SDK (SDK и NDK), как то понижение версии платформы ничего не дает. Play Market тоже отмечает, что приложения собранные на RX имеют Уровень AP 14+

     

    Посмотрел глубже - в файле AndroidManifest.xml упорно прописывается:

    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14" />

    и не зависит от того что выбираешь в настройках SDK.

     

    Где задается minSDKVersion? Или от каких настроек это значение зависит?

     

    Можно конечно в автоматически сгенерированном AndroidManifest.template.xml ручками внести изменение:

    <uses-sdk android:minSdkVersion="%minSdkVersion%" заменить к примеру на minSdkVersion="9"

    но это как-то кустарно и пока на крайней выход.

     

  5.  

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

    aFileName:='/storage/emulated/0/Download/test/тестовый файл для отправки.out.txt';

    aComment:='Комментарий к файлу';

    procedure ShareFile(aFileName, aComment : String);
    var Intent    : JIntent;
        uri       : Jnet_Uri;
        AttachmentFile: JFile;
    begin
      Intent := TJIntent.Create;
      Intent.setAction(TJIntent.JavaClass.ACTION_SEND);
      Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
      Intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString(aComment));
      Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(aComment));
      AttachmentFile := TJFile.JavaClass.init(StringToJString(aFileName));
      Uri := TJnet_Uri.JavaClass.fromFile(AttachmentFile);
      Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM, TJParcelable.Wrap((Uri as ILocalObject).GetObjectID));
      Intent.setType(StringToJString('text/plain'));
      SharedActivity.startActivity(Intent);
    end;

    Наблюдаю следующее:

    Gmail - все отлично, файл присоединён, комментарий в теме письма

    DropBox - все отлично, файл передан

    Google Drive - файл передан, но у него отрезано расширение (в папке лежит файл с именем "тестовый файл для отправки")

    Yandex Disk - все работает

    Облако Mail.ru  - предлагает создать текстовый файл ("Новый текстовый файл.txt"), в который записывает только две одинаковые строчки "Комментарий к файлу"

     

    Уже весь мозг сломал. А заказчик требует работу через все эти системы.

     

     

     

     

    Goggle Drive в качестве имени ставит то, что указано в Intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString(aComment));

    Т.е. прописывайте в это поле имя файла без пути,

     

    Mail.ru не пробовал.

  6.  

    К примеру у меня динамически формировалось положение элементов на форме по событию onResize у TabControl. Стало работать по другому. Пришлось переписывать (для всех платформ).

     

    И что изменилось примерно можете сказать, если Вас не затруднит?

     

     

    Если еще интересно - при onResize новые размеры TabItem'а изменялись только у активного в текущий момент. У скрытых размеры не изменяются. В общем то логично для экономии ресурсов сделали. Но вот при переключении на другой TabItem динамически формируемая форма разваливалась, т.к. ее размеры изменялись, но никакое событие не возникал - ни у TabControl, ни у TabItem. Что заметил, у самих TabItem-ов Event onResize вообще никогда не возникает. Как раньше было не помню.

    .....как-то так вроде.

  7. В выходные переводил на RX приложение. Последний сборка была на XE7.

     

    С ходу не пошло. По другому стали срабатывать события у объектов. Видно, что перелопатили солидно.

    К примеру у меня динамически формировалось положение элементов на форме по событию onResize у TabControl. Стало работать по другому. Пришлось переписывать (для всех платформ).

     

    А вот со вторым появившемся глюком (на Android) бился долго - при смене ориентации экрана приложение вылетало. Под отладчиком "raised exception class segmentation fault (11)". Глову сломал, Потом догадался сравнить файлы манифеста приложения с вновь созданным под RX.

    Чтоб короче - результат: убил старый файл. Новый пересоздался. Ошибка исчезла.

  8. Спасибо за пример, работает отлично. Осталось понять, почему у меня не работало. Если разберусь, отпишусь...

     

    Проверьте вот это место в коде:

    // прикрепляем файл

    j_file := SharedActivity.getExternalFilesDir(StringToJString(f_name));

     

    Обратите внимание, что там указано имя прикрепляемого файла без пути к нему. По описанию ситуации очень похоже на ошибку в этом месте.

  9. Вот пример. Соорудил, проверил, вроде работает.

     

    Размер файла нормальный. Скриншеты на двух почтовых клиентах:

    0_123121_f617be46_orig.png

     

    0_123120_ecf605ab_orig.png

     

    Upd: в RX небольшие изменения. См. второй пример. (для первого идут предупреждения, хотя тоже работает)

    Sample-SendAttach.zip

    Sample-SendAttach_RX.zip

  10.  

    Заполнение поля "Кому:"

    Спасибо, помогло!

     

    по поводу пути, да, лежат именно в Androidapi.IOUtils.getExternalFilesDir. Буду разбираться.

     

     

    Я такой вариант получал, когда j_file не верно записывал. См. выше

  11. Как вариант, почему нет присоединенного файла - проверьте сохранение файла именно по этому пути:

    f_name := 'sample-temp.txt';
    //f_path := TPath.Combine(Androidapi.IOUtils.getExternalFilesDir,f_name); // пусть именно такой
    // или
    f_path := TPath.Combine(TPath.GetSharedDocumentsPath, f_name);        // или тоже самое: GetPublicPath
    ...SaveToFile(TPath.Combine(TPath.GetSharedDocumentsPath, f_name));
    
    // прикрепляем файл
    j_file := SharedActivity.getExternalFilesDir(StringToJString(f_name));
    

     

    В особенности заполнение j_file проверьте.
     
    Тоже самое было, когда пробовал по другим путям файл отправки класть. Имя было, но не отправлялось.
     
    Удачи!
     
     
  12. думаю так будет наиболее правильно делать везде. 

     

    dlg.ShowModal(

    procedure(ModalResult: TModalResult)

    begin

    // Do something.

    end

     

    Не думаю, что везде - это как-то категорично :-) В одном приложении win32 на XE7 вынужден был отказаться от такого вызова. Это с год назад было, плоховато помню подробности. Так что чтобы не ошибиться не буду подробности описывать. Но какое-то отличие в возврате в отличии от Android получалось. Проще было ветки по платформам разделить и на win использовать ShowModal();

  13.  

    Я однажды при создании и заполнении формы временные объекты очищал через Free. На Win32 все работало. При запуске на Adroid получил тот самый черный экран. Поменял на DisposeOf. Все заработало.

     

    Но действительно, вариантов может быть уйма. Таких черных экранов при запуске со временем думаю каждый "наловил" с большой чемоданчик. :-)

    Разрешите по подробней о очищение временных объектов?

     

    То что было у меня, это можно характеризовать как частный случай и особенность выбранного алгоритма. Если у Вас подобного нет, то вряд ли это описание поможет.

    Совет отключать частями дельный.

    Можно еще ошибки через "....sdk\tools\monitor.bat" посмотреть. Установите фильтр на события своего приложения.

  14. Я однажды при создании и заполнении формы временные объекты очищал через Free. На Win32 все работало. При запуске на Adroid получил тот самый черный экран. Поменял на DisposeOf. Все заработало.

     

    Но действительно, вариантов может быть уйма. Таких черных экранов при запуске со временем думаю каждый "наловил" с большой чемоданчик. :-)

  15. showmodal не тормозит выполнение программы на мобильных устройствах, об этом в хелпе пишут, то есть после показа формы сразу будет вызываться попытка ее уничтожения. 

    haword, могу ошибаться, но вроде такое поведение относится только к Android.

    На iOS в документации лишь не рекомендуют использовать из-за возможного некорректного возврата результата. Я выше выдержку приводил. Там же: Modal dialog boxes are not supported in Android apps. Instead of calling ShowModal, you should call Show, and have the form return and call your event. ...

    Возможно я что-то еще упустил. Сам ShowModal по рекомендации не использую.

  16. DisposeOf для уничтожаемой формы вроде должен нормально отрабатывать. Но в FMX не рекомендуют использовать ShowModal для мобильных платформ.

     

    Из документации: We recommend that you not use modal dialogs on either of the mobile platforms (iOS and Android) because unexpected behavior can result. Not using modal dialogs eliminates potential problems in debugging and supporting your mobile apps.

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