Эти компоненты обеспечивают выбор из списка и, следовательно, безошибочный ввод информации в тех случаях, когда пользователь должен выбрать ответ из конечного множества альтернатив.
Компоненты ListBox и CheckListBox отображают списки строк и позволяют пользователю выбрать в них нужную строку. Основное свойство обоих компонентов, содержащее список строк, − Items, имеющее тип TStrings. Для заполнения его во время проектирования нужно нажать кнопку с многоточием около этого свойства в окне Инспектора Объектов. Во время выполнения работать с этим свойством можно, пользуясь свойствами и методами класса TStrings − Clear, Add, Delete, Insert и др. Этот же класс позволяет поставить в соответствие каждой строке некоторый объект. Тогда выбор пользователем строки в списке можно программно соотносить с этим объектом.
В ListBox есть свойство MultiSelect, разрешающее пользователю множественный выбор в списке, если установить его в true. Если MultiSelect=false ( значение по умолчанию), то пользователь может выбрать только один элемент списка. Индекс выбранной строки можно узнать из свойства ItemIndex, доступного только во время выполнения. Если ни одна строка не выбрана, то ItemIndex =-1. При MultiSelect=true значение ItemIndex соответствует тому элементу списка, который находится в фокусе. При множественном выборе поиск выбранных элементов осуществляется по свойству Selected[int Index] типа bool. Для множественного выбора необходимо задействовать клавиши Shift (для выделения интервала элементов) и Ctrl, которые будут работать, если свойство ExtendedSelect = true.
Рассмотрим пример использования компонента ListBox, используя в качестве строк строки матрицы.
1. Создайте новый проект и сразу сохраните файл модуля и проект под разными именами в созданной ранее папке.
2. На пустую форму, слева перенесите компонент ListBox1. Свойства ExtendedSelect и MultiSelect установите в true, шрифт − Courier.
3. Справа по вертикали поместите четыре кнопки Button и назовите их так: Очистить, Ввести строки, Удалить одну выделенную строку, Удалить все выделенные строки.
4. В соответствующие обработчики впишите:
для кнопки Очистить:
ListBox1->Items->Clear();
Caption="";
для кнопки Ввести строки:
int n=10,m=10,x[10][10];
void __fastcall TForm1::Button2Click(TObject *Sender)
{
String s[10][10],s1[10];
int i,j;
for(i=0;i<n;i++){
s1[i]="";
for(j=0;j<m;j++){
x[i][j]=random(101)-50;
if(x[i][j]<-9) s[i][j]=" "+IntToStr(x[i][j]);
else if(x[i][j]<0||x[i][j]>9) s[i][j]=" "+IntToStr(x[i][j]);
else s[i][j]=" "+IntToStr(x[i][j]);
s1[i]+=s[i][j];}
ListBox1->Items->Add(s1[i]);
}
ListBox1->ItemIndex=-1;
}
для кнопки Удалить одну выделенную строку:
if(ListBox1->ItemIndex==-1) Caption="Строка не выделена";
else{
Caption="Удалена строка:"+
ListBox1->Items->Strings[ListBox1->ItemIndex];
ListBox1->Items->Delete(ListBox1->ItemIndex);
ListBox1->ItemIndex=-1;}
для кнопки Удалить все выделенные строки:
Caption="";
int i,j=0;
for(i=0;i<ListBox1->Items->Count;i++)
if(ListBox1->Selected[i])j++;
else ListBox1->Items->Strings[i-j]=ListBox1->Items->Strings[i];
for(;j>0;j--)
ListBox1->Items->Delete(ListBox1->Items->Count-1);
ListBox1->ItemIndex=-1;
5. Сохраните проект и выполните приложение. Убедитесь в работоспособности приложения, вводя различное количество строк повторным нажатием кнопки Ввод строк, выделяя и удаляя строки поодиночке и разнообразными группами.
Компонент CheckListBox − это список с индикаторами. Индикаторы позволяют реализовать множественный выбор элементов списка. Рассмотрим пример использования компонента CheckListBox на примере обработки целочисленной матрицы с целью нахождения строк с положительными суммами элементов.
1. Создайте новый проект и сразу сохраните файл модуля и проект под разными именами в созданной ранее папке.
2. На пустой форме поместите: слева − компонент CheckListBox1, а справа, по вертикали, три кнопки − Button1, Button2, Button3. В CheckListBox1 установите шрифт Font − Courier, полужирный. В свойство Caption Button1 занесите очистить, Button2 − ввод матрицы, Button3 − строки с положительными суммами элементов.
3. В обработчики щелчков кнопок соответственно впишите
для Button1:
CheckListBox1->Items->Clear();
Caption="";
для Button2:
int i,j,n=10,m=10,x[10][10];
void __fastcall TForm1::Button2Click(TObject *Sender)
{
String s[10][10],s1[10];
for(i=0;i<n;i++){
s1[i]="";
for(j=0;j<m;j++){
x[i][j]=random(101)-50;
if(x[i][j]<-9) s[i][j]=" "+IntToStr(x[i][j]);
else if(x[i][j]<0||x[i][j]>9) s[i][j]=" "+IntToStr(x[i][j]);
else s[i][j]=" "+IntToStr(x[i][j]);
s1[i]+=s[i][j];}
CheckListBox1->Items->Add(s1[i]); }
}
для Button3:
CheckListBox1->Items->Add("");
int sum,k=0;
for(i=0;i<n;i++){
sum=0;
for(j=0;j<m;j++) sum+=x[i][j];
if(sum>0) {CheckListBox1->Checked[i]=true; k++;}
CheckListBox1->Items->Add("Сумма элементов в строке "+
IntToStr(i)+" равна "+IntToStr(sum));}
Caption="Количество строк с положительными суммами
элементов - "+ IntToStr(k);
4. Сохраните проект и выполните приложение. Убедитесь в работоспособности приложения.
Компонент ValueListEditor − это простой и удобный редактируемый список, содержащий строки вида «имя = значение». Именно этот компонент представляет большинство свойств в окне Инспектора Объектов. Окно компонента имеет две колонки с заголовками «Key» для имен и «Value» для значений. Заголовки можно изменить во время проектирования или программно, используя свойство TitleCaptions типа TStrings. Нажатием на кнопку (три точки) свойства вызывается Редактор строки списка, первая строка которого соответствует именам, вторая − значениям.
Свойство Strings типа TStrings содержит список всех строк. Во время проектирования он может быть заполнен Редактором значения списка, вызываемым кнопкой с тремя точками. Во время выполнения пользователь может заполнять его, если разрешено редактирование (в свойстве KeyOptions подсвойству keyEdit присвоено значение true). Методы класса TStrings позволяют присвоить свойству Strings другой список, манипулировать списком (добавлять строки, удалять и т.п.).
Свойство Keys является индексированным списком имен. Индексы начинаются с единицы. Свойство AnsiString Values[const AnsiString Key] позволяет задать или прочитать значение из строки с именем Key. Если свойство используется для задания значения, а имени Key в списке нет, то в список добавляется новая строка с указанным именем и значением. Если свойство используется для чтения, а имени Key в списке нет, то возвращается пустая строка.
Доступ к именам и значениям дают также свойства Strings->Names и Strings->Values (как в обычных списках типа TStrings).
Еще один способ доступа к элементам строк дает свойство AnsiString Cells[int ACol][int ARow], причем ACol =0 соответствует колонке имен, ACol= 1 − колонке значений, ARow =0 соответствует строке заголовков, а ARow >0 − строкам списка.
Свойство только для чтения RowCount показывает число строк, включая строку заголовка.
Свойство KeyOptions определяет операции, доступные пользователю при редактировании колонки имен. Это свойство является множеством, пустым (значения всех подсвойств равны false) или содержащим элементы (подсвойства) keyEdit, keyAdd, keyDelete, keyUnique ( теперь значения их − true). Элемент keyEdit позволяет редактировать имена в первой колонке. Элемент keyAdd позволяет добавлять в список новые строки, используя клавишу Insert или перемещая курсор клавишей со стрелкой ниже позиции последней строки. Элемент keyAdd можно включать только вместе с keyEdit. Элемент keyDelete позволяет удалять выделенную строку клавишей Delete. Элемент keyUnique не позволяет добавить новую строку с именем, уже имеющимся в списке.
Свойство только времени выполнения ItemProps позволяет управлять способом редактирования значения каждого из элементов списка. Элемент задается или его именем, или индексом строки (начинаются с нуля).
Свойство DisplayOptions является множеством, которое может содержать элементы doColumnTitles − строка заголовка фиксирована (не прокручивается), doKeyColFixed − ширина колонки имен неизменна, doAutoColResize − при изменении ширины компонента ширина колонок автоматически изменяется.
Свойство Options содержит множество опций, управляющих отображением линий таблицы, а также возможность для пользователя изменять размеры колонок и т.п.
Рассмотрим пример использования компонента ValueListEditor, взяв в качестве имен строки матрицы, а значений − суммы элементов по строкам.
1. Создайте новый проект и сразу сохраните файл модуля и проект под разными именами в созданной ранее папке.
2. На форме поместите: слева − компонент ValueListEditor1, под ним − компонент Memo1; справа по вертикали, вдоль правой границы формы – компоненты Button1, Button2, LabeledEdit1, Button3.
3. Для Button1 в Caption занесите очистить, а в обработчик щелчка
ValueListEditor1->Strings->Clear();
Caption="";
Memo1->Clear();
4. Для Button2 в Caption занесите ПУСК, а в обработчик щелчка
int i,j,n=10,m=10,x[10][10],f;
void __fastcall TForm1::Button2Click(TObject *Sender)
{
f=0;
Memo1->Clear();
Memo1->Lines->Add("СООБЩЕНИЯ");
int sum[10];
AnsiString s[10][10],s1[10];
for(i=0;i<n;i++){
s1[i]=""; sum[i]=0;
for(j=0;j<m;j++){
x[i][j]=random(101)-50;
sum[i]+=x[i][j];
if(x[i][j]<-9) s[i][j]=" "+IntToStr(x[i][j]);
else if(x[i][j]<0||x[i][j]>9) s[i][j]=" "+IntToStr(x[i][j]);
else s[i][j]=" "+IntToStr(x[i][j]);
s1[i]+=s[i][j];}
ValueListEditor1->Values[s1[i]]=sum[i]; }
Caption= " 1-я строка " + ValueListEditor1->Strings->Names[0]+
" сумма = "+ValueListEditor1->Strings->Values
[ValueListEditor1->Strings->Names[0]];
Memo1->Lines->Add("Введено "+IntToStr(ValueListEditor1->RowCount-1)
+" строк");
LabeledEdit1->SetFocus();
}
5. Для LabeledEdit1 в свойство Text занесите 1, в подсвойство Caption свойства EditLabel − номер удаляемой строки.
6. Для Button3 в Caption занесите удаление строки, а в обработчик −
int d=StrToInt(LabeledEdit1->Text);
if(f==1){Memo1->Lines->Add("Список пуст!");return;}
if(d > ValueListEditor1->RowCount-1)
Memo1->Lines->Add(IntToStr(d)+ "-й строки нет!");
else {Memo1->Lines->Add("Удалена " + IntToStr(d) + "-я строка");
Memo1->Lines->Add(ValueListEditor1->Cells[0][d]+ " " +
ValueListEditor1->Cells[1][d]);
if(ValueListEditor1->RowCount==2)f=1;
ValueListEditor1->Strings->Delete(d-1);
if(d==1&&f==1)Memo1->Lines->Add("Список пуст!");}
Memo1->Lines->Add("Осталось "+
IntToStr(ValueListEditor1->RowCount-1)+" строк");
LabeledEdit1->SetFocus();
7. В компоненте ValueListEditor1 перечисляемым свойствам присвойте следующие значения: DisplayOptions − все подсвойства в true, Font − Courier, полужирный, KeyOptions − подсвойство keyUnique − false, остальные − true, TitleCaptions − кнопкой с тремя точками вызвать окно Редактора строки списка и занести в первую строку через 10 пробелов − строки, во вторую строку через три пробела − суммы в строках. После первого запуска приложения установить ширину окна и границу между колонками строки и суммы в строках так, чтобы строки матрицы и суммы были видны полностью.
8. В компоненте Memo1 установить шрифт Font − Courier, полужирный. Ширину окна Memo1 установить равной ширине окна компонента ValueListEditor1.
9. Сохраните проект и выполните приложение. Убедитесь в работоспособности приложения, заполняя список разным количеством строк, удаляя и редактируя строки.