Форум: "Основная";
Текущий архив: 2002.08.19;
Скачать: [xml.tar.bz2];
ВнизРазработка компонент: класс как свойство компоненты. Найти похожие ветки
← →
Влад Утюмов (2002-08-05 17:56) [0]Звучит бредово, но хочется, чтобы значение свойства выбиралось из числа существующих в проекте классов.
Для чего надо: компонент должен ументь создовать несколько экземпляров одной и той же формы. Какя это будет форма - неизвестно заранее.
Естественно свойство не может хранить класс как таковой - язык то статический. Пробовал через rtti - не понял как получить список классов и как создать объект по classid.
Теоретически можно и без rtti. Объявим некий класс TClassCollection, методы которого позволяют получать список имен класса, добавлять классы в коллекцию и создавать экземпляры по идентификатору. Естественно, коллекция хранит не сами классы, а некие объекты - "фабрики класса". Эти фабрики программист не поленится и напишет вместе с формой. Геморроя на самом деле не много, особенно если писать на С++, там шаблоны есть.
Проблема остается другая - как сделать, чтобы регистрация классов в коллекции происходила в design-time? Тут мне явно нехватает понимания того, как работает IDE.
Может быть существует обходной путь? Проблема осложняется тем, что я не могу создать MDI child и не показать его. IDE громко и недвусмысленно ругается при попытке установить Visible = false. Поэтому я немогу использовать передавать в компоненту экземпляр класса.
Буду благодарен за любые идеи на эту тему.
Влад.
← →
Skier (2002-08-05 18:01) [1]>Влад Утюмов
> как создать объект по classid.
А в чём была проблема ?
← →
Ученик (2002-08-05 18:16) [2]Может такой компонент уже есть:
File-New-Other-Закладка c именем проекта ?
← →
PVOzerski (2002-08-05 18:41) [3]Есть же метаклассы
type
tClassID=class of tMyObject;
...
tMyClass=class
public
ClassId:tClassID;
Obj:tMyObject;
....
MyClass.ClassID:=tMyObject2;
MyClass.Obj:=Obj.ClassId.Create;
Особенно окупает себя, IMHO, в сочетании с использованием виртуальных конструкторов. Советую также посмотреть Help по tClass и, кстати, tObject - там есть весьма полезные поля.
← →
Юрий Зотов (2002-08-05 22:57) [4]Ясно, что если класс зарегистрирован, то GetClass в редакторе свойства решает все вопросы. Стало быть, проблема действительно сводится к тому, чтобы регистрация классов происходила в design-time. А это можно сделать, написав эксперт IDE.
И тогда не нужны никакие фабрики классов. Более того, если речь идет только о классах форм, то не нужен даже и собственный список (коллекция) классов. Поскольку такой список IDE формирует сама (создавая репозиторий текущего проекта), а эксперт может получить к нему доступ.
Я бы присоветовал скачать эксперт CFPack с сайта Сергея Орлика
( http://www.geocities.com/SiliconValley/Way/9006/index_r.html) и заглянуть в его исходники - там решается близкая задача.
← →
Влад Утюмов (2002-08-06 08:12) [5]Большое спасибо всем за ответы.
Посмотрев исходники и описание Сергея Орлика уловил для себя кое-какие полезные идеи, поправте если ошибаюсь:
Процедура Register(), объявленная в _любом_ модуле выполняется IDE автоматически после компиляции этого модуля, без запуска приложения. Поэтому ее можно использовать для передачи в IDE и компоненты любой информации о классе.
Утилиты CFPack позволят мне получить список зарегистрированных классов и метакласс выбранного класса.
Остается ерунда - по метаклассу создать объект. А дальше меня не пускают ограничения C++ по сравнению с Паскалем. Виртуальных конструкторов в С++ не бывает, конструкции типа type tClassID=class of tMyObject; и MyClass.Obj:=Obj.ClassId.Create; никак не вписываются в синтаксис С++, даже если точки заменить на ->.
Мораль - не заниматься ерундой, а переходить с С++ Builder на Delphi.
← →
Толик (2002-08-06 17:56) [6]2 Влад Утюмов (06.08.02 08:12)
Не надо обижать Билды, нет там ни каких ограничений по сравнению с Делфёй! Аналог class of там называется TMetaClass, по поводу виртуальных конструкторов можно почитать, например, «Язык программирования С++» Бьёрна Страуструпа, там всё подробно и с примерами показано. В двух словах - это ф-я, по своему параметру создающая объект дочернего класса и возвращающая указатель на базовый.
PS
Если Вы не знаете, как делать то или иное, не надо называть это "ограничениями языка".
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.08.19;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c