Вверх ↑
Этот топик читают: smg, Гость
Главный модератор
Ответов: 2997
Рейтинг: 395
#1: 2019-10-14 19:08:03 ЛС | профиль | цитата
Эта тема создана для возможных разработчиков элементов проекта HiAsm.NET. Это предполагает, что Вы разработчик программного обеспечения на каком-либо языке и не обязательно высокого уровня, а также уже создавали программы в HiAsm какой-либо версии. Очень помог бы Ваш опыт разработки элементов для других пакетов, но это также не обязательно. Для разработки полноценного элемента понадобится инструмент в виде программы Visual Studio, начиная с версии 2010 года. Если у Вас возникли трудности с установкой, то поищите в интернете информацию по этому вопросу. Например, вот - первая обнаруженная ссылка на данную тему на не очень русском языке, но вполне "понимабельная".

  Предположим, что Вы установили инструмент разработки, собственно конструктор программ HiAsm.NET и готовы создать новый элемент для пакета Core. Следуя традиции, сначала элемент будет очень простым, но постепенно будем добавлять в него функционал до максимально возможного уровня, достигнутого на сегодня.

Создание проекта нового элемента

  Для создания проекта нового элемента надо правильно выбрать его тип:

Внимание! Важные пункты выбора типа помечены жёлтым маркером на картинке.
Примерно вот так будет выглядеть экран, если Вы установите VS2017, выберете темную тему и английский язык:

Добавление ссылок на другие сборки

  Чтобы «разговаривать» с конструктором на одном языке, элементу надо указать где находятся две сборки конструктора, в которых хранится код классов общения со средой. Воспользуемся панелью обозревателя решения (Solution Explorer) и укажем на файлы конструктора MSDK.dll и ProxyDomain.dll в папке C:\HiAsm.NET\:





Теперь Visual Studio будет нам подсказывать на какие буковки на клавиатуре давить пальцем . Эта функциональность называется IntelliSense. Для сборок конструктора устанавливаем свойство CopyLocal значением False, чтобы в момент компиляции Visual Studio не копировала эти файлы никуда.

В заключении наведём порядок среди ссылок на сборки при помощи контекстного меню, вызываемого правой кнопкой мыши на самих ссылках, чтобы удалить ненужные нам сейчас и напротив добавить одну нужную системную сборку System.Drawing.dll:

Вот так окончательно должен выглядеть почищенный список:

Для эстетической завершенности переименуем класс из бездушного названия в понятное только нам :


Bingo
Установка атрибутов

  Теперь надо установить обязательные атрибуты, чтобы проект HiAsm.NET признал элемент и прочитал из него необходимую информацию для взаимодействия с ним. Прежде всего это жестко определённое пространство имён (namespace):
using HiAsm;
...
namespace ElementVirtual
{
...
}
Если пространство имён будет названо по-другому среда не признает сборку как контейнер элемента пакета. Отмечу, что сборкой будем называть, полученный после компиляции проекта файл с расширением .dll, который будет содержать в себе код одного или нескольких элементов.

Информационный атрибут с почтой автора и версией элемента:
...
namespace ElementVirtual
{
[About(version = "1.0", author = "Developer Name", mail = "developer@mail.net")]
...
}
Атрибут с информацией об элементе:
...
namespace ElementVirtual
{
...
[Type("Example", "Brief description", tab = "Core")]
...
}
Этим атрибутом задаётся имя класса, краткое описание и группа в панели инструментов.

Теперь, после выбора имени класса элемента, зададим атрибут с информацией об иконке элемента:
...
namespace ElementVirtual
{
...
[ToolboxBitmap(typeof(Example), "Resources.picture.ico")]
...
}
Позднее добавим иконку с именем picture.ico в ресурсы сборки.

Определим элементу свойтво с именем Greeting:
...
namespace ElementVirtual
{
...
[Property("Greeting", "The greeting message", DataType.data_str)]
...
}
Кроме имени здесь определяем краткое описание свойства и его тип. Про тип пока отметим, что это строка текста. Полный список типов будет позже.

Определим элементу левую точку с именем doSayHello:
...
namespace ElementVirtual
{
...
[Point("doSayHello", "Do greeting message", DataType.data_str, PointType.pt_work)]
...
}
Слева направо задаются имя точки, краткое описание, тип данных, принимаемых точкой, место расположения точки на элементе. У точки могут быть только 4-ре места расположения на элементе:
    pt_work - левая точка;
    pt_event - правая точка;
    pt_var - нижняя точка;
    pt_data - верхняя точка;

Аналогично добавим элементу по одной точке на каждую сторону:
...
namespace ElementVirtual
{
...
[Point("onGreeting", "Returns greeting message", DataType.data_str, PointType.pt_event)]
[Point("Greeting", "Returns greeting message", DataType.data_str, PointType.pt_var)]
[Point("Data", "Defines greeting message", DataType.data_str, PointType.pt_data)]
...
}

Посмотрим как это выглядит суммарно:
...
namespace ElementVirtual
{
[About(version = "1.0", author = "Developer Name", mail = "developer@mail.net")]
[Type("Example", "Brief description", tab = "Core")]
[ToolboxBitmap(typeof(Example), "Resources.picture.ico")]
[Property("Greeting", "The greeting message", DataType.data_str)]
[Point("doSayHello", "Do greeting message", DataType.data_str, PointType.pt_work)]
[Point("onGreeting", "Returns greeting message", DataType.data_str, PointType.pt_event)]
[Point("Greeting", "Returns greeting message", DataType.data_str, PointType.pt_var)]
[Point("Data", "Defines greeting message", DataType.data_str, PointType.pt_data)]
...
}
С помощью атрибутов мы сообщили достаточно информации об элементе для его взаимодействия со средой конструктора. Можно определить ещё больше подробностей, но для простого элемента этого набора достаточно.
Создание кода основного класса элемента

  Простые элементы являются наследниками базового класса Element:
...
namespace ElementVirtual
{
[About(version = "1.0", author = "Developer Name", mail = "developer@mail.net")]
...
public class Example : Element
{
...
}
...
}

Добавим конструктор, который будет вызван средой во время создания экземпляра класса элемента:
...
namespace ElementVirtual
{
[About(version = "1.0", author = "Developer Name", mail = "developer@mail.net")]
...
public class Example : Element
{
public Example(PackElement pe, SDK sdk, int x, int y) : base(pe, sdk, x, y)
{
flag |= (int)(ElementFlag.IS_SYSTEM | ElementFlag.IS_VIRTUAL);
}
...
}
...
}
Пока скажем только о флагах элемента: IS_VIRTUAL - сообщает среде, что класс загружен из внешней сборки; IS_SYSTEM - разрешает использование элемента для построения программ (другими словами этот флаг отличает элемент от элементов помощников, которые работают только в редакторе конструктора).

Посмотрим что у нас получилось после всех предыдущих изменений кода:

Если мы теперь построим сборку элемента у Visual Studio не будет к нашему коду никаких претензий:

По умолчанию Visual Studio сохранила файл сборки в папке проекта. Куда именно увидим, посмотрев на свойства проекта:


Чтобы сократить телодвижения по копированию сборки руками в нужное нам место, надо изменить выходной путь. Так как сейчас мы делаем элемент для пакета Core, укажем путь к папке со сборками виртуальных элементов этого пакета:

Ещё установим некоторые важные свойства проекта:

Можем заполнить форму с подробной информацией о сборке и если будете использовать данный проект как шаблон для создания других элементов, то следите чтобы уникальный идентификатор сборки (GUID) оставался уникальным:

Теперь, если опять выполним построение (Build) проекта элемента, то обнаружим в указанной ранее папке файл сборки нашего нового элемента:

Размещение элемента на панели инструментов

  В принципе, поместив файл сборки в папку \virt пакета Core, можем использовать элемент в конструкторе, но только пока для отображения схем с его использованием. Элемент надо поместить на панель инструментов, чтобы можно было его вставлять в схемы. Сделать это можно несколькими способами. Не буду описывать их все, а предложу самый простой и быстрый способ. На мой взгляд, проще всего открыть файл сборки в конструкторе через меню Open или набросить его на окно программы. Но прежде чем это делать, надо добавить к элементу ещё один атрибут с информацией о пакетах в которые надо его установить (пакетов может быть несколько):
...
namespace ElementVirtual
{
...
[Install("_base", "Simple demo", "Core")]
...
}
Слева направо задаются имя пакета, краткое описание и группа в панели инструментов. Компилируем сборку элемента снова и можем попытаться установить элемент в конструкторе. Запускаем конструктор (попытка перекомпиляции элемента при запущенном конструкторе будет неудачной, так как он уже используется и загружен в память процесса программы) и открываем его из папки \virt:
Demo


Добавление иконки элемента в ресурсы сборки

  Чтобы добавить иконку элемента в ресурсы сборки надо сначала её создать. Надеюсь на просторах интернета Вы сможете отыскать изображение достойное разрабатываемого элемента. Требования к файлу иконки следующие: 24 пикселя или точки в ширину и высоту, 32 бита глубины цвета и формат иконки Windows. С именем файла иконки мы определились ранее при добавлении атрибута ToolboxBitmap, а именно picture.ico. Теперь надо решить как добавить файл иконки в ресурсы. Есть по крайней мере два способа известных мне (вероятно их больше). Один способ очевидный, а другой нет, но зато быстрый. Давайте посмотрим сначала на очевидный способ добавления через свойства проекта:
Demo


Дополнительно в обозревателе решения устанавливаем свойства для файла иконки:

Если теперь перекомпилим проект элемента и запустим конструктор, то увидим новую иконку на панели инструментов и можем добавить её на рабочее поле схемы:


  Мы сделали заготовку или шаблон элемента, который отображается на панели инструментов и может быть добавлен в схему пакета Core. Теперь надо научить элемент реагировать на обращения к его точкам других элементов схемы (сейчас он не реагирует никак, так как в нём нет кода, реализующего данный функционал).

Создание кода методов обработки обращений к точкам элемента

  При помощи связей (линий) к элементу можно обращаться из других элементов. Причём сам элемент обращается к другим элементам через верхние и правые точки, а к нему обращения приходят на левые и нижние точки. Значит в коде элемента мы должны реализовать два метода-обработчика обращений к левым и нижним точкам и научиться получать данные с левых и верхних точек, а также отправлять результаты своей работы на правые и нижние точки.

  Метод-обработчик обращений к левым точкам элемента выглядит так:
public override void do_work(ElementPoint point, ref TData data)
{
base.do_work(point, ref data);
...
}

  Метод-обработчик обращений к нижним точкам элемента выглядит так:
public override void read_var(ElementPoint point, ref TData data)
{
base.read_var(point, ref data);
...
}
Аргументы методов - это экземпляр объекта, вызываемой точки, и ссылка на объект данных, отправленных другим элементом этому. Прочитать данные, пришедшие на левую точку можно так:
    object x = data.value; // читаем нетипизированные данные с левой точки
но грамотным с точки зрения парадигмы схемотехники HiAsm будет другой код:
    // читаем данные как объект типа TData
TData dt = readData(data, getPointByName("Data"), getPropertyByName("Greeting"));

// или читаем данные как строку
string text = readString(data, getPointByName("Data"), getPropertyByName("Greeting"));

// или читаем данные как целое число
int number = readInteger(data, getPointByName("Data"), getPropertyByName("Greeting"));

// или читаем данные как действительное число
double real = readReal(data, getPointByName("Data"), getPropertyByName("Greeting"));

Отправить данные другому элементу через правую точку может следующий код:
    // отправляем строку другому элементу через точку к именем onGreeting
on_event(getPointByName("onGreeting"), "Hello!");

