Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Управление объектами, Массив объектов 
:(
    Опции темы
Wapo
  Дата 31.1.2005, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня возникла следуящая проблема. На форме очень много компонентов TEdit имеющие имена Edit1, Edit2 ... Edit N. При каждой загрузке формы нужно заполнить их. Писать вручную очень долго и не очень красиво. Как можно организовать обращение к компонентам в цикле.

Это сообщение отредактировал(а) Wapo - 31.1.2005, 18:13
PM MAIL   Вверх
Vyacheslav
Дата 31.1.2005, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Обратиться то в цикле можно, только как в цикле будешь изменять то, чем их заполнить надо smile


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
NiJazz
Дата 1.2.2005, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

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



Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   ShortString     clName = "TEdit";
   for (int i=0; i < ComponentCount-1; i++)
   {
       if (clName.operator AnsiString() == Components[i]->ClassName().operator AnsiString())
       {
           //Нужно привести Components[i] к TEdit и вызвать метод
       }
   }
}

Вопрос к знатокам: как привести к TEdit?

PM MAIL   Вверх
Vyacheslav
Дата 1.2.2005, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Ой какой кошмар . Пoпроще нельзя? Это же С++
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   for (int i  = ComponentCount; i--;)
  {
      if (TEdit* Edit = dymamic_cast<TEdit*>(Components[i]) )
      {
          Edit->...
      }
  }
}



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Vyacheslav
Дата 1.2.2005, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Кстати. Зачем использовать явно слючевое слово operator .
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  AnsiString  clName = "TEdit";
  for (int i=0; i < ComponentCount; i++)
  {
      if (clName == Components[i]->ClassName())
      {
            //Нужно привести Components[i] к TEdit и вызвать метод
            ((TEdit*)Components[i])->...
      }
  }
}



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Adil'
Дата 1.2.2005, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хочу дополнить - оба кода будут работать, только если у Edit'oв Owner'ом Form1 является (хотя обычно так и бывает
smile ).

З.Ы. Vyacheslav за что жы так над for'ом глумишься? Я даже с первого захода не понял как оно работает smile
З.З.Ы. dynamic_cast



--------------------
Удачи
PM MAIL WWW   Вверх
NiJazz
Дата 1.2.2005, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

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



Код

if (TEdit* Edit = dymamic_cast<TEdit*>(Components[i]) )

Это он будет приводить все компоненты подряд?
Код

if (clName == Components[i]->ClassName())

Тут он выдавал ошибку.
PM MAIL   Вверх
Vyacheslav
Дата 1.2.2005, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



1) Он будет пытаться приводить все компоненты. Если это не удается, то Edit'у будет привоен NULL
2) Обрати внимание: у меня AnsiString clName = "TEdit";


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
azesmcar
Дата 1.2.2005, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Vyacheslav

clName == Components[i]->ClassName() работать не станет потому что типа ShortString а clName AnsiString..нету такого оператора сравнивания...

И зачем делать dynamic_cast??? Для dynamic_cast тебе нужно будет включить в проект RTTI (Run Time Type Information)..не очень весело...по моему так лучше...

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 ShortString clName = "TEdit";
 for (int i=0; i < ComponentCount; i++)
 {
     if (clName == Components[i]->ClassName())
     {
         (static_cast<TEdit*>(Components[i]))->Text = "Some Text";
     }
 }
}

Добавлено @ 13:50
У AnsiString -а есть оператор сравнивания, но какой в этом смысл??? обяви сразу ShortString и покончь с делом...
PM   Вверх
Vyacheslav
Дата 1.2.2005, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(azesmcar @ 1.2.2005, 13:49)
Vyacheslav

clName == Components[i]->ClassName() работать не станет потому что типа ShortString а clName AnsiString..нету такого оператора сравнивания...

И зачем делать dynamic_cast??? Для dynamic_cast тебе нужно будет включить в проект RTTI (Run Time Type Information)..не очень весело...по моему так лучше...

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 ShortString clName = "TEdit";
 for (int i=0; i < ComponentCount; i++)
 {
     if (clName == Components[i]->ClassName())
     {
         (static_cast<TEdit*>(Components[i]))->Text = "Some Text";
     }
 }
}

Добавлено @ 13:50
У AnsiString -а есть оператор сравнивания, но какой в этом смысл??? обяви сразу ShortString и покончь с делом...

1) Это работает по правилам С++ .
Если не веришь, проверь хотя бы в тупую код. А после этого может быть найдешь объясненние. Если не найдешь, я объясню
А вот ShortString оператора сравнения нет, поэтому твой код работать не будет

2) А ты пробовал собрать программу с использованием VCL без RTTI. Или ты думаешь, что ClassName обходится без RTTI?
Тогда внимательно прочитай help про TObject
Цитата

TObject encapsulates fundamental behavior common to VCL objects by introducing methods that

respond when object instances are created or destroyed.
return class-type and instance information on an object and runtime type information (RTTI) about its published properties.
support message handling.







--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
azesmcar
Дата 1.2.2005, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата
2) А ты пробовал собрать программу с использованием VCL без RTTI. Или ты думаешь, что ClassName обходится без RTTI?
пробовал и собирал!

Код

ShortString clName = "TEdit";


можно просто заменить на

Код

String clName = "TEdit";

У меня билдера нету, так на память помнил что вроде бы так...вот так точно работает...
Вот и все, а прочесывать всю иерархию для всех обьектов dynamic_cast -ом нахожу нецелеобразным...если обьяснишь почему вышеупомянутое правильно и обоснуешь я с тобой соглашусь...dynamic_cast довольно сильно замедляет программу, в данном случае он бессмысленен, если можно проверить тип перед кастингом...а насчет RTTI я уже сказал..Пробовал, собирал, работает...
PM   Вверх
Vyacheslav
Дата 1.2.2005, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата

