Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.19;
Скачать: CL | DM;

Вниз

Разработка компонент: класс как свойство компоненты.   Найти похожие ветки 

 
Влад Утюмов   (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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.02 c
1-60621
lovres
2002-08-08 13:51
2002.08.19
Как вместо окна системного сообщ. вывести своё


3-60550
str
2002-07-27 23:52
2002.08.19
Batchmove & filter


3-60531
realship
2002-07-30 13:45
2002.08.19
Подскажите плиз по Аксессу и SQL


6-60775
Alex-Alexeev
2002-06-06 13:34
2002.08.19
Название сетевое ресурса в локальное имя папки


1-60579
serd_hhc
2002-08-07 06:25
2002.08.19
Нормальный php-файл.