В других версиях конструктора описание шаблона элемента хранится в отдельном файле по одному на каждый элемент. Если подсчитать количество файлов, которые хранят информацию об одном элементе, то результат получится немаленький. В проекте HiAsm.NET концепция хранения информации другая. Если бы элемент умел говорить, то мог бы сказать: «Всё своё ношу с собой». К тому же, сборка может служить контейнером нескольким элементам сразу. Получается, что новая концепция сокращает количество файлов пакета примерно на порядок величины. Не забудем ещё отметить, что решена задача локализации элемента под любые национальные языки. Давайте рассмотрим подробнее, что позволило достигнуть такого результата.
Описание шаблона элемента взяли на себя атрибуты. В C# разрешается вводить в код информацию декларативного характера в форме атрибута, с помощью которого определяются дополнительные сведения (метаданные), связанные с классом, структурой, методом и т.д. Атрибуты указываются в квадратных скобках перед тем элементом, к которому они применяются. Следовательно, атрибут не является членом класса, но обозначает дополнительную информацию, присоединяемую к элементу.
В .NET атрибуты представляют собой типы классов, которые расширяют абстрактный базовый класс System.Attribute. В поставляемых в .NET пространствах имен доступно множество предопределенных атрибутов, которые полезно применять в своём коде. Более того, можно также создавать собственные атрибуты и тем самым дополнительно уточнять поведение своих типов, создавая для атрибута новый тип, унаследованный от Attribute. В проекте HiAsm.NET была использована эта возможность. Теперь разработчик имеет в своём распоряжении следующий список атрибутов для описания метаданных своего элемента:
Название | Тип | Описание |
About | Hiasm.AboutAttribute | Атрибут описания версии элемента и его разработчика |
Install | Hiasm.InstallAttribute | Атрибут добавления элемента к пакету и группе на панели инструментов |
Type | Hiasm.TypeAttribute | Атрибут описания класса элемента и метаданных для отображения в конструкторе |
Edit | Hiasm.EditAttribute | Атрибут метаданных для отображения элемента в редакторе формы |
Widget | Hiasm.WidgetAttribute | Атрибут описания виджета элемента |
Handlers | Hiasm.HandlersAttribute | Атрибут метаданных редактора пользовательских свойств элемента |
Assembly | Hiasm.AssemblyAttribute | Атрибут метаданных сторонних сборок связанных с элементом |
Property | Hiasm.PropertyAttribute | Атрибут описания свойств элемента |
Point | Hiasm.PointAttribute | Атрибут описания точек элемента |

Атрибут About элемента не имеет дополнительных полей. Вся информация задаётся как аргументы конструктора

Атрибут Install элемента может содержать дополнительное поле lang:
Название | Тип | Описание |
lang | System.String | Определяет локализацию описания двухбуквенным языковым кодом. Указывается после аргументов конструктора |
Поле являются необязательным. Значение по умолчанию для поля null.
[Install("_base", "Simple demo", "Core")]
[Install("_base", "Простой пример", "Core", lang = "ru")]
Примеры атрибутов для установки элемента в различные пакеты:
[Install("delphi", "Simple demo", "Core")]
[Install("CNET", "Simple demo", "Core")]

Атрибут Type описания элемента может содержать дополнительные поля:
Название | Тип | Описание |
lang | System.String | Определяет локализацию описания двухбуквенным языковым кодом. Указывается после аргументов конструктора |
tab | System.String | Задаёт имя вкладки на панели инструментов |
group | System.String | Задаёт имя группы на вкладке панели инструментов |
category | System.String | Задаёт имя категории на панели инструментов редактора формы, если данный элемент должен на ней отображаться |
inherit | System.String | Задаёт имя наследуемого класса |
interfaces | System.String | Задаёт список интерфейсов, реализуемых данным элементом |
icon | System.String | Задаёт имя свойства элемента, значение которого определяет иконку элемента в редакторе схемы |
sub | System.String | Задаёт имя класса элемента, помещаемого внутрь элемента-контейнера при его создании |
view | System.String | Задаёт информацию для отображения на элементе в редакторе схемы |
flags | HiAsm.ElementFlag | Задаёт специальные флаги элемента |
Все дополнительные поля являются необязательными. Значение по умолчанию для полей типа System.String будет null. При использовании поля lang можно указывать его сразу после аргументов конструктора и без имени поля:
[Type("Example", "Say Hello World!", tab = "Core")]
[Type("Example", "Сказать Привет Мир!", "ru", tab = "Core")]
[Type("Example", "Sag Hallo Welt!", "de", tab = "Core")]
Примеры атрибутов для описания элемента различных классов:
[Type("HCImageList", "Collection of Images", tab = "Componets", category = "Componets", interfaces = "ImageList")]
[Type("HCTplListView", "Display a list of items", tab = "Controls", group = "Common", category = "Common", inherit = "TplWinControl")]
[Type("HCMath", "Math operations", tab = "Logic", view = "OpType,8")]
[Type("HCConvertor", "Casting and type conversions", tab = "Logic", icon = "Mode")]
[Type("HCChildTabControl", "Container of TabPage controls", tab = "Controls", group = "Containers", category = "Containers", sub = "HCTplTabControl", flags = ElementFlag.IS_MULTI)]