пробовал и собирал!

Ну-ну smile

Цитата

Код

ShortString clName = "TEdit";


можно просто заменить на

Код

String clName = "TEdit";


Ну-ну. String, говоришь?
Загляни- ка в symac.h. Это ни о чем не говорит? smile
Код

typedef  AnsiString           String;        


Цитата

У меня билдера нету, так на память помнил что вроде бы так...вот так точно работает...
Вот и все, а прочесывать всю иерархию для всех обьектов dynamic_cast -ом нахожу нецелеобразным...если обьяснишь почему вышеупомянутое правильно и обоснуешь я с тобой соглашусь...dynamic_cast довольно сильно замедляет программу, в данном случае он бессмысленен, если можно проверить тип перед кастингом...а насчет RTTI я уже сказал..Пробовал, собирал, работает...

Я не собираюсь выводить тебя из твоего сладкого заблужения о возможности исключить RTTI из VCL. Только вот прежде чем делать такие заявления, надо хотя бы иметь основания
А в реалиях имеем следущее
Вот этот код без использования VCL
Код

class A {
public:
   virtual func() {std::cout << "A"<< std::endl; }
};

class B : public A {
public:
   func() {std::cout << "B"<< std::endl; }

};
#pragma argsused
int main(int argc, char* argv[])
{
   B b;
   A* pa = &b;
   if (B* pb = dynamic_cast<B*>(pa))
   {
     std::cout << "RTII enabled" << std::endl;
     pb->func();
   }
   else
     std::cout << "RTII disbled" << std::endl;
   return 0;
}

При попытке отрубить RTTI не откомпилируется с выдачей ошибки и будет совершенно прав
Цитата

E2318 'A' is not a polymorphic class type Compiler error

Для этого достаточно в опциях отключить флажок Enable RTTI или в параметра ком. строки добавить -RT-
А вот этот код с VCL
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
for (int i=0; i < ComponentCount; i++)
{
    if (TEdit* Edit = dynamic_cast<TEdit*>(Components[i]))
    {
        ShowMessage(Edit->Name);
    }
}
   
}

будет спокойно собираться и работать в любом случае: будешь ли ставить галочку или не будешь, будешь добавлять -RT- или нет. То есть если подключен VCL компилятору глубоко наплевать какие опции там стоят, ибо VCL без RTTI работать не способен и к VCLу по крайней мере его RTTI будет подключен обязательно
А насчет использовать, или не использовать. Напиши мне пожайлуста код, который у всех Controlo'v на форме поменяет цвет. Или хотя бы представь, что кроме TEdit, на форме есть еще TMyEdit, TEditEX, котрые порождены от TCustomEdit и у всех у них нужно очитстить Text


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Adil'
Дата 1.2.2005, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Попробовать собрать VCL-ную прогу с отключенным RTTI можно, да вот только при этом RTTI у VCL не отключится smile
бо как все оно от TObject идет, и к нему и приходит, а он, родной, объявлен как DELPHICLASS, а значит и он сам, и наследники его автоматом RTTI поддерживают. Так что отключение RTTI в опциях проекта влияет только на "пользовательские" классы, которые без __rtti объявлены.

А кто больше замедляет программу - dynamic_cast или сравнение строк с вызовом виртуальных функций еще проверить надо, хотя я процентов на 90 уверен, что первое - быстрее.

Цитата(azesmcar @ 1.2.2005, 17:06)
можно просто заменить на

А где-то в хэдерах билдера есть такое typedef AnsiString String;

Добавлено @ 18:15
О, пока расписывал, Vyacheslav уже отповедь выдал smile


--------------------
Удачи
PM MAIL WWW   Вверх
Vyacheslav
Дата 1.2.2005, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(Adil @ 1.2.2005, 18:12)
Так что отключение RTTI в опциях проекта влияет только на "пользовательские" классы, которые без __rtti объявлены.


Совершенно верно. И dynamic_cast для VCL классов будет работать в любом случае. А раз тащить его все равно приходится, то грех не воспользоваться


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
azesmcar
Дата 2.2.2005, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата
Напиши мне пожайлуста код, который у всех Controlo'v на форме поменяет цвет. Или хотя бы представь, что кроме TEdit, на форме есть еще TMyEdit, TEditEX, котрые порождены от TCustomEdit и у всех у них нужно очитстить Text


Пожалуйста

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
String clName = "TEdit";
for (int i=0; i < ComponentCount; i++)
{
    if (clName == Components[i]->ClassName())
    {
        (static_cast<TCustomEdit*>(Components[i]))->Text = "";
    }
}
}


Цитата
Ну-ну. String, говоришь?
Загляни- ка в symac.h. Это ни о чем не говорит?

Код 

typedef  AnsiString          String;     


Боже мой???!!! Неужели это то же самое??? Какой ужас???
А если так написать??? smile
#define String AnsiString

Надо же, ты гений!!! smile

А можно например вот так написать
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
String clName = "TEdit";
for (int i=0; i < ComponentCount; i++)
{
    if (clName == Components[i]->ClassName())
    {
        const TCustomEdit* t = static_cast<TCustomEdit*>(Components[i]);
        TCustomEdit* p = const_cast<TCustomEdit*>(t);
        p->Text = "";
    }
}
}


Все равно в VCL это все уже есть, почему бы не попользоваться?? Грех! Ну разве что потому что медленее...чуточку..а dynamic_cast не очень то чуточку...я не спорю, я предлагаю вариант...

А насчет RTTI не знаю, никогда не интересовался конструкцией VCL, я в GUI не люблю работать...
Знаю только что пробовал, а вот отключил он или не отключил понятия не имею...
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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