Андрей |
Отправлено: 06.04.2005, 09:48 |
|
Не зарегистрирован
|
Гм. Помогите пожалуйста с такой заморочкой.
Есть два обьекта разных классов, описывающих древовидную структуру.
TglCheckTreeView — VCL GlobusLib
и
TLMDTreeComboBox — LMD Tools
Заморочка состоит в том, что мне надо пробежать по дереву каждого компонента, составляя запрос в базу, в зависимости от выбора чеков в деревьях этих обьектов. Формирование запроса абсолютно эквивалентно. Вот пришло в голову создать что-то типа
AnsiString MakeQuery(TObject *Sender)
{
Вот тут и главная заморочка.
Я могу получить имя сласса
typeid(*Sender). name() типа const char*,
но как преобразовать Sender к типу, от которого мне изветсно только имя??
dynamic_cast????????*>(Sender)
Так как мне потом надо пройти по
for(int i=0;i<(dynamic_cast??????*>(Sender))->Items->Count;i++)
{
}
} |
|
Rius |
Отправлено: 06.04.2005, 10:23 |
|
Мастер участка
Группа: Участник
Сообщений: 321
|
Что-нибудь типа этого (хоть и криво):
CODE | if(Sender->ClassName() == "TglCheckTreeView")
{
TglCheckTreeView *tree = (TglCheckTreeView *)Sender;
...
}
if(Sender->ClassName() == "TLMDTreeComboBox")
{
TLMDTreeComboBox *tree = (TLMDTreeComboBox *)Sender;
...
} |
|
|
Guest |
Отправлено: 06.04.2005, 10:25 |
|
Не зарегистрирован
|
Перекрытые функции
или ветвление (различные варианты)
if (class_name == "class1") ...
else ... |
|
Андрей |
Отправлено: 06.04.2005, 12:08 |
|
Не зарегистрирован
|
Вот этого ветвления и хочеться избежать, так как циклы for () придется выполнять отдельно ДЛЯ каждого if() {}
Вот как получить тип, имея его имя??
|
|
AVC |
Отправлено: 06.04.2005, 12:54 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE (Андрей @ 06/04/2005, 11:08) | Вот этого ветвления и хочеться избежать, так как циклы for () придется выполнять отдельно ДЛЯ каждого if() {}
Вот как получить тип, имея его имя?? |
Что имеется ввиду под словом тип?
Изначально неверная постановка вопроса если имя класса становится известным только во время выполнения, так как методы можно применять либо к общему предку, либо ветвить (можно обойтись одной функцией), либо к данному классу (перекрытые функции). По моему мнению последнее — самое то, если нет общего предка.
Если под словом тип вы имеете ввиду экземпляр класса то вам поможет dynamic_cast.
А если вам надо сгенерировать функцию в зависимости от параметров проекта — тогда шаблон. |
|
Asher |
Отправлено: 06.04.2005, 13:21 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Нормальным решением будет шаблонная функция содержащая цикл и
конструкция if...else ( как в ответе у Guest'а)для приведения Sender к требуемому типу и вызова шаблонной функции.
|
|
Андрей |
Отправлено: 06.04.2005, 13:28 |
|
Не зарегистрирован
|
Ну да. Это наверное будет шаблон. Я не так давно занимаюсь с С++ и не использовал шаблоны еще. Можно кратенький пример или ссылку на подробную доку по созданию и использованию?
А что такое — перекрытие функции?? Сорри за глупый вопрос. Можн опример?? Ветвление меня не устраивает, так как код получаеться ОЧЕНЬ большим только для одного ветвления, а если их штук 5 то это совсем не удобно.
Общая идея была такая
AnsiString MyQuery(T*Sender)
{
AnsiString Query;
for(int i=0;i<(dynamic_cast(Sender))->Items->Count;i++)
{
где OltT — тип, передаваемый в Sender
typeid(*Sender). name() --- вот тут и проблема, как получить OldT для dynamic_cast<>()???
if((dynamic_cast(Sender))->Items->Checked)
{
Query+="Всякая байда";
}
}
return Query;
}
Вот только Sender — Разные классы с общим предком TWinControl
|
|