Шаг 42 - Компонент TCheckBoxList.

В общем-то аналогичен компоненту TListBox, с отличием, что перед элементами отображаются галочки, позволяющие отметить или снять отметку с элемента списка. Свойство Items класса TString одинаково во всех подобных компонентах. Методы его типчны. Свойство ItemIndex содержит индекс выбранного (выделенного) элемента. Свойство типа boolean array (по простому массив логических значений) Checked содержит информацию о том, какие помечены, а какие нет.

Я один примерчик придумал, связанный с этим компонентом. У формы есть такое свойство, даже два. Это Components[] и ComponentCount. Собственно, эти свойства не совсем относятся к форме, эти свойства унаследованы от класса TComponent, являющегося прародителем всех компонентных классов.

Так вот. Свойство Components[] содержит указатели типа TComponent на все объекты, которыми владеет форма. Свойство ComponentCount содержит количество этих самых компонентов. О праве владения мы говорили в прошлом шаге. Таким образом можно получить доступ ко всем компонентам во время выполнения программы.

Следующая программа заносит во время создания формы все имена компонентов в CheckBoxList. При снятии пометки соответствующий компонент пропадает. При восстановлении пометки появляется на прошлом месте. Чтобы не загромождать программу, я взял компоненты только типов TLabel, TButton, TPanel. Хотя в принципе можно проверку выполнять для любых типов.

Для проверки типов используется метод ClassNameIs, унаследованный от TObject. Это boolean метод с аргументом-строкой - именем класса.

Форму для "полигона" я сделал такую:

gif/42_1.gif (3482 b)

Кода писать много не понадобится.

void __fastcall TForm1::FormCreate(TObject *Sender)
{
	for(int i=0;i<ComponentCount;i++)
	{
		TComponent* cmp=Components[i];
		CheckListBox1->Items->Add(cmp->Name);
		CheckListBox1->Checked[i]=true;
	};
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckListBox1Click(TObject *Sender)
{
	bool checked=CheckListBox1->Checked[CheckListBox1->ItemIndex];
	TComponent* cmp=Components[CheckListBox1->ItemIndex];
	if(cmp->ClassNameIs("TLabel")) ((TLabel*)cmp)->Visible=checked;
	if(cmp->ClassNameIs("TButton")) ((TButton*)cmp)->Visible=checked;
	if(cmp->ClassNameIs("TPanel")) ((TPanel*)cmp)->Visible=checked;
}
//---------------------------------------------------------------------------

Запускайте и любуйтесь. Правда, если снимете флажок с компонента класса, не входящего в вышеперечисленные, ничего не будет. Если хотите, можете добавлять свои типы.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Аванесов Самвел - 10.12.2001