
- •Многострочные окна редактирования Memo и RichEdit
- •Индикаторы CheckBox
- •Компоненты выбора из списков — ListBox,CheckListBox,ValueListEditor,ComboBox,ComboBoxEx
- •Void __fastcall tForm1::ListBox1Click(tObject *Sender)
- •Void __fastcall tForm1::ListBox1Click(tObject *Sender)
- •Void __fastcall tForm1::ListBox1DrawItem(tWinControl *Control, int Index, tRect &Rect, tOwnerDrawState State)
- •ValueListEditor
- •Void __fastcall tForm1::BitBtn1Click(tObject *Sender)
Void __fastcall tForm1::ListBox1Click(tObject *Sender)
{
if(ListBox1->ItemIndex<0)
ShowMessage("Выбор не сделан");
else ShowMessage("Выбрана запись "+
IntToStr(ListBox1->ItemIndex)+": "+
ListBox1->Items->Strings[ListBox1->ItemIndex]);
}
По умолчанию начальное значение ItemIndex=-1.Что говорит о том, что ни один элемент списка не выбран. Начальное значениеItemIndex можно задать во время разработки программы. Например,
ListBox1->ItemIndex=5;
Если допускается множественный выбор (MultiSelect=true),то значение ItemIndex соответствует тому элементу списка, который находится в фокусе. При множественном выборе можно проверить, выбран ли данный элемент, по свойству Selected[int Index] типа bool. Например, следующий код отображает сообщения вида "Выбрана строка ...: ..." (похожие на предыдущий пример) обо всех выбранных строках:
Void __fastcall tForm1::ListBox1Click(tObject *Sender)
{
for(int i=0; i<ListBox1->Items->Count;i++)
if(ListBox1->Selected[i])
ShowMessage("Выбрана запись "+
IntToStr(i+1)+": "+
ListBox1->Items->Strings[i]);
}
На способ множественного выбора при MultiSelect=true влияет еще свойство ExtendedSelect. Если ExtendedSelect=true, то выделить интервал элементов, можно удерживая клавишу Shift переводя курсор по элементам. Выделить не прилегающие друг к другу элементы можно, если удерживать во время выбора клавишу Ctrl. Если ExtendedSelect=false, то клавиши Shift и Ctrl при выборе не работают.
Свойство Columns определяет число столбцов, в которых будет отображаться список если он не помещается целиком в окне компонента ListBox .
Свойство Sorted позволяет упорядочить список по алфавиту. При Sorted=true строки в список добавляются не в конец, а по алфавиту.
Свойство AutoComplete, если установить его в true, позволяет пользователю быстро находить строку списка, нажимая клавишу, соответствующую ее первому символу.
В списке можно отображать не только строки, но и изображения. Свойство Style, установленное вlbStandard (значение по умолчанию) соответствует списку строк. Другие значенияStyle позволяют отображать изображения.
Значение lbOwnerDrawFixed иlbOwnerDrawVariable используются для занесения в список изображений. При этомlbOwnerDrawFixed означает, что высота всех элементов списка одинакова, а значениеIbOwnerDrawVariable означает, что высота всех элементов может быть различной.
При значении Style, равномlbOwnerDrawFixedилиIbOwnerDrawVariable, в момент когда должна рисоваться какая-то строка списка, наступает событиеOnDrawItem. Заголовок обработчика этого события имеет вид:
Void __fastcall tForm1::ListBox1DrawItem(tWinControl *Control, int Index, tRect &Rect, tOwnerDrawState State)
{
}
CheckListBox
Имеется
еще один очень похожий на ListBox
- это список с индикаторами CheckListBox,
который расположен на вкладке Edditional.
Выглядит он так же, как ListBox, но около каждой строки имеется индикатор, который пользователь может переключать. Индикаторы можно переключать и программно, если список используется для вывода данных и необходимо в нем отметить какую-то характеристику каждого объекта, например, наличие товара данного наименования на складе.
Состояния индикаторов определяют два свойства: State и Checked. Оба эти свойства можно рассматривать как индексированные массивы, каждый элемент которого соответствует индексу строки. Общее количество элементов определяется свойством Count (только для чтения). Поскольку индексы начинаются с 0, то индекс последнего элемента равен Count -1
Свойства State и Checked можно устанавливать программно или читать, определяя установки пользователя. Например, операторы
CheckListBox1->Checked[1]=true;
CheckListBox1->State[2]=cbGrayed;
устанавливают индикатор второй строки списка CheckListBoxl в состояние выбранного, а индикатор третьей строки - в промежуточное состояние ( отсчет строк начинается с 0). Оператор
for(int i=0; i<CheckListBox1->Items->Count; i++)
if(CheckListBox1->Checked[i])
…
проверяет состояние всех индикаторов списка, и для выбранных пользователем строк осуществляет какие-то действия (в приведенном операторе на месте этих действий поставлено многоточие).
В качестве примера применения компонента рассмотрим создание редактора экзаменационной ведомости.
Поместим на форму компоненты CheckListBoxиRichEdit
В конструктор формы внесем код, позволяющий загрузить список группы в CheckListBox:
CheckListBox1->Items->LoadFromFile("C:\\Список.txt");
В компоненте CheckListBoxимеется событиеOnClickCheck,возникающее при каждом изменении состояния индикатора. Поэтому после каждого изменения можно переписывать всю ведомость.
RichEdit1->Clear();
RichEdit1->Paragraph->Alignment=taCenter; /* выравнивание по центру */
RichEdit1->SelAttributes->Style=
RichEdit1->SelAttributes->Style<<fsBold;
RichEdit1->Lines->Add("Экзаменационная ведомость");
RichEdit1->Lines->Add("");
RichEdit1->Paragraph->Alignment=taLeftJustify;
for(int i=0; i<CheckListBox1->Items->Count; i++)
if(CheckListBox1->Checked[i])
RichEdit1->Lines->Add(CheckListBox1->Items->Strings[i]);
В результате получаем список, в который входят только указанные в CheckListBoxфамилии.