Очень не хватает примеров на 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