![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создать объект, зная его класс в строковой переменной [D7]
Алексей92 © (2008-02-23 18:00:00)Добрый день и с праздником!
Хочу написать следующее:
Creator(sTypeObj:string;slPropObj:stringlist):tObject;
т.е. примерно то, что делает делфи при чтении dfm
например
Creator('TButton';slASL) должно сделать кнопку с параметрами из slASL.
Могу, написать конечно:
if sTypeObj='TButton' then
begin
:=tButton.Create(self);
длина=
ширина=
end
и т.д., но мне кажется это не правильно, должен быть способ какой-то..
Не подскажете?
GrayFace (2008-02-23 21:30:00) [1]Это только часть механизма. У формы есть published поля, соответствующие компонентам - для этих полей в RTTI есть название класса и ссылка на класс. Если published поля нет, используется уже GetClass.
Еще есть FindClass, бросающий исключение, если класс не найден.
Семеныч (2008-02-23 19:59:00) [2]> Алексей92 (23.02.08 18:00)
Механизм, который подсказал Сергей, работает не только для компонентов. Он работает для класса TPersistent и всех его потомков, а к ним относятся не только компоненты - к ним же относится TFont, TBrush и многие другие (дерево наследования классов VCL можно посмотреть в Object Browser). Именно этот механизм и используется при загрузке DFM (где все объекты - заведомые потомки TPersistent). А чтобы установить значения свойств по их строковым именам, используется RTTI (см. модуль TypInfo).
Сергей М. (2008-02-23 18:29:00) [3]Подскажем.
Для объектов-наследников TComponent (каковым является твой "например"):
var
SomeComponentClass: TComponentClass;
SomeInstanceOfComponnentClass: TComponent;
..
SomeComponentClass := GetClass('TButton');
SomeInstanceOfComponnentClass := SomeComponentClass.Create(владелец);
..
implementation
RegisterClass('TButton');