nik |
Отправлено: 31.10.2005, 14:40 |
|
Не зарегистрирован
|
Hi, All!
При программировании задачи с БД возникла необходимость динамически создавать VCL-объекты заранее (на этапе компиляции) неизвестного типа (есть только строка с именем типа). Все возможные типы описаны в программе, но выбор конкретного должен определяться строкой с его именем. Как это можно сделать? Чувствую RTTI мне поможет, но как непонятно: RTTI дает возможность узнать тип объекта, если на него есть только указатель void*, а вот как создать такой объект, передав RTTI наименование типа, что-то типа void* p = new RTTI_Create( varTypeName )?
Хочется вместе с объектом в БД хранить данные, позволяющие вызывать нужное диалоговое окно для редактирования этого объекта, например наименование типа "TfmTovarEdit" (упрощенное описание).
Заранее спасибо! |
|
** Zoth |
Отправлено: 31.10.2005, 15:09 |
|
Не зарегистрирован
|
Писать тут лень, если хочешь то стучись в аску 191852314 расскажу как я это делал... или на мыл ildarSFH@mail.ru |
|
Asher |
Отправлено: 31.10.2005, 16:13 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Привет.
Примитивный вариант:
заводишь map в котором лежит строковое имя класса и соответствующий ему уникальный индекс.
По этому индексу делается switch с кучей case внутри которых создается нужный тебе объект.
Нормальный вариант:
заводишь map в котором лежит строковое имя класса и указатель на функцию создающую объект требуемого типа.
Недостаток в том, что надо возвращать объект приведенный к какому-либо общему типу.
Подробности смотри в А.Александреску "Современное проектирование на C++".
Скачать можно здесь Anatolix, но лучше купить. Стоит ~200р, но книга однозначно must have
|
|
nik |
Отправлено: 31.10.2005, 16:28 |
|
Не зарегистрирован
|
Спасибо!
Про я case'ы я уже подумывал, искал способ без них, хотя ничего сложного и нет.
С возвратом к общему типу проблем нет — создаваться будут наследники TForm, так что все ok. |
|
|