// отправляем целое число другому элементу через точку к именем onGreeting
on_event(getPointByName("onGreeting"), 123);

// отправляем действительное число другому элементу через точку к именем onGreeting
on_event(getPointByName("onGreeting"), Math.PI);
Универсальным способом отправки данных через правую точку будет следующий код:
    // создаём новый объект типа TData и указываем наши данные для отправки как аргумент конструктора
TData dt = new TData("Hello!");

// отправляем данные другому элементу через точку к именем onGreeting
on_event(getPointByName("onGreeting"), ref dt);

Для возвращения данных с нижних точек надо записать наши данные в объект типа TData, ссылку на который нам прислал, обращающийся к нашей точке элемент. Следующий код показывает как можно это сделать:
    // записываем наши данные типа TData по ссылке другого элемента
data.assign(new TData("Hello!"));

// или записываем наши данные любого типа по ссылке другого элемента
data.assignT(this);

Теперь мы готовы научить наш элемент реагировать на внешние обращения к нему из других элементов:
private TData local;

public override void do_work(ElementPoint point, ref TData data)
{
base.do_work(point, ref data);

this.local = readData(data, getPointByName("Data"), null);
TData dt = new TData(this.local);
this.on_event(getPointByName("onGreeting"), ref dt);
}

public override void read_var(ElementPoint point, ref TData data)
{
base.read_var(point, ref data);

if (this.local.isEmpty())
data.assign(new TData(Properties.Resources.greeting));
else
data.assign(this.local);
}
Добавим в ресурсы сборки строку приветствия, которая будет возвращаться с нижней точки по умолчанию:

Посмотрим на получившийся код элемента:

Можете скачать полный код проекта элемента: MyElementCore.zip

  Мы реализовали необходимый функционал элемента и можем проверить как он работает:
Demo



P.S. Продолжение следует. Эта тема будет редактироваться и дополняться новой информацией для разработчиков, которая призвана помочь им преодолеть порог вхождения. Автор будет удалять комментарии не относящиеся к данной теме, чтобы не засорять её бесполезной информацией, для которой на форуме есть специальные разделы. Спасибо за понимание.

Редактировалось 80 раз(а), последний 2020-01-02 20:07:33
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
2
Голосовали:Konst, strannik_nebes
vip
#1.1контекстная реклама от партнеров
Главный модератор
Ответов: 2997
Рейтинг: 395
#2: 2019-10-18 11:59:40 ЛС | профиль | цитата
    Атрибуты элемента

  В других версиях конструктора описание шаблона элемента хранится в отдельном файле по одному на каждый элемент. Если подсчитать количество файлов, которые хранят информацию об одном элементе, то результат получится немаленький. В проекте HiAsm.NET концепция хранения информации другая. Если бы элемент умел говорить, то мог бы сказать: «Всё своё ношу с собой». К тому же, сборка может служить контейнером нескольким элементам сразу. Получается, что новая концепция сокращает количество файлов пакета примерно на порядок величины. Не забудем ещё отметить, что решена задача локализации элемента под любые национальные языки. Давайте рассмотрим подробнее, что позволило достигнуть такого результата.

  Описание шаблона элемента взяли на себя атрибуты. В C# разрешается вводить в код информацию декларативного характера в форме атрибута, с помощью которого определяются дополнительные сведения (метаданные), связанные с классом, структурой, методом и т.д. Атрибуты указываются в квадратных скобках перед тем элементом, к которому они применяются. Следовательно, атрибут не является членом класса, но обозначает дополнительную информацию, присоединяемую к элементу.

  В .NET атрибуты представляют собой типы классов, которые расширяют абстрактный базовый класс System.Attribute. В поставляемых в .NET пространствах имен доступно множество предопределенных атрибутов, которые полезно применять в своём коде. Более того, можно также создавать собственные атрибуты и тем самым дополнительно уточнять поведение своих типов, создавая для атрибута новый тип, унаследованный от Attribute. В проекте HiAsm.NET была использована эта возможность. Теперь разработчик имеет в своём распоряжении следующий список атрибутов для описания метаданных своего элемента:
