Russian Belarusian English German Japanese Ukrainian

Rashka.studio - игры и приложения для Android! Заходи, ждём тебя =)

ListBox, CheckListBox, ValueListEditor, ComboBox и ComboBoxEx - выбор из списка

CuBook35

Компоненты ListBox и CheckListBox
Компоненты ListBox и CheckListBox отображают списки строк и позволяют пользователю выбрать в них нужную строку. Основное свойство обоих компонентов, содержащее список строк Items, имеющий тип TStrings. Заполнить его во время проектирования можно, нажав кнопку с многоточием около этого свойства в окне Инспектора Объектов. Во время выполнения работать с этим свойством можно, пользуясь свойствами и методами класса TStrings Clear, Add и другими. Этот же класс позволяет поставить в соответствие каждой строке некоторый объект. Тогда выбор пользователем строки в списке можно программно соотносить с этим объектом.
 
В компоненте ListBox имеется свойство MultiSelect, разрешающее пользователю множественный выбор в списке, то пользователь может выбрать только один элемент списка. В этом случае можно узнать индекс выбранной строки из свойства ItemIndex, доступного только во время выполнения. Если ни одна строка не выбрана, то ItemIndex = -1.
 
Например, следующий код проверяет выбор пользователя. Если выбор не сделан, появляется сообщение «Вы не сделали свой выбор». Если один из элементов списка выбран, то появляется сообщение вида «Ваш выбор ...: ...», где вместо первого многоточия отображается номер выбранной строки, а вместо второго многоточия - текст выбранной строки:
if(ListBox1->ItemIndex < 0)
ShowMessage("Вы не сделали свой выбор");
else ShowMessage("Ваш выбор " + IntToStr(ListBox1->ItemIndex + 1) + ": " + ListBox1->Items->Strings[ListBox1->ItemIndex]);
Начальное значение ItemIndex невозможно задать во время проектирования. По умолчанию ItemIndex = -1. Это означает, что ни один элемент списка не выбран. Если вы хотите задать этому свойству какое-то другое значение, т.е. установить выбор по умолчанию, который будет показан в момент начала работы приложения, то сделать это можно, например, в обработчике события OnCreate формы, введя в него оператор вида:
ListBox1->ItemIndex = 0;
Если допускается множественный выбор (MultiSelect = true), то значение ItemIndex соответствует тому элементу списка, который находится в фокусе. При множественном выборе можно проверить, выбран ли данный элемент, по свойству Selected[int Index] типа bool. Например, следующий код отображает сообщения вида "Выбрана строка ...: ..." (похожие на предыдущий пример) обо всех выбранных строках:
for(int i=0; i < ListBox1->Items->Count; i++)
if(ListBox1->Selected[i])
ShowMessage("Выбрана строка " + IntToStr (i+1) + ": " + ListBox1->Items->Strings[i]):
На способ множественного выбора при MultiSelect = true влияет еще свойство ExtendcdSelect. Если ExtendedSelect = true, то пользователь может выделить интервал элементов, выделив один из них, затем нажав клавишу Shift и переведя курсор к другому элементу. Выделить не прилегающие друг к другу элементы пользователь может, если будет удерживать во время выбора нажатой клавишу Ctrl. Если же ExtendedSelect = false, то клавиши Shift и Ctrl при выборе не работают.
 
Свойство Columns определяет число столбцов, в которых будет отображаться список, если он не помещается целиком в окне компонента ListBox.
Свойство Sorted позволяет упорядочить список по алфавиту. При Sorted = true новые строки в список добавляются не в конец, а по алфавиту.
Свойство AutoComplete, если установить его в true, позволяет пользователю быстро находить строку списка, нажимая клавишу, соответствующую ее первому символу.
Свойство Style, установленное в lbStandard (значение по умолчанию) соответствует списку строк. Другие значения Style позволяют отображать в списке не только текст, но и изображения, а в C++Builder 6 введена возможность создавать виртуальные списки.
 
