Конференция "Основная" » Создать объект, зная его класс в строковой переменной [D7]
 
  • Алексей92 (23.02.08 18:00) [0]
    Добрый день и с праздником!

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

    Не подскажете?
  • Сергей М. © (23.02.08 18:29) [1]
    Подскажем.
    Для объектов-наследников TComponent (каковым является твой "например"):

    var
     SomeComponentClass: TComponentClass;
     SomeInstanceOfComponnentClass: TComponent;
     
    ..

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

    ..

    implementation
     RegisterClass('TButton');
  • Семеныч (23.02.08 19:59) [2]
    > Алексей92   (23.02.08 18:00)  

    Механизм, который подсказал Сергей, работает не только для компонентов. Он работает для класса TPersistent и всех его потомков, а к ним относятся не только компоненты - к ним же относится TFont, TBrush и многие другие (дерево наследования классов VCL можно посмотреть в Object Browser). Именно этот механизм и используется при загрузке DFM (где все объекты - заведомые потомки TPersistent). А чтобы установить значения свойств по их строковым именам, используется RTTI (см. модуль TypInfo).
  • GrayFace (23.02.08 21:30) [3]
    Это только часть механизма. У формы есть published поля, соответствующие компонентам - для этих полей в RTTI есть название класса и ссылка на класс. Если published поля нет, используется уже GetClass.
    Еще есть FindClass, бросающий исключение, если класс не найден.
 
Конференция "Основная" » Создать объект, зная его класс в строковой переменной [D7]
Есть новые Нет новых   [134483   +44][b:0][p:0]