Главная » C++, C++ Builder » Зачем нам нужно переустанавливать элементы списка?

0

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

Если бы вы создавали список общего назначения, вам, вероятно, нужно было бы держать четыре отдельных массива объектов в вашем компоненте. Первый содержал бы текст элемента, второй — растровый рисунок, связанный с этим элементом. Учтите, что указатели на рисунки (bitmap) могут быть равны NULL и их необязательно устанавливать для всех элементов. Третий массив содержал бы цвета, связанные с  элементами, которые  должны были быть использованы при прорисовке элемента в списке. Последний (четвертый) массив использовался бы для хранения шрифтов, связанных с элементами, причем опять же значения могут быть не установлены (NULL) и в этом случае не применяются. Лучше, чем держать четыре массива (которые должны быть синхронизированы друг с другом при добавлении и удалении  элементов),  создать  свой  объект C++, в котором бы хранились эти атрибуты элемента. Вот такая мысль на будущее.

У нас в примере всего два элемента в списке, так что нам проще следить за тем, что должно быть изображено и с каким рисунком, цветом,  шрифтом.  Вот  полная  реализация  метода SetListBoxItems, который добавляет элементы в список:

void  TForm1::SetListBoxItems(void)

{

ListBox1->Clear();

// Добавить элементы в список

ListBox1->Items->AddObject( "Земля", Fbmp1); ListBox1->Items->AddObject( "Корабль", Fbmp2);

}

Ничего ужасно сложного в этой процедуре нет. Первым делом она удаляет все существующие элементы в  списке, вызывая метод Clear объекта список (TListBox). Затем  два  элемента добавляются в список. Если вы никогда раньше не работали с TListBox и при этом знакомы с нормальным способом ассоциирования данных в программе с элементами списка, то вас ждет сюрприз. Метод AddObject класса TListBox позволяет  программисту добавлять и текст,  и ассоциированные с ним данные вместе. Второй параметр функции, в нашем случае — растровый рисунок, является нетипизированным объектом. Вы можете передавать туда все, что угодно, если только вы сможете это потом правильно интерпретировать. Как вы увидите, когда мы дойдем до кода прорисовки списка, нам необходимо хранить такой же указатель (или как минимум унаследованный от общего предка), чтобы эффективно работать с такими данными.

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

По теме:

  • Комментарии