Головна »»» C++ Builder

Перелічування компонентів форми с++ builder dynamic_cast

Масив компонентів

У класа TForm є дві властивості, які можуть бути використані для перелічування компонентів форми. Властивість ComponentCount - властивість тільки для читання і містить в собі кількість компонентів на формі. Ця властивість містить в собі кількість компонентів, переміщених на форму під час розробки, а також візуальні та не візуальні компоненти створені під час виконання програми. 

Властивість Components являється властивісттю-масивом. Даний масив містить список вказівників на клас TComponent, який являється базовим класом для всіх компонентів. Даний вказівник можна привести до будь-якого потрібного типу для доступу до необхідних методів даного компоненту.

Пелічення компонентів форми 

Компонети форми можуть бути перелічені за допомогою звичайного циклу for:

Memo1->Clear(); 
for(int i = 0; i < ComponentCount; i++) 
{ 
 Memo1->Lines->Add(Components[i]->Name); 
} 

Даний код виведе у Memo1 імена усіх компонентів, що містить форма.

Потрібно пам'ятати, що динамічно створені компоненти будуть мати порожнє значення властивості Name, якщо ця властивість не була явно задана при створенні компонента:

TLabel* label = new TLabel(this); 
label->Top = 100; 
label->Left = 100; 
label->Parent = this; 
label->Caption = "Some text"; 

В даному прикладі вказівник this вказує на поточну форму.

Приведення вказівника до TComponent

Неправильним способом приведення являється спосіб в стилі C, а саме:

for(int i = 0; i < ComponentCount; i++) 
 ((TEdit*)Components[i])->Text = ""; 

Цей код буде працювати лише в тому випадку, коли усі компоненти, що містяться на формі будуть являтися екземплярами класу TEdit.

Правильним способом являється спосіб приведення вказівників за допомогою оператора dynamic_cast. Даний оператор поверне вказівник на об'єкт, якщо приведення можливе, або нуль в противному випадку. Розглянемо приклад очистки тексту в усіх компонентах TEdit на формі:

for(int i = 0; i < ComponentCount; i++) 
{ 
 TEdit* Edit; 
 Edit= dynamic_cast<TEdit*>(Components[i]); 
 if(Edit) 
 Edit->Text = ""; 
} 

Кожен компонент форми приводиться до типу TEdit, якщо приведення успішне тоді ми можемо використати вказівник Edit для задання властивості Text значення порожнього рядка.

В циклі можна використовувати декілька операторів dynamic_cast, наприклад:

for(int i = 0; i < ComponentCount; i++) 
{ 
 TEdit* Edit = dynamic_cast<TEdit*>(Components[i]); 
 if(Edit) 
 Edit->Text = ""; 
 TLabel* Label = dynamic_cast<TLabel*>(Components[i]); 
 if(Label) 
 Label->Font->Style = TFontStyles() << fsBold; 
} 

Даний код очищує вмістиме компонентів TEdit, та змінює стиль шрифта для компонентів TLabel. Всі інші компоненти ігноруються.

Використання оператора dynamic_cast для приведення вказівників з масиву Components дає повний контроль над елементами форми!

 
27.12.2013
3011 переглядів