Атрибут Edit имеет следующие поля:
Название | Тип | Описание |
Class | System.String | Определяет имя класса для отображения элемента в редакторе формы |
pro | System.Boolean | Задаёт значение, определяющее необходимость редактирования элемента в дизайнере формы |
list | System.String[] | Определяет список строк как пары Ключ=Значение для сопоставления имён свойств элемента со свойствами виджета в редакторе формы |
Все поля являются необязательными. Значение по умолчанию для полей типа System.String будет null, для типа System.Boolean - false.
Примеры атрибутов Edit:
[Edit(Class = "System.Windows.Forms.Button", pro = true)]
[Edit("FlatStyle=Flat", "TextAlign=Alignment", Class = "System.Windows.Forms.Label")]

Атрибут Widget имеет следующие поля:
Название | Тип | Описание |
assembly | System.String | Определяет информацию об используемой в элементе сторонней сборке |
type | System.String | Задаёт имя используемого типа в сторонней сборке |
Все поля являются необязательными. Значение по умолчанию для полей типа System.String будет null
Пример атрибута Widget:
[Widget(assembly = "System.Windows.Forms.dll", type = "System.Windows.Forms.Panel")]

Атрибут Handlers имеет поле list:
Название | Тип | Описание |
list | System.String[] | Определяет список строк как пары Ключ=Значение для сопоставления имён свойств элемента с именами пользовательских редакторов |
Все поля являются необязательными. Значение по умолчанию для полей типа System.String будет null, для типа System.Boolean - false.
Пример атрибута Handlers:
[Handlers("HandlerName=PropreryName", "HandlerName2=PropreryName2")]

Атрибут Assembly имеет поле list:
Название | Тип | Описание |
list | System.String[] | Определяет список строк как пары Ключ=Значение для указания имени сторонней сборки и используемого типа |
Пример атрибута Assembly:
[Assembly("System.Windows.Forms.dll=System.Windows.Forms.Panel", "ColorPicker.dll=Sano.PersonalProjects.ColorPicker.Controls.ColorPanel")]

Элемент может иметь свойства различных типов. Для каждого типа в конструкторе реализован свой редактор. Разработчику важно знать какие свойства он может использовать при разработке своего элемента:

Название | Тип | Описание |
data_int | System.Int32 | Целое число |
data_str | System.String | Строка символов в кодировке UTF8 |
data_data | HiAsm.TData | Комплексный тип, способный задать значение четырёх типов: data_int, data_str, data_real и data_null |
data_combo | System.Int32 | Задаёт индекс значения в фиксированном списке строк |
data_list | System.String | Задаёт список строк |
data_data_icon | System.Drawing.Icon | Картинка в формате иконки Windows |
data_real | System.Double | Действительное число двойной точности |
data_color | System.Int32 | Задаёт цвет |
data_script | System.String | Используется для установки кода сценария |
data_stream | System.IO.MemoryStream | Используется для установки бинарных данных |
data_bitmap | System.Drawing.Bitmap | Картинка в формате Bitmap |
data_wave | System.IO.MemoryStream | Используется для установки звуковых данных в Wave формате |
data_array | HiAsm.ArrayValue | Комплексный тип, способный задать значение массива различных типов |
data_comboEx | System.String | Задаёт строковое значение из фиксированного списка строк |
data_font | HiAsm.FontRecord | Комплексный тип, используемый для установки шрифта |
data_jpeg | System.IO.MemoryStream | Используется для установки картинки в Jpeg формате |
data_code | System.String | Используется для установки кода сценария |
data_element | System.String | Используется для установки ссылки на другие элементы схемы |
data_flags | System.Int32 | Задаёт значение отдельных битов |
data_object | HiAsm.ObjectRecord | Комплексный тип, способный задать значение различных типов |
data_time | System.DateTime | Используется для установки даты и времени |
data_bool | System.Boolean | Используется для установки логичекого значения True или False |
data_long | System.Int64 | 64-битное целое число |
data_char | System.Char | Используется для установки символьного значения |
data_float | System.Single | Действительное число одинарной точности |
data_decimal | System.Decimal | Задаёт десятичное число |
data_component | HiAsm.ObjectRecord | Используется для установки значения типа IComponent |

