Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.006 c
1-60633
ttt
2002-08-08 15:10
2002.08.19
Как динамически добавить фрейм на форму?


14-60847
MJH
2002-07-18 03:15
2002.08.19
Закон о тишине


1-60694
Дельфятник
2002-08-06 12:31
2002.08.19
Ещё один вопрос по очистке TList a.


1-60737
Smok_er
2002-08-07 11:18
2002.08.19
XP and TToolBar


1-60739
Leny
2002-08-07 12:52
2002.08.19
Поверх всех окон





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский