-
Постов
159 -
Зарегистрирован
-
Посещение
-
Победитель дней
6
Активность репутации
-
Axbor получил реакцию от Kitty в Как реализовать Edit с автозаполнением на С++
Решил проблему с добавлением Unit вот такого вида:
unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, FMX.Controls.Presentation, FMX.Edit; procedure setmodeldata(Edit: TEdit); implementation uses System.Rtti; procedure setmodeldata(Edit: TEdit); var SuggestionList: TArray<string>; begin SuggestionList := ['Россия', 'Украина', 'Белорусь', 'Азербайджан', 'Армения', 'Грузия', 'Казахстан', 'Киргизстан', 'Латвия', 'Литва', 'Молдавия']; Edit.Model.Data['suggestion_list'] := TValue.From < TArray < string >> (SuggestionList); end; end. и вызвал функцию setmodeldata с моей формы.
-
Axbor получил реакцию от Rusland в Как реализовать Edit с автозаполнением на С++
Решил проблему с добавлением Unit вот такого вида:
unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, FMX.Controls.Presentation, FMX.Edit; procedure setmodeldata(Edit: TEdit); implementation uses System.Rtti; procedure setmodeldata(Edit: TEdit); var SuggestionList: TArray<string>; begin SuggestionList := ['Россия', 'Украина', 'Белорусь', 'Азербайджан', 'Армения', 'Грузия', 'Казахстан', 'Киргизстан', 'Латвия', 'Литва', 'Молдавия']; Edit.Model.Data['suggestion_list'] := TValue.From < TArray < string >> (SuggestionList); end; end. и вызвал функцию setmodeldata с моей формы.
-
Axbor получил реакцию от Rusland в Ошыбка Bitmap size too big
Сами задаем сами отвечаем.
Изменения высоты
Latifa1Layout->Height = Latifa1Caption->Height + Latifa1Text->Height + 20; сделал в Label(OnResize) и всё. Ошибка исчез.
-
Axbor получил реакцию от PowerOwl в Диалоговое окно на Андроид.
Хотел бы поделиться опытом. Рассмотрим случай, когда вам необходимо использовать кастомное диалоговое окно с затемнением. Вроде вот такого:
Первое, что приходит в голову, это использование Rectangle’ов. Но такой подход показался мне очень сложным, и я нашёл другой способ (многие о нём уже знают) создания кастомного окна.
Сам способ:
Создаем вторую форму, и изменяем следующие свойства:
Transparency = True Fill->Color = #78000000 Fill->Kind = Solid Поместим туда один TLayout, выставим свойство «Align» в значение «Center». И зададим нужный размер. Потом кидаем на TLayout компонент «TRectangle» со свойством «Align – Content». Чтобы TLayout не мешался во время design-time, присвоим свойству Locked значение True. Кидаем остальные компоненты, чтобы получить окно нужного нам вида.
В итоге у меня получилась вот такая иерархия компонентов:
Компонент TRectAnimation используем для анимирования процесса появления окна. Вы можете придумать свою анимацию. В данном случае анимируется свойства формы «Padding».
Напишем следующий код, для того, чтобы при клике на тёмную область формы окно закрылось (событие формы OnTap работает на сенсорных экранах, если вам нужен OnClick тогда воспользуйтесь Layout’ми или Rectangle’ми):
void __fastcall TForm2::FormTap(TObject *Sender, const TPointF &Point) { Close(); } Вот и всё. К сообщению, я приложил демо приложение с примером такого окна.
У администраторов просил бы поправить допущенные ошибки так как я не владею русским языком очень хорошем уровне. Или же добавит кое какие дополнительные информации ссылки и т.д.
Demo.zip
-
Axbor получил реакцию от Rusland в Диалоговое окно на Андроид.
Хотел бы поделиться опытом. Рассмотрим случай, когда вам необходимо использовать кастомное диалоговое окно с затемнением. Вроде вот такого:
Первое, что приходит в голову, это использование Rectangle’ов. Но такой подход показался мне очень сложным, и я нашёл другой способ (многие о нём уже знают) создания кастомного окна.
Сам способ:
Создаем вторую форму, и изменяем следующие свойства:
Transparency = True Fill->Color = #78000000 Fill->Kind = Solid Поместим туда один TLayout, выставим свойство «Align» в значение «Center». И зададим нужный размер. Потом кидаем на TLayout компонент «TRectangle» со свойством «Align – Content». Чтобы TLayout не мешался во время design-time, присвоим свойству Locked значение True. Кидаем остальные компоненты, чтобы получить окно нужного нам вида.
В итоге у меня получилась вот такая иерархия компонентов:
Компонент TRectAnimation используем для анимирования процесса появления окна. Вы можете придумать свою анимацию. В данном случае анимируется свойства формы «Padding».
Напишем следующий код, для того, чтобы при клике на тёмную область формы окно закрылось (событие формы OnTap работает на сенсорных экранах, если вам нужен OnClick тогда воспользуйтесь Layout’ми или Rectangle’ми):
void __fastcall TForm2::FormTap(TObject *Sender, const TPointF &Point) { Close(); } Вот и всё. К сообщению, я приложил демо приложение с примером такого окна.
У администраторов просил бы поправить допущенные ошибки так как я не владею русским языком очень хорошем уровне. Или же добавит кое какие дополнительные информации ссылки и т.д.
Demo.zip
-
Axbor получил реакцию от Кирилл в Диалоговое окно на Андроид.
Хотел бы поделиться опытом. Рассмотрим случай, когда вам необходимо использовать кастомное диалоговое окно с затемнением. Вроде вот такого:
Первое, что приходит в голову, это использование Rectangle’ов. Но такой подход показался мне очень сложным, и я нашёл другой способ (многие о нём уже знают) создания кастомного окна.
Сам способ:
Создаем вторую форму, и изменяем следующие свойства:
Transparency = True Fill->Color = #78000000 Fill->Kind = Solid Поместим туда один TLayout, выставим свойство «Align» в значение «Center». И зададим нужный размер. Потом кидаем на TLayout компонент «TRectangle» со свойством «Align – Content». Чтобы TLayout не мешался во время design-time, присвоим свойству Locked значение True. Кидаем остальные компоненты, чтобы получить окно нужного нам вида.
В итоге у меня получилась вот такая иерархия компонентов:
Компонент TRectAnimation используем для анимирования процесса появления окна. Вы можете придумать свою анимацию. В данном случае анимируется свойства формы «Padding».
Напишем следующий код, для того, чтобы при клике на тёмную область формы окно закрылось (событие формы OnTap работает на сенсорных экранах, если вам нужен OnClick тогда воспользуйтесь Layout’ми или Rectangle’ми):
void __fastcall TForm2::FormTap(TObject *Sender, const TPointF &Point) { Close(); } Вот и всё. К сообщению, я приложил демо приложение с примером такого окна.
У администраторов просил бы поправить допущенные ошибки так как я не владею русским языком очень хорошем уровне. Или же добавит кое какие дополнительные информации ссылки и т.д.
Demo.zip
-
Axbor получил реакцию от rareMax в Диалоговое окно на Андроид.
Хотел бы поделиться опытом. Рассмотрим случай, когда вам необходимо использовать кастомное диалоговое окно с затемнением. Вроде вот такого:
Первое, что приходит в голову, это использование Rectangle’ов. Но такой подход показался мне очень сложным, и я нашёл другой способ (многие о нём уже знают) создания кастомного окна.
Сам способ:
Создаем вторую форму, и изменяем следующие свойства:
Transparency = True Fill->Color = #78000000 Fill->Kind = Solid Поместим туда один TLayout, выставим свойство «Align» в значение «Center». И зададим нужный размер. Потом кидаем на TLayout компонент «TRectangle» со свойством «Align – Content». Чтобы TLayout не мешался во время design-time, присвоим свойству Locked значение True. Кидаем остальные компоненты, чтобы получить окно нужного нам вида.
В итоге у меня получилась вот такая иерархия компонентов:
Компонент TRectAnimation используем для анимирования процесса появления окна. Вы можете придумать свою анимацию. В данном случае анимируется свойства формы «Padding».
Напишем следующий код, для того, чтобы при клике на тёмную область формы окно закрылось (событие формы OnTap работает на сенсорных экранах, если вам нужен OnClick тогда воспользуйтесь Layout’ми или Rectangle’ми):
void __fastcall TForm2::FormTap(TObject *Sender, const TPointF &Point) { Close(); } Вот и всё. К сообщению, я приложил демо приложение с примером такого окна.
У администраторов просил бы поправить допущенные ошибки так как я не владею русским языком очень хорошем уровне. Или же добавит кое какие дополнительные информации ссылки и т.д.
Demo.zip
-
Axbor отреагировална Равиль Зарипов (ZuBy) в Mail.ru своими руками
на сколько помню протокол закрыли для третьих лиц еще в 12 году, т.к. раньше у меня был собственный клиент
MRA или MMP точно не помню как назывался
-
Axbor отреагировална Равиль Зарипов (ZuBy) в RAD 11 на подходе?
1) Кастомный стиль в виде плитки *
2) ListView с горизонтальной прокруткой, профиксил баги, которые появились из-за этого *
3) Отступ сверху от первого Itema, задается вручную. (нужно было сделать, чтобы решить без многочисленных костылей одну ситуацию)
4) Кастомные цвета для отдельных Item'ов
5) разные хелперы и внутренние настройки
* можно посмотреть тут
скрин выполненной работы
-
Axbor получил реакцию от pill в Собственный TListBoxItem на C++
Очень не хватает примеров на C++. Решил поделится опытом.
Рассмотрим создание собственного "ListBoxItem"а на C++.
И так начнем.
Для начало создадим стиль для нашего "ListItem"а. В моем случае оно выглядит так:
Структура выглядеть следующим образом:
А вы сразу можете создать собственный стиль.
Создадим класс для нашего "Item"а. Я назвал его TMyListBoxItem.
Нужно знать следующие вещи:
ApplyStyle() вызывается когда стиль загружен.
FreeStyle() когда стиль выгружен.
GetDefaultStyleLookupName() когда стиль не задано берется названые стиля по умолчанию.
FindStyleResource("стиль") ищет в стиле ресурс с заданным названием.
ListBox автоматически очищает из невидимых "Item"ов стиль что бы избежать от расходы на память. И заново загружает когда оно видимо. При этом вызывается соответствующие функции приведенные выше
я приведу только некоторые кусочки кода. Остальное всё можете посмотреть в прикреплённых файлах.
class TMyListBoxItem : public TListBoxItem { private: // Переменные для хранения данных System::UnicodeString FTimeTo; System::UnicodeString FTimeFrom; //.... // Визуальные компоненты TText* FTextTimeTo; TText* FTextTimeFrom; //... // Функции для присваивания данных, это нужно при написании "properties" void __fastcall SetTimeTo(const System::UnicodeString Value); void __fastcall SetTimeFrom(const System::UnicodeString Value); protected: void __fastcall ApplyStyle(); void __fastcall FreeStyle(); System::UnicodeString __fastcall GetDefaultStyleLookupName(); virtual void UpdateStyleData(); __published: __property System::UnicodeString TimeTo = {read=FTimeTo, write=SetTimeTo}; __property System::UnicodeString TimeFrom = {read=FTimeFrom, write=SetTimeFrom}; public: __fastcall TMyListBoxItem(System::Classes::TComponent* AOwner); }; Теперь напишем сами функции.
void __fastcall TMyListBoxItem::ApplyStyle() { // Вызов метода предка TListBoxItem::ApplyStyle(); TFmxObject *StyleObject; // Поиск ресурса из стиля. Посмотрите в скрине, там есть ресурс с названием "timeto" типа TText StyleObject = FindStyleResource("timeto"); // dynamic_cast нужен для корректного преобразования типов. Если тип найденного ресурса не является TText то указателю будет присвоен NULL FTextTimeTo = dynamic_cast<TText*>(StyleObject); StyleObject = FindStyleResource("timefrom"); FTextTimeFrom = dynamic_cast<TText*>(StyleObject); UpdateStyleData(); } void __fastcall TMyListBoxItem::FreeStyle() { // Стиль выгружен из памяти. Нужно очистить указатели что бы избежать ошибок FTextTimeTo = NULL; FTextTimeFrom = NULL; TListBoxItem::FreeStyle(); } System::UnicodeString __fastcall TMyListBoxItem::GetDefaultStyleLookupName() { // название стиля для нашего "Item"а по умолчанию return "mylistboxitemstyle"; } void TMyListBoxItem::UpdateStyleData() { if(FTextTimeTo) FTextTimeTo->Text = FTimeTo; if(FTextTimeFrom) FTextTimeFrom->Text = FTimeFrom; } void __fastcall TMyListBoxItem::SetTimeTo(const System::UnicodeString Value) { FTimeTo = Value; if(FTextTimeTo) FTextTimeTo->Text = FTimeTo; } Вот и всё. Остается только добавит в наш проект ListBox и button для проверки.
Вот функция создания нашего "Item"а:
void __fastcall TForm1::Button1Click(TObject *Sender) { TMyListBoxItem *Item = new TMyListBoxItem(this); Item->Parent = ListBox1; Item->StyleLookup = "customstyle1"; Item->TimeFrom = "11:20"; Item->TimeTo = "12:50"; } Скриншот программы:
В архиве мой класс и стиль. Для корректного отображения некоторых символов нужен fontcustom
Какие вопросы задавайте. Отдельное спасибо Ярославу за мануал на дельфи:
http://blogs.embarcadero.com/yaroslavbrovin/2012/10/15/listboxitem_styling_part2/
Администраторы и модераторы, прошу подкорректировать если что то неправильно.
ListBoxItem.zip
-
Axbor получил реакцию от Rusland в Расчет высоты объекта на основе высоты TLabel
Я предлагаю создать свой собственный класс для таких целей. Обработаем свойство Resize и всё, никаких проблем не будет. http://fire-monkey.ru/topic/2280-sobstvennyi-tlistboxitem-na-c/ тут я описал как создать собственный класс для ListBoxItem там же есть ссылка и для Delphi. Ниже приведен класс который я создал, только на C++. Посмотрите там обработчик события ApplyStyleLookup() и Resize(). И еще предлагаю вместо TLabel использовать TText.
Если всё таки хотите своим путём тогда вычислите высоты с помощью TTextLayout, это делается так:
var L : TTextLayout; begin L := TTextLayoutManager.DefaultTextLayout.Create; L.BeginUpdate; L.Text := FtextType.Text; {Вместо FTextType будет ваш Label} L.MaxSize := TPointF(FtextType.Width, 1000); L.Font := FTextType.Font; {} L.WordWrap := FTextType.WordWrap; L.HorizontalAlign := FTextType.HorzTextAlign; L.VerticalAlign := FTextType.VertTextAlign; L.EndUpdate; height := L.Height; end; Я не силён в Delphi, но думаю вы поймете.
ListBoxItem.zip
-
Axbor получил реакцию от Alex7wrt в Прозрачная форма с заголовком и рамками, Windows
На VCL это очень легко делается. Сделаете TransparentColor = true, и color формы сделаете одинаково со свойством TransparentColorValue
На FMX пока не нашел
-
Axbor отреагировална Alex7wrt в как отловить перемещение формы по экрану, Windows
После долгого поиска все-таки нашел тему на этом же форуме )). Хотя раньше искал, но не находил.
Тема: http://fire-monkey.ru/topic/1452-kak-poimat-peremeschenie-formy/
Суть решения - необходимо перекрыть виртуальный метод формы SetBounds, который выполняется каждый раз при перемещении формы
procedure TCommonCustomForm.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); virtual; Для этого в описании методов формы пишем
type TForm1 = class(TForm) ........ procedure SetBounds(ALeft, ATop, AWidth, AHeight: integer); override; ....... end; и в теле процедуры выполняем необходимые действия
procedure TForm1.SetBounds(ALeft, ATop, AWidth, AHeight: integer); begin inherited; if assigned(form2) then begin form2.Left:=ALeft; form2.top:=ATop; end; end; В данном случае - присвоение второй форме координат первой.
-
Axbor получил реакцию от zairkz в Расчет высоты объекта на основе высоты TLabel
Я предлагаю создать свой собственный класс для таких целей. Обработаем свойство Resize и всё, никаких проблем не будет. http://fire-monkey.ru/topic/2280-sobstvennyi-tlistboxitem-na-c/ тут я описал как создать собственный класс для ListBoxItem там же есть ссылка и для Delphi. Ниже приведен класс который я создал, только на C++. Посмотрите там обработчик события ApplyStyleLookup() и Resize(). И еще предлагаю вместо TLabel использовать TText.
Если всё таки хотите своим путём тогда вычислите высоты с помощью TTextLayout, это делается так:
var L : TTextLayout; begin L := TTextLayoutManager.DefaultTextLayout.Create; L.BeginUpdate; L.Text := FtextType.Text; {Вместо FTextType будет ваш Label} L.MaxSize := TPointF(FtextType.Width, 1000); L.Font := FTextType.Font; {} L.WordWrap := FTextType.WordWrap; L.HorizontalAlign := FTextType.HorzTextAlign; L.VerticalAlign := FTextType.VertTextAlign; L.EndUpdate; height := L.Height; end; Я не силён в Delphi, но думаю вы поймете.
ListBoxItem.zip
-
Axbor отреагировална Axbor в Ошыбка Bitmap size too big
Сами задаем сами отвечаем.
Изменения высоты
Latifa1Layout->Height = Latifa1Caption->Height + Latifa1Text->Height + 20; сделал в Label(OnResize) и всё. Ошибка исчез.
-
Axbor получил реакцию от Равиль Зарипов (ZuBy) в Ошибка при подключении к MySQL Windows
Проблема решилась обновлением libmysql.dll
libmysql.zip
-
Axbor отреагировална Axbor в Ошибка при подключении к MySQL Windows
Проблема решилась обновлением libmysql.dll
libmysql.zip
-
Axbor получил реакцию от Brovin Yaroslav в Размер приложения на разных устройствах
Вы посмотрите там сам APK файл сколько весит? Одинаково?! Скорее всего подсчет у всех устройствах по разному.
-
Axbor отреагировална Brovin Yaroslav в [Статья][Android] Приложение будильник. Использование AlarmManager в FireMonkey на Андроиде
Ссылка: http://yaroslavbrovin.ru/using-alarmmanager-in-firemonkey-on-android-ru/ Автор: Бровин Ярослав Статья посвящена использованию Андроид AlarmManager в delphi приложения, позволяющего выполнять код в назначенное время даже, когда приложение закрыто. Все это рассматривается на примере приложения Будильник.
-
Axbor отреагировална Alex7wrt в Отображение значка дочерней формы на панели задач, Windows
Нашел решение в другой теме.
http://fire-monkey.ru/topic/504-neskolko-okon-prilozheniia-v-paneli-zadach/
-
Axbor получил реакцию от Ingalime в Собственный TListBoxItem на C++
Очень не хватает примеров на C++. Решил поделится опытом.
Рассмотрим создание собственного "ListBoxItem"а на C++.
И так начнем.
Для начало создадим стиль для нашего "ListItem"а. В моем случае оно выглядит так:
Структура выглядеть следующим образом:
А вы сразу можете создать собственный стиль.
Создадим класс для нашего "Item"а. Я назвал его TMyListBoxItem.
Нужно знать следующие вещи:
ApplyStyle() вызывается когда стиль загружен.
FreeStyle() когда стиль выгружен.
GetDefaultStyleLookupName() когда стиль не задано берется названые стиля по умолчанию.
FindStyleResource("стиль") ищет в стиле ресурс с заданным названием.
ListBox автоматически очищает из невидимых "Item"ов стиль что бы избежать от расходы на память. И заново загружает когда оно видимо. При этом вызывается соответствующие функции приведенные выше
я приведу только некоторые кусочки кода. Остальное всё можете посмотреть в прикреплённых файлах.
class TMyListBoxItem : public TListBoxItem { private: // Переменные для хранения данных System::UnicodeString FTimeTo; System::UnicodeString FTimeFrom; //.... // Визуальные компоненты TText* FTextTimeTo; TText* FTextTimeFrom; //... // Функции для присваивания данных, это нужно при написании "properties" void __fastcall SetTimeTo(const System::UnicodeString Value); void __fastcall SetTimeFrom(const System::UnicodeString Value); protected: void __fastcall ApplyStyle(); void __fastcall FreeStyle(); System::UnicodeString __fastcall GetDefaultStyleLookupName(); virtual void UpdateStyleData(); __published: __property System::UnicodeString TimeTo = {read=FTimeTo, write=SetTimeTo}; __property System::UnicodeString TimeFrom = {read=FTimeFrom, write=SetTimeFrom}; public: __fastcall TMyListBoxItem(System::Classes::TComponent* AOwner); }; Теперь напишем сами функции.
void __fastcall TMyListBoxItem::ApplyStyle() { // Вызов метода предка TListBoxItem::ApplyStyle(); TFmxObject *StyleObject; // Поиск ресурса из стиля. Посмотрите в скрине, там есть ресурс с названием "timeto" типа TText StyleObject = FindStyleResource("timeto"); // dynamic_cast нужен для корректного преобразования типов. Если тип найденного ресурса не является TText то указателю будет присвоен NULL FTextTimeTo = dynamic_cast<TText*>(StyleObject); StyleObject = FindStyleResource("timefrom"); FTextTimeFrom = dynamic_cast<TText*>(StyleObject); UpdateStyleData(); } void __fastcall TMyListBoxItem::FreeStyle() { // Стиль выгружен из памяти. Нужно очистить указатели что бы избежать ошибок FTextTimeTo = NULL; FTextTimeFrom = NULL; TListBoxItem::FreeStyle(); } System::UnicodeString __fastcall TMyListBoxItem::GetDefaultStyleLookupName() { // название стиля для нашего "Item"а по умолчанию return "mylistboxitemstyle"; } void TMyListBoxItem::UpdateStyleData() { if(FTextTimeTo) FTextTimeTo->Text = FTimeTo; if(FTextTimeFrom) FTextTimeFrom->Text = FTimeFrom; } void __fastcall TMyListBoxItem::SetTimeTo(const System::UnicodeString Value) { FTimeTo = Value; if(FTextTimeTo) FTextTimeTo->Text = FTimeTo; } Вот и всё. Остается только добавит в наш проект ListBox и button для проверки.
Вот функция создания нашего "Item"а:
void __fastcall TForm1::Button1Click(TObject *Sender) { TMyListBoxItem *Item = new TMyListBoxItem(this); Item->Parent = ListBox1; Item->StyleLookup = "customstyle1"; Item->TimeFrom = "11:20"; Item->TimeTo = "12:50"; } Скриншот программы:
В архиве мой класс и стиль. Для корректного отображения некоторых символов нужен fontcustom
Какие вопросы задавайте. Отдельное спасибо Ярославу за мануал на дельфи:
http://blogs.embarcadero.com/yaroslavbrovin/2012/10/15/listboxitem_styling_part2/
Администраторы и модераторы, прошу подкорректировать если что то неправильно.
ListBoxItem.zip
-
Axbor получил реакцию от Равиль Зарипов (ZuBy) в Вопрос про свайп в лево свайп в право
Есть компонент GestureManager. Бросим его в проект. Указываем у TImage->Touch->GestureManager на наш GestureManager. Включаем в TImage->Touch->Gestures нужные нам жесты (на вашем случае Left и Right). Потом в событии OnGesture TImage запишем следующее:
void __fastcall TForm1::Image1Gesture(TObject *Sender, const TGestureEventInfo &EventInfo, bool &Handled) { switch(EventInfo.GestureID) { case sgiLeft: // произошло свайп в лево Handled = true; break; case sgiRight: // произошло свайп в право Handled = true; break; } } -
Axbor получил реакцию от egorkozz в Вопрос про свайп в лево свайп в право
Есть компонент GestureManager. Бросим его в проект. Указываем у TImage->Touch->GestureManager на наш GestureManager. Включаем в TImage->Touch->Gestures нужные нам жесты (на вашем случае Left и Right). Потом в событии OnGesture TImage запишем следующее:
void __fastcall TForm1::Image1Gesture(TObject *Sender, const TGestureEventInfo &EventInfo, bool &Handled) { switch(EventInfo.GestureID) { case sgiLeft: // произошло свайп в лево Handled = true; break; case sgiRight: // произошло свайп в право Handled = true; break; } } -
Axbor получил реакцию от Anatoliy в Собственный TListBoxItem на C++
Очень не хватает примеров на C++. Решил поделится опытом.
Рассмотрим создание собственного "ListBoxItem"а на C++.
И так начнем.
Для начало создадим стиль для нашего "ListItem"а. В моем случае оно выглядит так:
Структура выглядеть следующим образом:
А вы сразу можете создать собственный стиль.
Создадим класс для нашего "Item"а. Я назвал его TMyListBoxItem.
Нужно знать следующие вещи:
ApplyStyle() вызывается когда стиль загружен.
FreeStyle() когда стиль выгружен.
GetDefaultStyleLookupName() когда стиль не задано берется названые стиля по умолчанию.
FindStyleResource("стиль") ищет в стиле ресурс с заданным названием.
ListBox автоматически очищает из невидимых "Item"ов стиль что бы избежать от расходы на память. И заново загружает когда оно видимо. При этом вызывается соответствующие функции приведенные выше
я приведу только некоторые кусочки кода. Остальное всё можете посмотреть в прикреплённых файлах.
class TMyListBoxItem : public TListBoxItem { private: // Переменные для хранения данных System::UnicodeString FTimeTo; System::UnicodeString FTimeFrom; //.... // Визуальные компоненты TText* FTextTimeTo; TText* FTextTimeFrom; //... // Функции для присваивания данных, это нужно при написании "properties" void __fastcall SetTimeTo(const System::UnicodeString Value); void __fastcall SetTimeFrom(const System::UnicodeString Value); protected: void __fastcall ApplyStyle(); void __fastcall FreeStyle(); System::UnicodeString __fastcall GetDefaultStyleLookupName(); virtual void UpdateStyleData(); __published: __property System::UnicodeString TimeTo = {read=FTimeTo, write=SetTimeTo}; __property System::UnicodeString TimeFrom = {read=FTimeFrom, write=SetTimeFrom}; public: __fastcall TMyListBoxItem(System::Classes::TComponent* AOwner); }; Теперь напишем сами функции.
void __fastcall TMyListBoxItem::ApplyStyle() { // Вызов метода предка TListBoxItem::ApplyStyle(); TFmxObject *StyleObject; // Поиск ресурса из стиля. Посмотрите в скрине, там есть ресурс с названием "timeto" типа TText StyleObject = FindStyleResource("timeto"); // dynamic_cast нужен для корректного преобразования типов. Если тип найденного ресурса не является TText то указателю будет присвоен NULL FTextTimeTo = dynamic_cast<TText*>(StyleObject); StyleObject = FindStyleResource("timefrom"); FTextTimeFrom = dynamic_cast<TText*>(StyleObject); UpdateStyleData(); } void __fastcall TMyListBoxItem::FreeStyle() { // Стиль выгружен из памяти. Нужно очистить указатели что бы избежать ошибок FTextTimeTo = NULL; FTextTimeFrom = NULL; TListBoxItem::FreeStyle(); } System::UnicodeString __fastcall TMyListBoxItem::GetDefaultStyleLookupName() { // название стиля для нашего "Item"а по умолчанию return "mylistboxitemstyle"; } void TMyListBoxItem::UpdateStyleData() { if(FTextTimeTo) FTextTimeTo->Text = FTimeTo; if(FTextTimeFrom) FTextTimeFrom->Text = FTimeFrom; } void __fastcall TMyListBoxItem::SetTimeTo(const System::UnicodeString Value) { FTimeTo = Value; if(FTextTimeTo) FTextTimeTo->Text = FTimeTo; } Вот и всё. Остается только добавит в наш проект ListBox и button для проверки.
Вот функция создания нашего "Item"а:
void __fastcall TForm1::Button1Click(TObject *Sender) { TMyListBoxItem *Item = new TMyListBoxItem(this); Item->Parent = ListBox1; Item->StyleLookup = "customstyle1"; Item->TimeFrom = "11:20"; Item->TimeTo = "12:50"; } Скриншот программы:
В архиве мой класс и стиль. Для корректного отображения некоторых символов нужен fontcustom
Какие вопросы задавайте. Отдельное спасибо Ярославу за мануал на дельфи:
http://blogs.embarcadero.com/yaroslavbrovin/2012/10/15/listboxitem_styling_part2/
Администраторы и модераторы, прошу подкорректировать если что то неправильно.
ListBoxItem.zip
-
Axbor получил реакцию от DimArt в Собственный TListBoxItem на C++
Очень не хватает примеров на C++. Решил поделится опытом.
Рассмотрим создание собственного "ListBoxItem"а на C++.
И так начнем.
Для начало создадим стиль для нашего "ListItem"а. В моем случае оно выглядит так:
Структура выглядеть следующим образом:
А вы сразу можете создать собственный стиль.
Создадим класс для нашего "Item"а. Я назвал его TMyListBoxItem.
Нужно знать следующие вещи:
ApplyStyle() вызывается когда стиль загружен.
FreeStyle() когда стиль выгружен.
GetDefaultStyleLookupName() когда стиль не задано берется названые стиля по умолчанию.
FindStyleResource("стиль") ищет в стиле ресурс с заданным названием.
ListBox автоматически очищает из невидимых "Item"ов стиль что бы избежать от расходы на память. И заново загружает когда оно видимо. При этом вызывается соответствующие функции приведенные выше
я приведу только некоторые кусочки кода. Остальное всё можете посмотреть в прикреплённых файлах.
class TMyListBoxItem : public TListBoxItem { private: // Переменные для хранения данных System::UnicodeString FTimeTo; System::UnicodeString FTimeFrom; //.... // Визуальные компоненты TText* FTextTimeTo; TText* FTextTimeFrom; //... // Функции для присваивания данных, это нужно при написании "properties" void __fastcall SetTimeTo(const System::UnicodeString Value); void __fastcall SetTimeFrom(const System::UnicodeString Value); protected: void __fastcall ApplyStyle(); void __fastcall FreeStyle(); System::UnicodeString __fastcall GetDefaultStyleLookupName(); virtual void UpdateStyleData(); __published: __property System::UnicodeString TimeTo = {read=FTimeTo, write=SetTimeTo}; __property System::UnicodeString TimeFrom = {read=FTimeFrom, write=SetTimeFrom}; public: __fastcall TMyListBoxItem(System::Classes::TComponent* AOwner); }; Теперь напишем сами функции.
void __fastcall TMyListBoxItem::ApplyStyle() { // Вызов метода предка TListBoxItem::ApplyStyle(); TFmxObject *StyleObject; // Поиск ресурса из стиля. Посмотрите в скрине, там есть ресурс с названием "timeto" типа TText StyleObject = FindStyleResource("timeto"); // dynamic_cast нужен для корректного преобразования типов. Если тип найденного ресурса не является TText то указателю будет присвоен NULL FTextTimeTo = dynamic_cast<TText*>(StyleObject); StyleObject = FindStyleResource("timefrom"); FTextTimeFrom = dynamic_cast<TText*>(StyleObject); UpdateStyleData(); } void __fastcall TMyListBoxItem::FreeStyle() { // Стиль выгружен из памяти. Нужно очистить указатели что бы избежать ошибок FTextTimeTo = NULL; FTextTimeFrom = NULL; TListBoxItem::FreeStyle(); } System::UnicodeString __fastcall TMyListBoxItem::GetDefaultStyleLookupName() { // название стиля для нашего "Item"а по умолчанию return "mylistboxitemstyle"; } void TMyListBoxItem::UpdateStyleData() { if(FTextTimeTo) FTextTimeTo->Text = FTimeTo; if(FTextTimeFrom) FTextTimeFrom->Text = FTimeFrom; } void __fastcall TMyListBoxItem::SetTimeTo(const System::UnicodeString Value) { FTimeTo = Value; if(FTextTimeTo) FTextTimeTo->Text = FTimeTo; } Вот и всё. Остается только добавит в наш проект ListBox и button для проверки.
Вот функция создания нашего "Item"а:
void __fastcall TForm1::Button1Click(TObject *Sender) { TMyListBoxItem *Item = new TMyListBoxItem(this); Item->Parent = ListBox1; Item->StyleLookup = "customstyle1"; Item->TimeFrom = "11:20"; Item->TimeTo = "12:50"; } Скриншот программы:
В архиве мой класс и стиль. Для корректного отображения некоторых символов нужен fontcustom
Какие вопросы задавайте. Отдельное спасибо Ярославу за мануал на дельфи:
http://blogs.embarcadero.com/yaroslavbrovin/2012/10/15/listboxitem_styling_part2/
Администраторы и модераторы, прошу подкорректировать если что то неправильно.
ListBoxItem.zip