#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()
Комментариев нет:
Отправить комментарий