Значения IbOwnerDrawFixed и lbOwnerDrawVariable используются для занесения в список изображений. При этом IbOwnerDrawFixed означает, что высота всех элементов списка одинакова, а значение lbOwnerDrawVariable означает, что высота элементов может быть различной. Значения lbVirtual и lbVirtualOwnerDraw соответствуют виртуальным спискам соответственно со строками текстов и изображений.
При значении Style, равном IbOwnerDrawFixed или lbOwnerDrawVariable, в момент, когда должна рисоваться какая-то строка списка, наступает событие OnDrawItem.
 
Параметр Control является указателем на список, в котором происходит событие.
Параметр Index указывает индекс элемента, который должен быть перерисован.
Параметр Rect типа TRect указывает область канвы списка, соответствующую рисуемому элементу списка.
Параметр TOwnerDrawState является множеством, элементами которого могут быть значения odSelected - строка выделена, odFocused строка находится в фокусе и ряд других.
В обработчике события OnDrawItem надо методами работы на канве нарисовать изображение элемента.
 
При значении Style равном lbOwnerDrawFixed перед прорисовкой наступает только событие OnDrawItem. При Style = lbOwnerDrawVariable перед этим событием наступает другое - OnMeasureltem, в котором надо указать высоту элемента.
Параметры Control и Index имеют тот же смысл, что и в обработчике OnDrawItem, а значение параметра Height надо задать равным высоте данного элемента списка.
Событие OnData наступает в тот момент, когда приложению надо отобразить очередную строку списка.
Параметр Control - виртуальный список, в котором происходит событие. Параметр Index - это индекс строки, которая должна отображаться. А в параметр Data надо задать отображаемый текст. Например, оператор занесет в строку текст «Строка ...», в котором вместо многоточия будет номер строки:
Data = "Строка " + IntToStr(Index + 1);
Параметр Index указывает индекс строки, а в параметр DataObject заносится связываемый со строкой объект. Параметр FindString - это искомая строка, индекс которой надо вернуть оператором return.
 
Компонент CheckListBox

Имеется еще один компонент, очень похожий на ListBox - это список с индикаторами CheckListBox. Выглядит он так же, как ListBox, но около каждой строки имеется индикатор, который пользователь может переключать. Индикаторы можно переключать и программно, если список используется для вывода данных и необходимо в нем отметить какую-то характеристику каждого объекта, например, наличие товара данного наименования на складе.
 
В C++Builder 6 в CheckListBox появились новые свойства, позволяющие зрительно разбить список на несколько разделов с помощью заголовков. Свойство Header представляет собой индексированный массив булевых значений, определяющих, является ли соответствующая строка заголовком (значение true), или это обычная строка с индикатором (значение false). Свойство Header - только времени выполнения и должно заполняться программно (по умолчанию все значения равны false).
Например, операторы задают в качестве заголовков вторую и десятую строки:
CheckListBox1->Header[1] = true;
CheckListBox1->Header[9] = true;
Заголовки отображаются в строках с цветом фона, определяемым свойством HeaderBackgroundColor, и цветом надписи, задаваемым свойством HeaderColor.
 
Компонент ValueListEditor

Компонент ValueListEditor - это окно редактирования списка строк вида «имя = значение». Окно имеет две колонки с заголовками «Key» для имен и «Value» для значений. Заголовки можно изменить во время проектирования или программно, используя свойство TitleCaptions типа TStrings. Первая строка этого свойства соответствует первой колонке (именам), вторая - второй колонке.
 
