- Работа со списками
- Работа с объектом типа Memo
- Классический список ListBox в системе Visual Basic
- Классический список ListBox в системах BCB и Delphi
- Компактный список ComboBox в системе Visual Basic
- Компактный список ComboBox в системах BCB и Delphi
- Списки DriveListBox, DirListBox и FileListBox в среде VB
- Списки DriveComboBox, DirectoryListBox и FileListBox в системах BCB/Delphi
- Присоединение объектов к строкам списка ListBox
- Сортировка грибов
- Просмотр системных шрифтов
Классический список ListBox в системах BCB и Delphi
Опубликовано admin в Пт, 01/15/2010 - 19:54
По внешнему виду объект ListBox в системах фирмы Borland мало отличается от аналогичного компонента, описанного в предыдущем разделе. Однако внешнее впечатление обманчиво.
Первое принципиальное отличие заключается в том, что здесь с каждой строкой можно ассоциировать любой объект. Чаще всего в качестве такого объекта выступает небольшой растровый рисунок (пиктограмма), который может украсить отображаемый список. Однако возможна и другая интерпретация пары строка-объект. Строка может рассматриваться как информация об объекте, с которой пользователю будет удобнее работать.
Объект ListBox снабжен массивом указателей Items на значения соответствующих строк списка:
- ListBox1.Items[0] — указатель на первую строку в списке Delphi;
- ListBox1->Items[0] — указатель на первую строку в списке BCB.
К значениям этих строк можно обратиться, используя более длинный идентификатор:
- ListBox1.Items.Strings[0] — первая строка в списке Delphi;
- ListBox1->Items->Strings[0] — первая строка в списке BCB.
В зависимости от используемого метода и типа требующихся аргументов приходится выбирать тот или иной способ адресации операндов. Наличие дополнительного массива указателей позволяет организовать более эффективную работу с такими неудобными данными как строки переменной длины. Например, при сортировке строк списка достаточно провести перестроение четырехбайтовых указателей вместо того, чтобы перемещать сами строки, каждый раз освобождая и запрашивая память. В специальных процедурах копирования одного списка в другой нет нужды в дублировании значений строк — достаточно переустановить значения указателей в списке-получателе.
Все методы таблицы 4.1, где присутствовал объект Memo1.Lines, с точностью до замены имени объекта на ListBox1.Items остаются справедливыми. Кроме того, непосредственно с именем списка может использоваться метод Clear — очистка списка.
Приложение 4_04 (BCB).
Интересной особенностью списков в системах BCB и Delphi является возможность задания строк в формате имя=значение. Для этого при формировании содержимого списка в редакторе строк вы начинаете набор строки с имени, вплотную к которому размещается знак =, и без пробела продолжаете набор строки, относящийся к значению. К текстовым файлам подобного типа относятся ini-файлы в среде Windows. Для организации поиска строки, содержащей заданное имя, можно выполнить перебор всех строк в цикле с использованием функции IndexOfName:
for(int j=0; j<ListBox1->Count; j++)
if(ListBox1->Items[j]->IndexOfName("имя2")>-1
{//Обработка найденной строки
Функция IndexOfName возвращает индекс строки, если ее имя совпадает с аргументом функции. Еще один пример, демонстрирующий использование свойств Names и Values приведен на рис. 4.4.

Рис. 4.4. Извлечение имени и значения из строки списка
Приложение 4_05, 4_06 (Delphi).
В системах BCB и Delphi классические списки также обладают логическим свойством MultiSelect, которое принимает значение False для выделения единственной строки (этот режим включен по умолчанию) и True — для множественного выделения любого количества групп строк (рис.5.5). Дополнительное логическое свойство ExtendedSelect в сочетании с MultiSelect=True разрешает выделение единственной группы строк (MutiSelect=ExtendedSelect=True).

Рис. 4.5. Слева MultiSelect=False, справа MultiSelect=True

Рис. 4.6. Расположение списков в зависимости от размера окна
Можно упомянуть еще об одном не очень часто используемом свойстве логического типа IntegralHeight (Интегральная Высота). Если установить для него значение True, то система корректирует размер окна на несколько пикселов таким образом, чтобы нижняя строка была видна целиком.
