Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Определить тип компонента на форме


Автор: _Evrey_ 22.5.2007, 15:23
Проблема в следующем.

Написал перебор всех компонент на форме, и в зависимости от условий в приложении нужно менять заголовки у компонентов.

перебор написал таким образом
Код

 TTntLabel* tmpLabel;
 WideString zn; 
 for(int i=0;i<frm->ComponentCount;i++)
 {
  if(frm->Components[i]->Name.Pos("lb_")>0) // все компоненты типа Label имеют название в начале lb_
  {
   tmpLabel = dynamic_cast<TTntLabel*>( frm->Components[i]); // Эта операция проходит без ошибок
   zn =  tmpLabel->Caption;   // Сдесь программа вылетает с exception-ом (EAccessViolation)
   zn = ((TTntLabel *)frm->Components[i])->Caption; // Сдесь результат тот же программа вылетает с exception-ом (EAccessViolation)
  }

Вопрос можно ли как нибудь проверять тип, объекта перед тем как делать с ним какие нибудь действия?
На форме имеется множество таких объектов и все обрабатываются нормально...
Заранее спасибо.

Автор: SenkraD 22.5.2007, 15:41
_Evrey_, единственное что могу сказать по коду так это то, что всего скорее dynamic_cast возвращает NULL. Более правлиль делать так:
Код

TTntLabel* tmpLabel;    
WideString zn;    
for(int i=0; i<frm->ComponentCount; i++)    
{
    tmpLabel = dynamic_cast<TTntLabel*>( frm->Components[i]);
    if(tmpLabel != NULL)
    {
        zn =  tmpLabel->Caption;
        zn = ((TTntLabel *)frm->Components[i])->Caption;
    }
}


У вас точно на форме лежат TTntLabel, а не обыкновенные или ещё какие-то?
Ещё посмотрите сожет вы какому-то компоненту не верное имя присвоили!

Автор: _Evrey_ 22.5.2007, 15:59
Цитата(SenkraD @  22.5.2007,  15:41 Найти цитируемый пост)
_Evrey_, единственное что могу сказать по коду так это то, что всего скорее dynamic_cast возвращает NULL. Более правлиль делать так:

dynamic_cast точно возвращает не NULL, в отладчике по коду прохожу...

Специально переименовывал компонент на форме, ошибка не меняется (имя передается правельное)...


Автор: Klin 22.5.2007, 22:17
SenkraD, вопрос то определить тип компонента smile Все проще:

Код

 Components[1]->ClassName();


а для дальнейшего использования можно так:

Код

 if (Components[1]->ClassNameIs("TButton"))
  ((TButton*) Components[1])->Click();
 else if (Components[1]->ClassNameIs("TEdit"))
  ((TEdit*) Components[1])->Text = "test";
 else if (Components[1]->ClassNameIs("TLabel"))
  ((TLabel*) Components[1])->Caption = "MyLabel";


или я чего не понимаю? smile

Автор: _Evrey_ 23.5.2007, 05:52
Klin спасибо то что надо smile 
тема закрыта...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)