Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];

Вниз

Создать объект, зная его класс в строковой переменной   Найти похожие ветки 

 
Алексей92   (2008-02-23 18:00) [0]

Добрый день и с праздником!

Хочу написать следующее:
Creator(sTypeObj:string;slPropObj:stringlist):tObject;
т.е. примерно то, что делает делфи при чтении dfm
например
Creator("TButton";slASL) должно сделать кнопку с параметрами из slASL.
Могу, написать конечно:
if  sTypeObj="TButton" then
begin
:=tButton.Create(self);
длина=
ширина=
end
и т.д., но мне кажется это не правильно, должен быть способ какой-то..

Не подскажете?


 
Сергей М. ©   (2008-02-23 18:29) [1]

Подскажем.
Для объектов-наследников TComponent (каковым является твой "например"):

var
 SomeComponentClass: TComponentClass;
 SomeInstanceOfComponnentClass: TComponent;
 
..

 SomeComponentClass := GetClass("TButton");
 SomeInstanceOfComponnentClass := SomeComponentClass.Create(владелец);

..

implementation
 RegisterClass("TButton");


 
Семеныч   (2008-02-23 19:59) [2]

> Алексей92   (23.02.08 18:00)  

Механизм, который подсказал Сергей, работает не только для компонентов. Он работает для класса TPersistent и всех его потомков, а к ним относятся не только компоненты - к ним же относится TFont, TBrush и многие другие (дерево наследования классов VCL можно посмотреть в Object Browser). Именно этот механизм и используется при загрузке DFM (где все объекты - заведомые потомки TPersistent). А чтобы установить значения свойств по их строковым именам, используется RTTI (см. модуль TypInfo).


 
GrayFace   (2008-02-23 21:30) [3]

Это только часть механизма. У формы есть published поля, соответствующие компонентам - для этих полей в RTTI есть название класса и ссылка на класс. Если published поля нет, используется уже GetClass.
Еще есть FindClass, бросающий исключение, если класс не найден.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.005 c
15-1223818673
Eraser
2008-10-12 17:37
2008.12.14
Как обойти баг в Delphi XML Documentation?


2-1225990509
cruiser
2008-11-06 19:55
2008.12.14
MessageDlg и иконки


2-1225795599
Петр
2008-11-04 13:46
2008.12.14
Виртуальный LPT


2-1225724398
Vova1995
2008-11-03 17:59
2008.12.14
ListBox


2-1225996359
Nucer
2008-11-06 21:32
2008.12.14
Запись в реестр (Vista)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский