Шаг 22 - Компоненты TListBox, TComboBox

Эти компоненты очень похожи. И тот, и другой представляют собой списочные кмпоненты. Первый - простой список без возможности редактирования. Второй - комбинированный список с областью ввода. Я думаю, будет достаточно на примере рассмотреть только один из них, чтобы получить представление об обоих.

Как пример возьмем приложение, генерирующее случайную спецификацию название машины по списку названий, цветов и годов выпуска. Форма подойдет такая:

gif/22_1.gif (4642 b)

Я здесь вид немного приукрасил с помощью панели, рассмотренной в предыдущем шаге. На правой панели - это не TEdit с TListBox'ом (хотя по дествию нет никакой разницы), а TComboBox с установленным Style=csSimple. Для трех кнопок "Добавить" установлен один обработчик - AddClick.

Ко мне пришло одно письмо, в котором автор, в принципе справедливо, осудил мой выбор TList вместо STL'овского vector. Ради интереса в листинге будет использован vector.

#include <vector.h>
TForm1 *Form1;
using namespace std;
vector<TComboBox*> cmbv(0);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
randomize();
cmbv.push_back(CarName);
cmbv.push_back(CarColor);
cmbv.push_back(CarYear);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::AddClick(TObject *Sender)
{
TComponent* snd=(TComponent*)Sender;
cmbv[snd->Tag]->Items->Add(cmbv[snd->Tag]->Text);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RandomSeed(TObject *Sender)
{
ResultCar->Text=
  CarName->Items->Strings[random(CarName->Items->Count)]+" "
          +
  CarColor->Items->Strings[random(CarColor->Items->Count)]+" "
          +
  CarYear->Items->Strings[random(CarYear->Items->Count)]+" year";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::LikeIt(TObject *Sender)
{
ResultCar->Items->Add(ResultCar->Text);
}

Теперь обсудим логику. Для сокращения кода в начале программы создается вектор указателей на ComboBox1, ComboBox2, ComboBox3. Чтобы должным образом реагировал обработчик Add, кнопкам "Добавить" свойству Tag присвоены последовательно значения 0, 1, 2. Но это так, маленькая оптимизация. Теперь, при нажатии RandomSeed при помощи генератора случайных чисел (кстати, перезапущенного в начале) выбирается элемент и выводится в список ResultCar. Если что, машину можно добавить в список кнопкой LikeIt.

В свойства Items, редактор которого открывается двойным щелчком, я ввел несколько вариантов, чтобы было, из чего выбирать. Вот что мне моя программа выдала:

gif/22_2.gif (1656 b)

Полезные свойства у TListBox:

Поскольку TListBox и TComboBox не прямые потомки, то некоторые свойства не совпадают. Напрмиер, в TComboBox нет MultiSelect, ExtendedSelect, Selected, TopIndex. Зато есть такие свойства:

Рассмотрели много свойств, по-моему, неплохой пример был. В общем, хорошо :). В следующем шаге будет рассмотрен компонент TActionList.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Аванесов Самвел - 12.11.2001