Страницы

Поиск по вопросам

четверг, 23 января 2020 г.

Динамическое создание элементов Delphi

#delphi


Имеется XML в котором описан интерфейс, например


    



можно ли на его основе создать интерфейс (я знаю, что можно)
без использования if\case 
т.е не 

if типЭлемента='toolbar' then element := TToolbar.Create(владелец) 
else if типЭлемента='button' then element := TButton.Create(владелец)


а более универсальный метод ?! 
    


Ответы

Ответ 1



Можно завести свой массив соответствий имен классам по типу: lookup: array of record xmlName: string; // имя контрола, как в xml ctrlClass: TControlClass; // тип класса, (type TControlClass = class of TControl;) end; в котором прописать соответствия: xmlName ctrlClass --------------------- 'button' TButton 'toolbar' TToolbar и потом при обработке XML находить по строке нужный тип класса в lookup и вызывать его конструктор var someObject: TControl; begin for i := 0 to High(lookup) do if SameText(lookup[i].xmlName, aName) then someObject := lookup[i].ctrlClass.Create(..параметры..);

Ответ 2



Вам нужно задать соответствие между именами тегов в XML и именами классов в Delphi. Вариантов куча. Один Вам подсказали - таблица соответствия (кстати, рекомендую использовать не массив, а TDictionary<> - будет значительно быстрее). если у Вас типы отличаются только отсутствием буквы Т - использовать функцию FindClassили GetClass myObject = TComponentClass(FindClass('T' + TagName)).Create; можно объявить свои классы-наследники базовых с нужными именами и зарегистрировать их при помощи функции RegisterClass() или RegisterClasses() Button = class(TButton); Toolbar = class(TToolbar); ........ RegisterClasses([Button, Toolbar]); А потом работать с тем ще FindClass myObject = TComponentClass(FindClass(TagName)).Create; перед загрузкой XML натравить на него XSL преобразование, которое заменит теги на нужные, или даже, сформирует из него стандартный dfm который можно будет обработать при помощи TStream.ReadComponent()

Комментариев нет:

Отправить комментарий