-
Постов
2 124 -
Зарегистрирован
-
Посещение
-
Победитель дней
390
Весь контент Brovin Yaroslav
-
Описанная вами проблема в вашем коде: 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.
-
TTextLayout Как сделать буквы разного цвета?
Brovin Yaroslav ответил brunnengi вопрос в Работа с текстом
Добрый вечер, Такую надпись можно решить несколькими способами в зависимости от дополнительных условий: Будет ли меняться текст надписи или нет? В зависимости от этого есть четыре решения: I. Текст надписи не допускает изменений В этом случае проще всего сделать картинку с этим текстом и использовать ее в вашем приложении. Где нужно отобразить, использовать TImage. II. Текст надписи может изменяться Тут два решения: 1. Используем набор TText или TLabel. Для отображения групп последовательных символов одного цвета используем отдельный контрол TLabel или TText. Каждую группу раскрашиваем требуемым образом через настройки контролов. На скриншотах ниже, я использовал контейнер TLayout и складываю туда несколько объектов TText с выравниванием по левому краю. 2. Рисовать надпись вручную с использование TTextLayout. Этот способ сложнее, но зато универсальнее и эффективнее. Используя TTextLayout по очереди отрисовываем все буквы с нужными цветами и параметрами. 3. На основе решения 2 в этой части, сделать свой компонент. -
На сколько я знаю, для того, что внутри приложения был доступ к базе данных нужно две вещи: Драйвер БД, к которой собираетесь подключаться. Которая реализует все функции по работе с Базой Данных. Компонент-обертка, который, используя этот драйвер, дает вам удобный доступ ко всем возможностям БД. Если на Windows проблем с драйвером нету. Взял от вендоров и прикрепил к приложению. То с телефоном ситуация в корне другая. Телефон - это своя песочница со своими правилами. Которая не будет хранить все версии драйверов для баз данных. И на самом деле не хранит, только те, что считаются официально поддерживаемыми (SQLite, остальное не встречал). Отсюда, если я правильно помню, официально Embarcadero поддерживает SQLite и InterBase (так как база собственная разработка Embarcadero и ее драйвер, который можно включить в пакет приложения для андроида, так как опять же драйвер эмбаркадеро). SQLite является стандартной базой данных для мобильных ОС Андроид и IOS и используются самими системами. А значит ОС имеют свои реализации драйвера для работы с ней. Я не видел, чтобы MySQL официально поддерживалась на Андроиде. Поэтому одни обертки работать не будут. Нужна реализация работы с MySQL. Если вы посмотрите по интернету, то встретитесь со статьями о том, как самостоятельно реализовать работу с MySQL с использованием JSON протокола. Поэтому все остальные библиотеки, если умеют работать с базами, то используйте их.
-
Если очень нужно, то можно реализовать свой контрол, который будет держать у себя две кнопки. Этот контрол будет получать события мыши, а дальше перенаправлять их в нужную кнопку. Определение нужной кнопки будет на совести этого контрола. И будет решаться простым определением попадание координат мыши в область каждой кнопк События мыши по платформе, может принимать только тот контрол, который находится в захваченном (TForm.Captured) состоянии. И это в любое время всегда или один контрол или ни одного. Это общая практика работы библиотек UI контролов. Поэтому двойное нажатие в один и тот же момент на разные контролы не возможно. P.S. Как я могу предположить это может быть полезно для реализации игрового контроллера?
-
Ответ косвенно был дан в теме Автоматический переход на вторую строку 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. Результат
-
Чем дальше в лес, тем больше дров. По этим вопросам, посмею предположить, что вы находитесь в самом начале изучения создания компонентов. Поэтому я вам советую вначале изучить, что к чему и как работают существующие компоненты. Материал я думаю есть в сети, но лучше исходников по-моему ничего не будет. Поэтому: Стоит взять самый простой компонент и разобраться как он работает. Посмотреть, как в нем реализованы основные функции, как осуществляется доступ к свойства в дизайн тайме и тд. Затем переходить на изучение исходного кода более сложных компонентов. Тех, которые реализуют ту функциональность, которая вам нужна. Затем по образу и подобию делаете свой компонент, шаг за шагом и проверяете. Тогда многие ваши вопросы отпадут самостоятельно. По вашим вопросам же, все можно сделать. Только не все нужно делать. Чтобы поменять в рантайме, нужно просто в момент смены свойства sType загружать в контейнер изображения другое изображение. Цвет пикселя можно получить. Но не нужно стрелять из пушки по воробьям.
- 4 ответа
-
- TImage
- ApplyStyle
-
(и ещё 1 )
C тегом:
-
Добрый день, Если есть исходники FMX, то посмотрите на реализацию контрола FMX.StdCtrls.TImageControl, не стесняйтесь их изучать. Там как раз аналогичная ситуация, есть встроенный TImage, в который загружается пользовательское изображение. Общие правила такие: Решаем, где будем хранить контейнер для изображения TImage: в стиле или создавать динамически при создании нашего контрола? Любое изображение нужно где-то хранить, вариант с загрузкой по пути не самый удачный на мой взгляд. Так как пути на разных платформах будут разными, да и возникает необходимость разворачивания файлов изображений вместе с пакетом (Deployment Manager - Включение своих файлов в приложение). Единственный плюс при этом - это экономия на памяти и ускорение запуска программы, за счет отложенной загрузки изображения. Это может стать решающей причиной для хранения изображения по пути к файлу со всеми вытекающими. Изображение храним в TBitmap, который создается динамически. Доступ к нему открывается в published секции для работы в DesignTime. В этом случае пользователь сможет загрузить свое изображение в дизайн тайме и при этом оно при сохранении формы автоматически сериализуется в ресурсы формы, а в последующем и восстановится. Осталось настроить загрузку изображения непосредственно в компонент отображения. В нашем случае в TImage. Если TImage создается динамически нашим контролом и не зависит от стиля, то смело грузим картинку из TBitmap в TImage.Bitmap. Если же контейнер загружается из стиля, то грузим картинку в перекрытом методе ApplyStyle, который вызывается, когда стиль загружен для контрола.
- 4 ответа
-
- TImage
- ApplyStyle
-
(и ещё 1 )
C тегом:
-
Не за что. Чтобы легче было понимать, нужно разобраться со следующими основополагающими темами по созданию компонентов: Сериализация/Десериализация компонентов в DesingTime. Назначение Design Time и Run Time В чем отличие работы контролов в Design Time и RunTime Вроде этих тем должно быть достаточно...
- 5 ответов
-
- TFmxObject.Stored
- Stored
-
(и ещё 1 )
C тегом:
-
Назначение свойства Stored Stored - нужно, чтобы указать нужно ли сохранять созданный объект в ресурсы формы или нет. Например, стилевые объекты не должны сериализоваться и сохраняться в ресурсы формы поскольку стиль загружается динамически в рантайме. И если он сериализуется в дизайн тайме, то в рантайме будет двойная загрузка стиля. Первый раз из ресурсов, второй раз уже динамически механизмом стилизации. Что как вы понимаете не верно. Поэтому у таких объектов, создаваемых в рантайме Stored устанавливается в False. Это свойство никак не влияет на работу обработки событий мыши. Без stored все должно работать корректно. В чем ошибка? Однако у вас есть ошибка, которая к этому поведению и привела и связана с неиспользованием свойства Stored. Первый раз, когда вы бросаете компонент на форму, он создает в дизайн тайме прямоугольник и привязывает его к вашему контролу. Все бы ничего, но когда вы сохраняете форму, ваш прямоугольник сериализуется в ресурсы формы. Затем идет запуск программы. Вначале отрабатывает конструктор вашего компонента и он, естественно, создает прямоугольник в рантайме. Но затем идет чтение еще одного прямоугольника, который читается и располагается поверх созданного контролом прямоугольника. Но в отличии от первого он уже не имеет заданного обработчика. В итоге в рантайме, созданный прямоугольник располагается внизу. А затем он перекрывается аналогичными прямоугольниками, созданными из ресурсов формы. Вот и весь секрет
- 5 ответов
-
- TFmxObject.Stored
- Stored
-
(и ещё 1 )
C тегом:
-
Добрый день, Код работает корректно. ShowMessage появляется, когда я нажимаю на контрол мышкой. Вопрос: Вам нужно, чтобы ShowMessage появлялся в DesignTime или только в RunTime?
- 5 ответов
-
- TFmxObject.Stored
- Stored
-
(и ещё 1 )
C тегом:
-
Описания, что чему соответствует, нету. Но можно посмотреть, открыв этот стиль в стиль дизайнере и исходную растровую картинку в любом графическом редакторе. Далее каждый элемент, ссылается на определенный регион в растровом изображении. Там можно понять, что где находится. Так же это можно сделать прямо в BitmapStyleDesigner (даже проще). Лучше создавать отдельные темы на каждый вопрос, так будет удобно остальным пользователям для поиска ответа на их вопрос. И по вопросу будет понятно, стоит ли читать тему или нет. А когда в теме три вопроса обсуждается, найти их очень тяжело. Правило простое: один вопрос - один ответ.
- 6 ответов
-
- Light Style
- Android Platform Style
- (и ещё 3 )
-
Стиль для андроида растровый, а это значит, что все элементы листбокса хранятся в растровом изображении. Поэтому для корректировки цвета выделенного итема, нужно править исходное растровое изображение частей элементов контролов. Рецепт 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. Кидаем на форму стиль бук, подключаем к форме и грузим туда наш кастомный стиль. Результат На скриншоте ниже показан Листбокс с выделенным итемом голубого цвета (Было, Стало):
- 6 ответов
-
- Light Style
- Android Platform Style
- (и ещё 3 )
-
Дело в том, что класс TThread является частью библиотеки RTL и не зависит от VCL никаким способом. Поэтому, это сообщение может появится из-за ошибочного подключения файлов VCL. Так же RTL полностью кроссплатформенна. Поэтому работа с классом TThread одинакова для всех платформ. Резюме Нужно проверить все файлы проекта и убедиться, что они не используют файлы VCL. А именно Unit2.cpp, поскольку речь в сообщение об ошибке идет именно об этом модуле. Проверил на чистом проекте, описанное вами поведение в RAD Studio XE6 Beta, не обнаружил.
-
Проверьте в последней конфигурации манифест андроид приложения: AndroidManifest.xml Проверьте корректность выставленных разрешений (можно сравнить с манифестом обычного debug приложения.)
- 5 ответов
-
- TIdTCPClient
- наличие интернет
-
(и ещё 1 )
C тегом:
-
Проверил на Samsumg Galaxy S3 (4.3) и в Debug и в Release работает. Настройки доступа стоят по умолчанию.
- 5 ответов
-
- TIdTCPClient
- наличие интернет
-
(и ещё 1 )
C тегом:
-
По умолчанию картинка доступна только для элементов списка типа TMetropolistUIListBoxItem. Стиль для обычного элемента TListBoxItem для Windows не поддерживает картинки в стиле. Однако, чтобы добавить картинку, нужно просто добавить в стиль итема объект TImage с названием StyleName = 'icon'.
- 1 ответ
-
- TMetropolistUIListBoxItem
- TImage
-
(и ещё 1 )
C тегом:
-
Отредактировать стиль можно следующим способом: Читаем тему Где взять стандартный стиль в FireMonkey для iOS и Android, используемый по умолчанию? и получаем файл стиля. Открываем полученный файл стиля. Находим строку: "StyleName = 'listboxitemstyle'" Внутри него находим блок со стилев объектом "StyleName = 'text'". И меняем значение свойства WordWrap с False на True. А далее: Либо грузим стиль бук на форме, либо читаем тему: Как использовать один экземпляр TStyleBook для нескольких форм? и создаем один стиль для всех форм. Либо делаем подмену системного стиля согласно моей статье тут P.S. Решение с событием посмотрю позже. Пока предлагаю решение через стиль.
- 9 ответов
-
- TStyledSettings
- ssOther
- (и ещё 4 )