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

d7d1cd

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

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

  • Посещение

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

    7

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

  1. @destroyer86, спасибо. Сейчас возникла необходимость в этом. Но мне надо завести это в C++Builder. Не поможете?

    Jar файл я в свой проект добавил, обертку скомпилировал и получил плюсовой hpp хедер, который приинклудил в коде. Как мне получить список доступных COM портов?

  2. Вот код добавления кнопки и ее удаление без условной компиляции, который работает и на Windows и на Android, а так же, когда при создании указывается владелец:

    // btn объявлен в описании класса TForm1
    
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
     btn = 0;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     btn = new TButton(this);
     btn->Text = L"Created!";
     btn->Parent = this;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
     if(!btn) return;
     btn->Parent = 0;
     RemoveComponent(btn);
     delete btn;
     btn = 0;
    }

     

  3. Счётчик увеличивается на 2 потому что одну ссылку хранит владелец, а вторую указатель bi.

    Тут я не прав. Есть статья Бровина Ярослава. Там сказано, что каждый компонент с фокусом получает дополнительную ссылку. Я проверил, так происходит только тогда, когда при создании объекта указывается его владелец. Поэтому не указывай владельца при создании объекта.

    Владелец нужен только для автоматического удаления того, кем он владеет при удалении его самого. У тебя же не тот случай.

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

    Кстати, в TComponent Owner объявлен как «unsafe». Почему тогда Create(Self) увеличивает счётчик ссылок дополнительно ещё на единицу?

    Owner объявлен как __unsafe для того, чтобы объекты не увеличивали счетчик ссылок у их владельцев. То есть, это для того, чтобы когда мы пишем, например: TButton *btn = new TButton(Form1), то счетчик ссылок у Form1 не изменился.

    Когда мы указываем владельца при создании объекта, то он (создаваемый объект), попадает в список того, чем владеет владелец, поэтому счетчик ссылок создаваемого объекта увеличивается.

  5. Приветствую всех. Есть код:

    std::vector<TControl*> ctrls;
    ctrls.push_back(Layout1);

    При компиляции под Виндоус все работает. При компиляции под Андроид ошибка на этапе компиляции:

    Цитата

    [bccaarm Error] stl_iterator.h(980): rvalue reference to type 'value_type' (aka 'Fmx::Controls::TControl *__strong') cannot bind to lvalue of type '__borland_class *isTObj<Fmx::Controls::TControl> __strong' (aka 'Fmx::Controls::TControl *__strong')
      stl_uninitialized.h(75): in instantiation of member function 'std::move_iterator<__borland_class *Fmx::Controls::TControl __strong *>::operator*' requested here
      stl_uninitialized.h(125): in instantiation of function template specialization 'std::__uninitialized_copy<false>::__uninit_copy<std::move_iterator<__borland_class *Fmx::Controls::TControl __strong *>, __borland_class *Fmx::Controls::TControl __strong *>' requested here
      stl_uninitialized.h(278): in instantiation of function template specialization 'std::uninitialized_copy<std::move_iterator<__borland_class *Fmx::Controls::TControl __strong *>, __borland_class *Fmx::Controls::TControl __strong *>' requested here
      stl_uninitialized.h(299): in instantiation of function template specialization 'std::__uninitialized_copy_a<std::move_iterator<__borland_class *Fmx::Controls::TControl __strong *>, __borland_class *Fmx::Controls::TControl __strong *, __borland_class *Fmx::Controls::TControl>' requested here
      vector.tcc(457): in instantiation of function template specialization 'std::__uninitialized_move_if_noexcept_a<__borland_class *Fmx::Controls::TControl __strong *, __borland_class *Fmx::Controls::TControl __strong *, std::allocator<__borland_class *Fmx::Controls::TControl> >' requested here
      vector.tcc(104): in instantiation of function template specialization 'std::vector<__borland_class *Fmx::Controls::TControl, std::allocator<__borland_class *Fmx::Controls::TControl> >::_M_emplace_back_aux<__borland_class *Fmx::Controls::TControl __strong &>' requested here
      stl_vector.h(1058): in instantiation of function template specialization 'std::vector<__borland_class *Fmx::Controls::TControl, std::allocator<__borland_class *Fmx::Controls::TControl> >::emplace_back<__borland_class *Fmx::Controls::TControl __strong &>' requested here
      MainUnit.cpp(15): in instantiation of member function 'std::vector<__borland_class *Fmx::Controls::TControl, std::allocator<__borland_class *Fmx::Controls::TControl> >::push_back' requested here

    Как это можно победить?

  6. Применил программно стиль, используя код Ярослава, но не до (как советовал Barbanel), а после назначения родителя фрейму (иначе все равно тормозит). То есть, добавил вкладку в табконтрол (метод Add), создал динамически фрейм, назначил ему родителем созданную вкладку и применил стиль ко всем компонентам, начиная с фрейма. Если открыть приложение и выбрать из списка задачу, то теперь при открытии "окна" этой задачи наблюдается незначительная не плавность появления (гораздо меньше, чем до использования предварительной загрузки стиля). Возврат на "экран" со списком задач происходит плавно. И если снова выбрать задачу, то ее "окно" уже появляется без тормозов.

    То есть, первая смена вкладок с момента запуска приложения чуть-чуть подтормаживает. Затем все работает плавно. Пробовал заранее применять стиль ко всему табконтролу и его содержимому, но это не помогло.

  7. Приветствую всех. Подскажите, зачем нужно свойство Locked? Точнее по справке я знаю для чего оно: "A locked control cannot be modified at design time.". Однако если установить у компонента галку Locked (тестировал на TLayout), то компонент только переместить нельзя. Все остальное с ним делать можно.

  8. 2 часа назад, Barbanel сказал:

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

    Подскажите, как заранее присвоить стиль программно.

    P. S. Смена табов рывками происходит только на Андроид. На Windows все плавно.

  9. Реализовал вышеуказанное за некоторым исключением. При выборе пользователем задачи, вкладка в TTabControl создается динамически. Элементы управления для определенного "экрана" хранятся на фрейме, который тоже создается динамически. При этом владельцем указывается ранее созданная вкладка. Затем вкладка делается родителем фрейма и она (вкладка) анимированно отображается. При возврате на "экран" со списком задач вкладка удаляется из TTabControl и память занятая ею удаляется оператором delete (а так как вкладка была владельцем фрейма, то и он освобождает память).

    Все работает как задумано, но смена вкладки со списком задач на вкладку с фреймом происходит рывками, а не плавно. При этом обратная смена проходит плавно. Может кто-то знает как это исправить или это глючность TTabControl?

  10. Приветствую всех. Создаю мобильное приложение для Андроид. Основа - TTabControl на главной форме с двумя вкладками, заголовки вкладок скрыты. На первой вкладке список задач, которые может выполнять приложение. При выборе задачи анимарованно (используя SetActivTabWithTransition) открывается вторая вкладка с элементами управления для выбранной задачи.

    Элементы управления для каждой задачи реализованы на отдельных формах: на форму кладется TVertScrollBox (Align = Client), а в него уже необходимые элементы управления. Когда пользователь выбирает задачу, то нужная форма создается динамически, родитель TVertScrollBox у этой формы меняется на вторую вкладку TTabControl и вызывается SetActivTabWithTransition. Когда пользователь жмет кнопку "Назад" (аппаратную или программную), то, опять же анимированно, открывается первая вкладка (со списком задач), родитель у TVertScrollBox обратно меняется на созданную ранее форму, форма удаляется оператором delete.

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

  11. Приветствую всех. Подскажите, как реализуется функционал смены форм (или фреймов) в приложениях на Андроид. Например, когда в Телеграм выбирается ранее созданный чат, то форма этого чата как бы всплывает и одновременно движется справа налево. Если нажать кнопку "Назад", то происходит обратный эффект. Или в WatsApp при выборе чата его окно выезжает справа налево, при этом список чатов тоже движется влево, но медленнее, чем окно чата. Как сделать такое же в C++Builder?

  12. Приветствую всех. Написал тестовое приложение с формой FullScreen = true (чтобы занять весь экран), запустил на смартфоне. По нажатию кнопки определю размеры формы и узнаю, что ее ширина и высота ровно в 2 раза меньше, чем разрешение экрана смартфона. Объясните, почему так происходит?

  13. В 08.10.2018 в 08:36, GASCHE сказал:

    А сначала топика почитать, нет? Там же есть как  создавать обертки через Java2OP.

    Прошу прощения за поспешный вопрос.

    После прочтения этого топика и нескольких других, у меня возник вопрос: нельзя ли осуществить работу с последовательным портом не используя код на Java? Так как C++Builder предоставляет несколько стандартных модулей для работы с Android API, стал пытаться. За основу взял известный код на гитхабе.

    Решил начать с поиска всех подключенных к USB устройств. В файле UsbSerialProber.java из вышеуказанной библиотеки, код которого выполняет поиск устройств, подключены 2 модуля:

    import android.hardware.usb.UsbDevice;
    import android.hardware.usb.UsbManager;

    В C++Builder подключил файл Androidapi.Hardware.hpp, так как он более всего подходит по названию к подключаемым модулям в Java коде. И, собственно, на этом все. В этом файле  я не нашел никакого упоминания о USB и, тем более, о UsbDevice и UsbManager. Видимо, надо подключать файлы Android.Hardware.Usb.UsbDevice и Android.Hardware.Usb.UsbManager, но их нет в C++Builder. Наверное, это означает, что необходимо, все таки, писать код на Java и создавать обертку...

  14. 50 минут назад, mazayhin сказал:

    Можно из API портировать то что нужно (написать обертку) для работы с USB.

    Надо еще проверить, существуют ли там необходимые модули.

     

    1 час назад, mazayhin сказал:

    Либо, самый лучший вариант, использовать https://github.com/mik3y/usb-serial-for-android

    Как раз этот код и хочу использовать.

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