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