НазваниеТипОписание
AboutHiasm.AboutAttributeАтрибут описания версии элемента и его разработчика
InstallHiasm.InstallAttributeАтрибут добавления элемента к пакету и группе на панели инструментов
TypeHiasm.TypeAttributeАтрибут описания класса элемента и метаданных для отображения в конструкторе
EditHiasm.EditAttributeАтрибут метаданных для отображения элемента в редакторе формы
WidgetHiasm.WidgetAttributeАтрибут описания виджета элемента
HandlersHiasm.HandlersAttributeАтрибут метаданных редактора пользовательских свойств элемента
AssemblyHiasm.AssemblyAttributeАтрибут метаданных сторонних сборок связанных с элементом
PropertyHiasm.PropertyAttributeАтрибут описания свойств элемента
PointHiasm.PointAttributeАтрибут описания точек элемента

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

  Атрибут Install элемента может содержать дополнительное поле lang:
НазваниеТипОписание
langSystem.StringОпределяет локализацию описания двухбуквенным языковым кодом. Указывается после аргументов конструктора

Поле являются необязательным. Значение по умолчанию для поля null.
[Install("_base", "Simple demo", "Core")]
[Install("_base", "Простой пример", "Core", lang = "ru")]
Внимание, для каждой локализации создаётся отдельный атрибут.

  Примеры атрибутов для установки элемента в различные пакеты:
[Install("delphi", "Simple demo", "Core")]
[Install("CNET", "Simple demo", "Core")]
Атрибут Type

  Атрибут Type описания элемента может содержать дополнительные поля:
НазваниеТипОписание
langSystem.StringОпределяет локализацию описания двухбуквенным языковым кодом. Указывается после аргументов конструктора
tabSystem.StringЗадаёт имя вкладки на панели инструментов
groupSystem.StringЗадаёт имя группы на вкладке панели инструментов
categorySystem.StringЗадаёт имя категории на панели инструментов редактора формы, если данный элемент должен на ней отображаться
inheritSystem.StringЗадаёт имя наследуемого класса
interfacesSystem.StringЗадаёт список интерфейсов, реализуемых данным элементом
iconSystem.StringЗадаёт имя свойства элемента, значение которого определяет иконку элемента в редакторе схемы
subSystem.StringЗадаёт имя класса элемента, помещаемого внутрь элемента-контейнера при его создании
viewSystem.StringЗадаёт информацию для отображения на элементе в редакторе схемы
flagsHiAsm.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

  Атрибут Edit имеет следующие поля:
НазваниеТипОписание
ClassSystem.StringОпределяет имя класса для отображения элемента в редакторе формы
proSystem.BooleanЗадаёт значение, определяющее необходимость редактирования элемента в дизайнере формы
listSystem.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

  Атрибут Widget имеет следующие поля:
НазваниеТипОписание
assemblySystem.StringОпределяет информацию об используемой в элементе сторонней сборке
typeSystem.StringЗадаёт имя используемого типа в сторонней сборке

Все поля являются необязательными. Значение по умолчанию для полей типа System.String будет null

  Пример атрибута Widget:
[Widget(assembly = "System.Windows.Forms.dll", type = "System.Windows.Forms.Panel")]
Внимание, для каждой сторонней сборки создаётся отдельный атрибут.
Атрибут Handlers

  Атрибут Handlers имеет поле list:
НазваниеТипОписание
listSystem.String[]Определяет список строк как пары Ключ=Значение для сопоставления имён свойств элемента с именами пользовательских редакторов

Все поля являются необязательными. Значение по умолчанию для полей типа System.String будет null, для типа System.Boolean - false.

  Пример атрибута Handlers:
[Handlers("HandlerName=PropreryName", "HandlerName2=PropreryName2")]
Атрибут Assembly

  Атрибут Assembly имеет поле list:
НазваниеТипОписание
listSystem.String[]Определяет список строк как пары Ключ=Значение для указания имени сторонней сборки и используемого типа


  Пример атрибута Assembly:
[Assembly("System.Windows.Forms.dll=System.Windows.Forms.Panel", "ColorPicker.dll=Sano.PersonalProjects.ColorPicker.Controls.ColorPanel")]
Атрибут Property

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

НазваниеТипОписание
data_intSystem.Int32Целое число
data_strSystem.StringСтрока символов в кодировке UTF8
data_dataHiAsm.TDataКомплексный тип, способный задать значение четырёх типов: data_int, data_str, data_real и data_null
data_comboSystem.Int32Задаёт индекс значения в фиксированном списке строк
data_listSystem.StringЗадаёт список строк
data_data_iconSystem.Drawing.IconКартинка в формате иконки Windows
data_realSystem.DoubleДействительное число двойной точности
data_colorSystem.Int32Задаёт цвет
data_scriptSystem.StringИспользуется для установки кода сценария
data_streamSystem.IO.MemoryStreamИспользуется для установки бинарных данных
data_bitmapSystem.Drawing.BitmapКартинка в формате Bitmap
data_waveSystem.IO.MemoryStreamИспользуется для установки звуковых данных в Wave формате
data_arrayHiAsm.ArrayValueКомплексный тип, способный задать значение массива различных типов
data_comboExSystem.StringЗадаёт строковое значение из фиксированного списка строк
data_fontHiAsm.FontRecordКомплексный тип, используемый для установки шрифта
data_jpegSystem.IO.MemoryStreamИспользуется для установки картинки в Jpeg формате
data_codeSystem.StringИспользуется для установки кода сценария
data_elementSystem.StringИспользуется для установки ссылки на другие элементы схемы
data_flagsSystem.Int32Задаёт значение отдельных битов
data_objectHiAsm.ObjectRecordКомплексный тип, способный задать значение различных типов
data_timeSystem.DateTimeИспользуется для установки даты и времени
data_boolSystem.BooleanИспользуется для установки логичекого значения True или False
data_longSystem.Int6464-битное целое число
data_charSystem.CharИспользуется для установки символьного значения
data_floatSystem.SingleДействительное число одинарной точности
data_decimalSystem.DecimalЗадаёт десятичное число
data_componentHiAsm.ObjectRecordИспользуется для установки значения типа IComponent

Список полей, используемых при создании свойства элемента

  Кроме обязательных аргументов конструктора атрибута Property можно использовать другие поля, определяющие дополнительные установки для свойства элемента:
НазваниеТипОписание
langSystem.StringОпределяет локализацию описания двухбуквенным языковым кодом. Указывается после аргументов конструктора
groupSystem.StringЗадаёт имя группы свойств для отображения в редакторе свойств элемента
valueSystem.StringЗадаёт строкой значение свойства по умолчанию
listSystem.StringЗадаёт строкой фиксированный список возможных значений свойства. В качестве разделителя используется символ запятой
doubleopenSystem.BooleanУказывает на единственное свойство элемента, которое будет открываться на редактирование при двойном клике мышью на элементе
makemethodSystem.BooleanРазрешает создание на элементе точки для изменения значения свойства во время выполнения
readOnlySystem.BooleanУказывает, что свойство в редакторе доступно только для чтения
visibleSystem.BooleanЗадаёт значение, определяющее видимость свойства в редакторе элемента
editorSystem.TypeЗадаёт тип редактора свойства
converterSystem.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}")]
Атрибут Point

  Список полей, используемых при создании точки элемента:
НазваниеТипОписание
langSystem.StringОпределяет локализацию описания двухбуквенным языковым кодом. Указывается после аргументов конструктора
hiddenSystem.BooleanЗадаёт значение, определяющее видимость точки элемента по умолчанию
indexSystem.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")]

Редактировалось 4 раз(а), последний 2020-02-08 15:11:22
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Главный модератор
Ответов: 2997
Рейтинг: 395
#3: 2019-11-03 15:50:22 ЛС | профиль | цитата