Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определить тип компонента на форме, Если имеется указатель Components[i] 
V
    Опции темы
_Evrey_
Дата 22.5.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 7.2.2007

Репутация: нет
Всего: нет



Проблема в следующем.

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

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

 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)
  }

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

PM MAIL   Вверх
SenkraD
Дата 22.5.2007, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 9
Всего: 23



_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, а не обыкновенные или ещё какие-то?
Ещё посмотрите сожет вы какому-то компоненту не верное имя присвоили!

Это сообщение отредактировал(а) SenkraD - 22.5.2007, 15:43


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
_Evrey_
Дата 22.5.2007, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 7.2.2007

Репутация: нет
Всего: нет



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

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

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


PM MAIL   Вверх
Klin
Дата 22.5.2007, 22:17 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



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


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
_Evrey_
Дата 23.5.2007, 05:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 7.2.2007

Репутация: нет
Всего: нет



Klin спасибо то что надо smile 
тема закрыта...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0842 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.