Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Задание типа переменной по строковому выражению типа  (Прочитано 9410 раз)
0 Пользователей и 1 Гость смотрят эту тему.
direktorSan
Удачи!
Участник

ru
Offline Offline
Пол: Мужской

« : 15-10-2007 15:42 » new

Доброго всем времени суток!

Вот тут задался таким вопросом: а можно ли сделать так, чтобы тип создаваемой при выполнении программы переменной задавался строкой, т.е. несто вроде такой конструкции:

MagicFunc("TButton") * dynBtn = new MagicFunc("TButton")?

Ну или аналогично...

Поясню причину.
Есть форма...
Есть коллекция контролов на ней Components...
Но каждый элемент коллекции - TObject! У которого можно получить имя класса в виде строки!
И хочется сделать нечто вроде такого:

MagicFunc("TButton") * dynBtn = new MagicFunc("TButton");
dynBtn->SetFocus();

Можно задачу видоизменить...
TObject может вернуть TypeInfo, ClassType или можно воспользоваться typeid!

Но как, имея столько информации, решить мою задачу?

Знаю, что есть еще такая коллекция Classes (или как-то аналогично).
Может с ее помощью можно будет что-нибудь придумать!

Заранее спасибо!
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 15-10-2007 16:34 » 

имхо невозможно, а более того - бесполезно... Все классы, которые можно было бы указать в строке, должны существовать -> быть описаны -> уже есть список классов. И простым перебором ищешь соответствующий класс и создаёшь экземпляр
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 15-10-2007 17:39 » 

Можно сделать так:

Код: (C++)
TComponent *newComponent(TComponent *owner, AnsiString className)
{
    if (className == "TButton")
        return new TButton(owner);
    else if (className == "TEdit")
        return new TEdit(owner);
    // .........
}

Динамически изменить создаваемый тип нельзя.
« Последнее редактирование: 15-10-2007 17:41 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nikedeforest
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 17-10-2007 05:58 » 

Короче для подобных целей тебе подойдет  паттерн Фабрика классов. Но, отвечая на вопрос, ты конечно не сможешь сделать тот изврат, какой задумал Улыбаюсь.
Записан

ещё один вопрос ...
direktorSan
Удачи!
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 24-10-2007 15:55 » 

2 nikedeforest
А что такое Фабрика классов?
С чем ее едят? И где доку достать можно?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 24-10-2007 18:21 » 

Прогугли "Паттерны программирования". То что RXL дал тебе, это один из способов фабрики класса.
Вот что говорит wiki http://ru.wikipedia.org/wiki/%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D1%8B_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
zubr
Гость
« Ответ #6 : 25-10-2007 04:12 » 

У Борланда есть еще одна возможность подобного изврата. В процессе компилляции программы получить исходный текст проекта и добавить нужную строку кода. Для этого надо использовать внутренний интефейс TIAddInNotifier и глобальную переменную ToolServices. Хотя все это большой изврат и требуются при очень специфических вещах.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines