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

Brovin Yaroslav

Администраторы
  • Постов

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

  • Посещение

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

    390

Весь контент Brovin Yaroslav

  1. Новая версия 32 битного C++ компилятора - XE6. В вашей бета версии у вас компилятор с ошибкой еще.
  2. В моем коде - это ошибка 32-битного компилятора С++. В новой версии среды она уже устранена. Остальные компиляторы работают без ошибок (Win64, OSX, iOS). В вашем коде - ошибка кода.
  3. Можете использовать контролы украинского компании Devart. В этой статье они рассказывают как раз то, что вам нужно: How to Develop iOS Applications in Delphi XE4 Using Devart Data Access Components
  4. Описанная вами проблема в вашем коде: FTextLyout = (TTextLayout*)(new TTextLayoutClass(TTextLayoutManager::DefaultTextLayout)); Абсолютно неправильно создаете объект TTextLayout. Нужно так: TTextLayoutClass textLayoutClass = TTextLayoutManager::DefaultTextLayout; TTextLayout* FTextLyout = TTextLayoutManager::TextLayoutForClass(textLayoutClass); Но здесь есть два важных момента. Вообще создание экземпляра переменной классового типа (Delphi) возможность языка Delphi, а не С++. И в С++ такой поддержки нету. Поэтому подобные создания объектов по делфовым классовым значениям (class of) выносят на сторону Delphi. Что в данном случае и сделано при помощи метода класса TextLayoutForClass. Которые и осуществляет создание объекта по делфовому классу. TTextLayoutClass - это наследник от TMetaClass<> и по сути внутри себя держит указатель на делфи класс. поэтому обычным оператором new объект вы не создадите. P.S. 32-битная версия компилятора С++ имеет ошибку, которая исправлена в XE6.
  5. Добрый вечер, Такую надпись можно решить несколькими способами в зависимости от дополнительных условий: Будет ли меняться текст надписи или нет? В зависимости от этого есть четыре решения: I. Текст надписи не допускает изменений В этом случае проще всего сделать картинку с этим текстом и использовать ее в вашем приложении. Где нужно отобразить, использовать TImage. II. Текст надписи может изменяться Тут два решения: 1. Используем набор TText или TLabel. Для отображения групп последовательных символов одного цвета используем отдельный контрол TLabel или TText. Каждую группу раскрашиваем требуемым образом через настройки контролов. На скриншотах ниже, я использовал контейнер TLayout и складываю туда несколько объектов TText с выравниванием по левому краю. 2. Рисовать надпись вручную с использование TTextLayout. Этот способ сложнее, но зато универсальнее и эффективнее. Используя TTextLayout по очереди отрисовываем все буквы с нужными цветами и параметрами. 3. На основе решения 2 в этой части, сделать свой компонент.
  6. На сколько я знаю, для того, что внутри приложения был доступ к базе данных нужно две вещи: Драйвер БД, к которой собираетесь подключаться. Которая реализует все функции по работе с Базой Данных. Компонент-обертка, который, используя этот драйвер, дает вам удобный доступ ко всем возможностям БД. Если на Windows проблем с драйвером нету. Взял от вендоров и прикрепил к приложению. То с телефоном ситуация в корне другая. Телефон - это своя песочница со своими правилами. Которая не будет хранить все версии драйверов для баз данных. И на самом деле не хранит, только те, что считаются официально поддерживаемыми (SQLite, остальное не встречал). Отсюда, если я правильно помню, официально Embarcadero поддерживает SQLite и InterBase (так как база собственная разработка Embarcadero и ее драйвер, который можно включить в пакет приложения для андроида, так как опять же драйвер эмбаркадеро). SQLite является стандартной базой данных для мобильных ОС Андроид и IOS и используются самими системами. А значит ОС имеют свои реализации драйвера для работы с ней. Я не видел, чтобы MySQL официально поддерживалась на Андроиде. Поэтому одни обертки работать не будут. Нужна реализация работы с MySQL. Если вы посмотрите по интернету, то встретитесь со статьями о том, как самостоятельно реализовать работу с MySQL с использованием JSON протокола. Поэтому все остальные библиотеки, если умеют работать с базами, то используйте их.
  7. Если очень нужно, то можно реализовать свой контрол, который будет держать у себя две кнопки. Этот контрол будет получать события мыши, а дальше перенаправлять их в нужную кнопку. Определение нужной кнопки будет на совести этого контрола. И будет решаться простым определением попадание координат мыши в область каждой кнопк События мыши по платформе, может принимать только тот контрол, который находится в захваченном (TForm.Captured) состоянии. И это в любое время всегда или один контрол или ни одного. Это общая практика работы библиотек UI контролов. Поэтому двойное нажатие в один и тот же момент на разные контролы не возможно. P.S. Как я могу предположить это может быть полезно для реализации игрового контроллера?
  8. Ответ косвенно был дан в теме Автоматический переход на вторую строку TLabel Поэтому на базе этого ответа его легко модифицировать для этой задачи. Идея простая в момент загрузки стиля и изменения размеров TListBoxItem, вычислять высоту занимаемого текста и на основании этих данных переопределять высоту итема. Практика 1. Для определения размеров текст используем TTextLayout. Лучше создавать объект этого класса один раз. Поскольку в нашем случае он будет использоваться часто. procedure TForm1.FormCreate(Sender: TObject); begin // FTextLyout: TTextLayout - поле формы FTextLyout := TTextLayoutManager.DefaultTextLayout.Create; end; procedure TForm1.FormDestroy(Sender: TObject); begin FreeAndNil(FTextLyout); end; 2. Пишем свой обработчик, который мы будем вызывать по достижению двух событий: Изменение размера TListBoxItem. В этом случае нужно перевычислить высоту итема. При загрузки нового стиля итема, нам нужно заново вычислить высоту итема. Поскольку стиль может содержать новые настройки отображения текста (шрифт, размер и тд.) Я назвал это событие CalculateItemHeght: procedure TForm1.CalculateItemHeight(Sender: TObject); var ListItem: TListBoxItem; begin if Sender is TListBoxItem then begin ListItem := Sender as TListBoxItem; FTextLyout.BeginUpdate; try // Инициализируем текстовый слой для корректного вычисления // размеров отображаемого текста FTextLyout.Text := ListItem.Text; FTextLyout.MaxSize := TPointF.Create(ListItem.Width, 1000); FTextLyout.WordWrap := ListItem.WordWrap; FTextLyout.Font := ListItem.Font; FTextLyout.HorizontalAlign := ListItem.TextAlign; FTextLyout.VerticalAlign := ListItem.VertTextAlign; finally FTextLyout.EndUpdate; end; // Получаем высоту текста при текущих настройках итема ListItem.Height := FTextLyout.Height; end; end; Обратите внимание, что этот код работает для горизонтальной ориентации TListBoxItem и обычного TListBoxItem итема без картинок. Поэтому я для упрощения понимания кода, принимаю за ширину текста ширину самого итема. Но как вы понимаете, текст в итеме имеет еще свои отступы и может располагаться, например, справа от изображения. В этом случае этот в этот код нужно будет добавить определение текущих размеров стилевого объекта текста, отвечающего за вывод текста в TListBoxItem. Но в вашем примере этого не нужно. 3. Вешаем наш обработчик на два события каждого итема TListBoxItem.OnResize и TListBoxItem.OnApplyStyleLookup. Результат
  9. Чем дальше в лес, тем больше дров. По этим вопросам, посмею предположить, что вы находитесь в самом начале изучения создания компонентов. Поэтому я вам советую вначале изучить, что к чему и как работают существующие компоненты. Материал я думаю есть в сети, но лучше исходников по-моему ничего не будет. Поэтому: Стоит взять самый простой компонент и разобраться как он работает. Посмотреть, как в нем реализованы основные функции, как осуществляется доступ к свойства в дизайн тайме и тд. Затем переходить на изучение исходного кода более сложных компонентов. Тех, которые реализуют ту функциональность, которая вам нужна. Затем по образу и подобию делаете свой компонент, шаг за шагом и проверяете. Тогда многие ваши вопросы отпадут самостоятельно. По вашим вопросам же, все можно сделать. Только не все нужно делать. Чтобы поменять в рантайме, нужно просто в момент смены свойства sType загружать в контейнер изображения другое изображение. Цвет пикселя можно получить. Но не нужно стрелять из пушки по воробьям.
  10. Добрый день, Если есть исходники FMX, то посмотрите на реализацию контрола FMX.StdCtrls.TImageControl, не стесняйтесь их изучать. Там как раз аналогичная ситуация, есть встроенный TImage, в который загружается пользовательское изображение. Общие правила такие: Решаем, где будем хранить контейнер для изображения TImage: в стиле или создавать динамически при создании нашего контрола? Любое изображение нужно где-то хранить, вариант с загрузкой по пути не самый удачный на мой взгляд. Так как пути на разных платформах будут разными, да и возникает необходимость разворачивания файлов изображений вместе с пакетом (Deployment Manager - Включение своих файлов в приложение). Единственный плюс при этом - это экономия на памяти и ускорение запуска программы, за счет отложенной загрузки изображения. Это может стать решающей причиной для хранения изображения по пути к файлу со всеми вытекающими. Изображение храним в TBitmap, который создается динамически. Доступ к нему открывается в published секции для работы в DesignTime. В этом случае пользователь сможет загрузить свое изображение в дизайн тайме и при этом оно при сохранении формы автоматически сериализуется в ресурсы формы, а в последующем и восстановится. Осталось настроить загрузку изображения непосредственно в компонент отображения. В нашем случае в TImage. Если TImage создается динамически нашим контролом и не зависит от стиля, то смело грузим картинку из TBitmap в TImage.Bitmap. Если же контейнер загружается из стиля, то грузим картинку в перекрытом методе ApplyStyle, который вызывается, когда стиль загружен для контрола.
  11. Не за что. Чтобы легче было понимать, нужно разобраться со следующими основополагающими темами по созданию компонентов: Сериализация/Десериализация компонентов в DesingTime. Назначение Design Time и Run Time В чем отличие работы контролов в Design Time и RunTime Вроде этих тем должно быть достаточно...
  12. Назначение свойства Stored Stored - нужно, чтобы указать нужно ли сохранять созданный объект в ресурсы формы или нет. Например, стилевые объекты не должны сериализоваться и сохраняться в ресурсы формы поскольку стиль загружается динамически в рантайме. И если он сериализуется в дизайн тайме, то в рантайме будет двойная загрузка стиля. Первый раз из ресурсов, второй раз уже динамически механизмом стилизации. Что как вы понимаете не верно. Поэтому у таких объектов, создаваемых в рантайме Stored устанавливается в False. Это свойство никак не влияет на работу обработки событий мыши. Без stored все должно работать корректно. В чем ошибка? Однако у вас есть ошибка, которая к этому поведению и привела и связана с неиспользованием свойства Stored. Первый раз, когда вы бросаете компонент на форму, он создает в дизайн тайме прямоугольник и привязывает его к вашему контролу. Все бы ничего, но когда вы сохраняете форму, ваш прямоугольник сериализуется в ресурсы формы. Затем идет запуск программы. Вначале отрабатывает конструктор вашего компонента и он, естественно, создает прямоугольник в рантайме. Но затем идет чтение еще одного прямоугольника, который читается и располагается поверх созданного контролом прямоугольника. Но в отличии от первого он уже не имеет заданного обработчика. В итоге в рантайме, созданный прямоугольник располагается внизу. А затем он перекрывается аналогичными прямоугольниками, созданными из ресурсов формы. Вот и весь секрет
  13. Добрый день, Код работает корректно. ShowMessage появляется, когда я нажимаю на контрол мышкой. Вопрос: Вам нужно, чтобы ShowMessage появлялся в DesignTime или только в RunTime?
  14. Приведите пример хотя бы одного интерфейса, где это необходимо? Как вы собираетесь нажать мышкой в два места одновременно в один и тот же момент времени? Что значит удерживаете кнопку? Кнопку нельзя удержать. Ее можно нажать. Вы вообще понимаете, что спрашиваете?
  15. Что вы имеете в виду под словом "одновременно" нажать и обработать? Во времени в один и тот же момент времени, программно или физически?
  16. Описания, что чему соответствует, нету. Но можно посмотреть, открыв этот стиль в стиль дизайнере и исходную растровую картинку в любом графическом редакторе. Далее каждый элемент, ссылается на определенный регион в растровом изображении. Там можно понять, что где находится. Так же это можно сделать прямо в BitmapStyleDesigner (даже проще). Лучше создавать отдельные темы на каждый вопрос, так будет удобно остальным пользователям для поиска ответа на их вопрос. И по вопросу будет понятно, стоит ли читать тему или нет. А когда в теме три вопроса обсуждается, найти их очень тяжело. Правило простое: один вопрос - один ответ.
  17. Стиль для андроида растровый, а это значит, что все элементы листбокса хранятся в растровом изображении. Поэтому для корректировки цвета выделенного итема, нужно править исходное растровое изображение частей элементов контролов. Рецепт 1. Открываем Bitmap Style Designer и создаем стиль по умолчанию (темный или светлый) для платформы Андроид. 2. В дереве разворачиваем узел Images и выполняем экспорт всех графических ресурсов. 3. Затем в любом графическом редакторе правим растровые исходники (для всех вариантов скейла экранов) фона TListBoxItem. Я поменял его на светло голубой. На картинке указано его местоположение: 4. Возвращаемся в Bitmap Style Designer и обновляем каждый исходник (style.png, style20x.png, style15x.png, style30x.png). Для обновления, выделяем картинку в дереве, жмем кнопку Update и указываем новое изображение. 5. После этого сохраняем полученный стиль: File->Save as...->Выбираем тип файла "FireMonkey Style". 6. Кидаем на форму стиль бук, подключаем к форме и грузим туда наш кастомный стиль. Результат На скриншоте ниже показан Листбокс с выделенным итемом голубого цвета (Было, Стало):
  18. Дело в том, что класс TThread является частью библиотеки RTL и не зависит от VCL никаким способом. Поэтому, это сообщение может появится из-за ошибочного подключения файлов VCL. Так же RTL полностью кроссплатформенна. Поэтому работа с классом TThread одинакова для всех платформ. Резюме Нужно проверить все файлы проекта и убедиться, что они не используют файлы VCL. А именно Unit2.cpp, поскольку речь в сообщение об ошибке идет именно об этом модуле. Проверил на чистом проекте, описанное вами поведение в RAD Studio XE6 Beta, не обнаружил.
  19. Прикол в том, что на мобильных платформах строки 0-основные. А вы работает с 1-основной. 0-основная - индексация строки начинается с 0, а не с 1. Документация Страница: UnicodeString P.S. На будущее, потрудитесь оформить код согласно стандартам. Читать не возможно.
  20. Проверьте в последней конфигурации манифест андроид приложения: AndroidManifest.xml Проверьте корректность выставленных разрешений (можно сравнить с манифестом обычного debug приложения.)
  21. Проверил на Samsumg Galaxy S3 (4.3) и в Debug и в Release работает. Настройки доступа стоят по умолчанию.
  22. По умолчанию картинка доступна только для элементов списка типа TMetropolistUIListBoxItem. Стиль для обычного элемента TListBoxItem для Windows не поддерживает картинки в стиле. Однако, чтобы добавить картинку, нужно просто добавить в стиль итема объект TImage с названием StyleName = 'icon'.
  23. Отредактировать стиль можно следующим способом: Читаем тему Где взять стандартный стиль в FireMonkey для iOS и Android, используемый по умолчанию? и получаем файл стиля. Открываем полученный файл стиля. Находим строку: "StyleName = 'listboxitemstyle'" Внутри него находим блок со стилев объектом "StyleName = 'text'". И меняем значение свойства WordWrap с False на True. А далее: Либо грузим стиль бук на форме, либо читаем тему: Как использовать один экземпляр TStyleBook для нескольких форм? и создаем один стиль для всех форм. Либо делаем подмену системного стиля согласно моей статье тут P.S. Решение с событием посмотрю позже. Пока предлагаю решение через стиль.
×
×
  • Создать...