Свойство Strings типа TStrings содержит список всех строк. Во время проектирования он может быть заполнен редактором строк, вызываемым из Инспектора Объектов. Во время выполнения пользователь может заполнять его, если в компоненте разрешено редактирование. Можно также программно присвоить свойству Strings содержание некоторого другого списка типа TStrings. Все строки присваиваемого списка должны иметь вид «имя = значение». Тогда содержимое списка отобразится в колонках компонента. Методы класса TStrings позволяют манипулировать списком, добавлять строки, удалять и т.п.
Свойство Keys является индексированным списком имен. Индексы начинаются с 1.
Свойство AnsiString Values[const AnsiString Key] позволяет задать или прочитать значение из строки с именем Key. Если свойство используется для задания значения, а имени Key в списке нет, то в список добавляется новая строка с указанным именем и значением. Если свойство используется для чтения, а имени Key в списке нет, то возвращается пустая строка. Доступ к именам и значениям дают также свойства Strings->Names и Strings->Values (как в обычных списках типа TStrings).
 Еще один способ доступа к элементам строк дает свойство AnsiString Cells[int ACol][int ARow]. В этом свойстве ACol = 0 соответствует колонке имен, a ACol = 1 - колонке значений. ARow = 0 соответствует строке заголовков, a ARow = 0 - строкам списка.
Свойство только для чтения RowCount показывает число строк, включая строку заголовка.
Свойство KeyOptions позволяет определить операции, доступные пользователю при редактировании колонки имен. Это свойство является множеством, пустым или содержащим элементы keyEdit, keyAdd, keyDelete, keyUnique.
 
Элемент keyEdit позволяет пользователю редактировать имена в первой колонке.
Элемент keyAdd позволяет пользователю добавлять в список новые строки, используя клавишу Insert или перемещая курсор клавишей со стрелкой ниже позиции последней строки.
Элемент keyAdd можно включать только вместе с keyEdit.
Элемент keyDelete позволяет пользователю удалять выделенную строку клавишей Delete.
Элемент keyUnique не позволяет пользователю добавить новую строку с именем, уже имеющимся в списке. Такая попытка приводит к генерации исключения.
 
Свойство только времени выполнения ItemProps позволяет управлять способом редактирования пользователем значения каждого из элементов списка. Элемент задается или его именем, или индексом строки (начинаются с 0). Массив ItemProps содержит объекты класса TItemProp, описывающие доступ к соответствующему элементу. Свойства этого класса задают способы редактирования значений:
EditMask Маскированный ввод.
EditStyle Стиль редактирования:
  esSimple Обычное окно редактирования.
  esEllipsis Кнопка с многоточием, при нажатии на которую возникает событие OnEditButtonClick. В обработчике этого события можно предусмотреть вызов какого-то окна специализированного редактора свойства.
  esPickList Выпадающий список, строки которого задаются свойством PickList или в обработчике события OnGetPickList (можно сочетать эти две возможности, задавая список в PickList и модифицируя его в обработчике OnGetPickList).
KeyDesc Имя, появляющееся в строке данного элемента списка в колонке «Key».
MaxLength Максимальное число вводимых символов.
PickList Список типа TStrings, появляющийся в выпадающем списке при значении EditStyle = esPickList.
ReadOnly Только для чтения, редактирование запрещено. Например, сочетание ReadOnly = true и стиля EditStyle, равного esPickList или esEllipsis, не даст пользователю задать значение иначе, как выбрав его из списка или введя с помощью редактора свойства.
Стиль EditStyle = esPickList приводит к тому, что при попытке пользователя редактировать значение он видит кнопку выпадающего списка, из которого он может выбрать соответствующее значение. Если при этом задать ReadOnly = true, то пользователь не сможет изменить значение иначе, чем выбором из списка. В качестве примера приведем операторы, обеспечивающие выбор:
Valedit::TItemProp *ItemProp = ValueListEditor1->ItemProps["Отдел"];
ItemProp->EditStyle = esPickList;
ItemProp->PickList->Add("Управление");
ItemProp->PickList->Add("Цех 1");
ItemProp->PickList->Add("Цех 2") ;
ItemProp->ReadOnly = true;
Стиль EditStyle = esEllipsis приводит к тому, что при попытке пользователя редактировать значение он видит кнопку с многоточием. При нажатии на нее возникает событие OnEditButtonClick. В его обработчике можно, например, вызвать какое-то диалоговое окно, в котором пользователь должен ответить на какие-то вопросы. В результате будет выработано значение, которое занесется в строку списка.
Например:
ValueListEditorl->Values["Должность"] = "Дворник";
Если к тому же задать для этой строки ReadOnly = true, то пользователь не сможет задать значение иначе, чем в результате работы этого диалога.
 