Кроме обязательных аргументов конструктора атрибута Property можно использовать другие поля, определяющие дополнительные установки для свойства элемента:
Название | Тип | Описание |
lang | System.String | Определяет локализацию описания двухбуквенным языковым кодом. Указывается после аргументов конструктора |
group | System.String | Задаёт имя группы свойств для отображения в редакторе свойств элемента |
value | System.String | Задаёт строкой значение свойства по умолчанию |
list | System.String | Задаёт строкой фиксированный список возможных значений свойства. В качестве разделителя используется символ запятой |
doubleopen | System.Boolean | Указывает на единственное свойство элемента, которое будет открываться на редактирование при двойном клике мышью на элементе |
makemethod | System.Boolean | Разрешает создание на элементе точки для изменения значения свойства во время выполнения |
readOnly | System.Boolean | Указывает, что свойство в редакторе доступно только для чтения |
visible | System.Boolean | Задаёт значение, определяющее видимость свойства в редакторе элемента |
editor | System.Type | Задаёт тип редактора свойства |
converter | System.Type | Задаёт тип конвертора для свойства |
Все дополнительные поля являются необязательными. Значение по умолчанию для полей типа System.String будет null, для типа System.Boolean - false, кроме поля visible для которого значение по умолчанию true. При использовании поля lang можно указывать его сразу после аргументов конструктора и без имени поля:
[Property("Greeting", "The greeting message", DataType.data_str)]
[Property("Greeting", "Приветствие", DataType.data_str, "ru")]
Примеры атрибутов для создания свойств элемента различных типов:
[Property("Name", "Brief description. ARG(Int32)", DataType.data_int, makemethod = true, value = "123")]
[Property("Name", "Brief description. ARG(Double)", DataType.data_real, value = "3.1415926")]
[Property("Name", "Brief description. ARG(Boolean)", DataType.data_bool, group = "Group name", value = "true")]
[Property("Name", "Brief description. ARG(DateTime)", DataType.data_time, value = "01/01/1753")]
[Property("Name", "Brief description. ARG(Color)", DataType.data_color, value = "Transparent")]
[Property("Name", "Brief description. ARG(LeftRightAlignment)", DataType.data_comboEx, value = "0", list = "Left,Right")]
[Property("Name", "Brief description. ARG(ImageList)", DataType.data_array, value = "System.Drawing.Bitmap", readOnly = true)]
[Property("Name", "Brief description. ARG(Size)", DataType.data_object, value = "System.Drawing.Size", list = "{'Width':16,'Height':16}")]

Список полей, используемых при создании точки элемента:
Название | Тип | Описание |
lang | System.String | Определяет локализацию описания двухбуквенным языковым кодом. Указывается после аргументов конструктора |
hidden | System.Boolean | Задаёт значение, определяющее видимость точки элемента по умолчанию |
index | System.String | Задаёт имя свойства элемента, значение которого определяет постфикс для модификатора имени точки |
Все дополнительные поля являются необязательными. Значение по умолчанию для полей типа System.String будет null. При использовании поля lang можно указывать его сразу после аргументов конструктора и без имени поля:
[Point("doSayHello", "Returns greeting message", DataType.data_str, PointType.pt_work)]
[Point("doSayHello", "Возвращает приветствие", DataType.data_str, PointType.pt_work, "ru")]
Пример атрибута для создания точки элемента с использованием дополнительных полей:
[Point("Name", "Brief description. ARG()", DataType.data_null, PointType.pt_work, "ru", hidden = true, index = "PropertyName")]