Свойство DisplayOptions является множеством, которое может содержать элементы doColumnTitles - строка заголовка фиксирована (не прокручивается), doKeyColFixed - ширина колонки имен неизменна, doAutoColResize - при изменении ширины компонента ширина колонок автоматически изменяется.
Свойство Options содержит множество опций, управляющих отображением линий таблицы, возможность для пользователя изменять размеры колонок и т.п.
 
Компонент ComboBox

Стиль изображения компонента ComboBox определяется его свойством Style, которое может принимать следующие основные значения:
Значение Описание
csDropDown Выпадающий список со строками одинаковой высоты и с окном редактирования, позволяющим пользователю вводить или редактировать текст.
csSimple Развернутый список со строками одинаковой высоты и с окном редактирования, позволяющим пользователю вводить или редактировать текст. При таком стиле надо делать во время проектирования или программно высоту списка такой, чтобы в нем могло отобразиться требуемое число строк.
csDropDownList Выпадающий список со строками одинаковой высоты, не содержащий окна редактирования.
csOwnerDrawFixed Выпадающий список со строками одинаковой высоты, в которых могут отображаться изображения и текст.
csOwnerDrawVariable Выпадающий список со строками разной высоты, в которых могут отображаться изображения и текст.
При стилях csOwnerDrawFixed и csOwnerDrawVariable изображения рисуются на канве в обработчике события OnDrawItem так же, как это рассказывалось ранее для ListBox. При стиле csOwnerDrawVariable перед рисованием возникает событие OnMeasureItem, в обработчике которого надо задать высоту элемента.
 
Выбор пользователя или введенный им текст можно определить по значению свойства Text. Если же надо определить индекс выбранного пользователем элемента списка, то можно воспользоваться обсуждавшимся в компоненте ListBox свойством ItemIndex. Причем для ComboBox задание начального значения ItemIndex еще актуальнее, чем для ListBox.
 
Если начальное значение не задано, то в момент запуска приложения пользователь не увидит в окне компонента одно из возможных значений списка и, вероятнее всего, не очень поймет, что с этим окном надо делать.
 
Если в окне проводилось редактирование данных, то ItemIndex = -1. По этому признаку можно определить, что редактирование проводилось.
 
Свойство MaxLength определяет максимальное число символов, которые пользователь может ввести в окно редактирования. Если MaxLength = 0, то число вводимых символов не ограничено.
 
Свойство DropDownCount указывает число строк, появляющихся в выпадающем списке без возникновения полосы прокрутки.
 
Как и в компоненте ListBox, свойство Sorted позволяет упорядочить список по алфавиту. При Sorted = true новые строки в список добавляются не в конец, а по алфавиту.
 
Компоненте ComboBoxEx

Компоненте ComboBoxEx во многом подобен ComboBox. Различие, прежде всего, заключается в том, что в ComboBoxEx легче, чем в ComboBox, вводить изображения в элементы списка. С другой стороны, некоторые возможности ComboBox, например, возможность сортировки, в ComboBoxEx не поддерживаются. Невозможно также в этом списке рисование на канве.
 
Изображения, отображаемые в элементах, должны содержаться в компоненте ImageList. Ссылка на этот компонент задается в свойстве Images. Ввод элементов списка во время проектирования осуществляется редактором коллекций, вызываемым щелчком на кнопке с многоточием в окне Инспектора Объектов около свойства ItemsEx. Перед вами откроется окно. Кнопка Add New (левая) позволяет ввести новый элемент. Если вы ввели элемент и выделили его, то в окне Инспектора Объектов увидите его свойства. Основные из них: Caption - текстовая строка, ImageIndex - индекс соответствующей пиктограммы в списке ImageList, Indent - отступ от левого поля элемента списка.
Свойство Style определяет стиль элемента и может быть равным csExDropDown, csExSimple или csExDropDownList. Смысл этих значений подобен рассмотренному выше для компонента ComboBox.
Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Добавить комментарий