Оболочка программы iProgPro поддерживает выполнение скриптов, написанных на языке Lua.

Оглавление

Программа имеет встроенный редактор для скриптов Lua.

Создание скрипта

Если у вас не открыто дерево калькуляторов, то необходимо открыть его через главное меню Вид-Калькуляторы.

Возможно у вас уже есть какие-то калькуляторы Lua (они имеют расширение *.lua):

Если сделать двойной клик на имени файла в списке, то он запускается на выполнение. Если калькулятор имеет пользовательское окно, оно отобразится на экране компьютера.

Калькулятор Lua может не иметь окна. Тогда он просто выполняется каждый раз, когда происходит двойной клик на его имени в списке.

Что бы открыть файл для редактирования, необходимо выбрать его в списке, затем вызвать выпадающее меню правой кнопкой мыши и выбрать в этом меню "Открыть исходный файл"

Файл для калькулятора будет открыт для редактирования прямо в редакторе программы как текстовый файл.

Внимание: для открытия калькулятора для редактирования в программе уже должен быть активным редактор. Если выбран скрипт, в котором не отображается редактор, калькулятор на редактирование не откроется.

Редактор скрипта позволяет редактировать текст (код) калькулятора и окно калькулятора (Закладки Source и Window).

Редактор скрипта позволяет редактировать текст (код) калькулятора и окно калькулятора (Закладки Source и Window).

Текст скрипта - просто обычный исходный текст скрипта Lua.

Для создания нового скрипта необходимо выбрать любой скрипт в дереве скриптов, вызвать выпадающее меню и выбрать в нем "Создать новый файл в этой папке"

Появится окно с приглашением ввести имя файла.

Введите любое имя файла и расширение обязательно *.lua. Если задать другое расширение, файл не будет отображаться в окне калькуляторов.

После ввода имени файла отображается пустое окно редактора калькулятора.

Переключитесь во вкладку Window, кликните на кнопку с изображением кнопки (с надписью OK) затем кликните мышкой рабочей области окна калькулятора (внутри серой рамки ниже). Появится нарисованная кнопка. Захватывая мышкой черные квадратики, можно изменять размер кнопки.

Теперь нажмите клавиши Ctrl + S для сохранения файла калькулятора. Затем сделайте двойной клик на имени вашего калькулятора в списке калькуляторов. Окно калькулятора появится на экране.

Можно нажимать на кнопку калькулятора, но ничего не будет происходить, так как кнопке не назначено никакое событие.

Закройте калькулятор, в окне редактора выберите закладку Source и скопируйте туда текст:

function click(id)
    print('Button clik! Id = '..id)
end

Затем перейдите в закладку Window, и в редакторе свойств кнопки найдите свойство OnClick и выберите в его выпадающем списке click.

Если редактор свойств не отображается, нужно кликнуть мышкой на изображение кнопки в визуальном в редакторе (внутри серой рамки).

После этого сохраните файл (через меню или панель инструментов или Ctrl+S). Откройте и пристыкуйте панель сообщений программы, если она не открыта (Главноем меню Вид - Окно сообщений).

Запустите калькулятор снова (двойной клик на имени файла в списке калькуляторов). Появляется окно калькулятора и при нажатии на кнопку в окне калькулятора в окне сообщений выводится строка

Button clik! Id = 0

 

 

Дополнительные функции

Для взаимодействия конкретно со программой iProg Pro в язык добавлены некоторые функции (их нет о стандартной Lua):

Функция Описание

print(string)

Выводит строку string в окне сообщений программы

ShellExecute(string)

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

SetCaption(string)

Выводит строку string в заголовке окна калькулятора

Close()

Закрывает окно калькулятора

http()

Выполняет http запрос

Пример:

local Status, data = http('ya.ru','GET','');
print('Status = '..Status);
print('data = '..data);

Первый параметр в функции http - имя сервера, второй - тип запроса (GET или POST), третий - данные запроса

Функция возвращает два параметра:

Первый (в примере Status) - код статуса запроса (200, 404, 401 и т.д.), второй - данные от сервера.

В данном примере ответ был такой:

Status = 200
data = <!DOCTYPE html><html class="i-ua_js_no i-ua_css_standart i-ua_browser_unknown i-ua_browser_desktop i-ua_platform_other" lang="ru"><head xmlns:og="http://ogp.me/ns#"><meta http-equiv=Content-Type content="text/html;charset...

Дальше данные обрезаны.
 

DeviceID()

Возвращает серийный номер и UID подключенного программатора

Пример:

uid,sn = DeviceID()
print('sn = '..sn)
print('uid = '..IntToHex(uid))

Результат:

sn = 383
uid = F28E56AC

uid в примере будет содержать UID программатора, sn - серийный номер.

MessageBox(message,Type)

Отображает стандартное окно сообщений.

Первый параметр (message) - текстовая строка, которая будет отображаться в окне.

Второй параметр (Type) - число, которое определяет какая иконка и кнопки будут отображаться в окне. Коды иконок и кнопок можно посмотреть здесь

Функция возвращает значение, которое зависит от кнопки, которую нажал пользователь в окне. Коды возвращаемых значений здесь

 

Обработчик OnEditorSelect

Если в тексте калькулятора есть функция с именем OnEditorSelect, то она будет вызываться автоматически, когда пользователь отпускает левую кнопку мыши после выделения области в редакторе.

Функция OnEditorSelect должна иметь два параметра. Первый параметр при вызове будет содержать адрес начала выделенного блока, второй - адрес конца выделенного блока.

Пример:

function OnEditorSelect(start,finish)
  Memo1.Clear()
  Memo1.Add('Адреса: '..start..'...'..finish)
End

Обработчик OnLoadFile

Если в тексте калькулятора есть функция с именем OnLoadFile, то она будет вызываться автоматически, если окно калькулятора активно и пользователь загружает файл двойным кликом в проводнике программы iProgPro

Пример:

function OnLoadFile()
  Memo1.Clear()
  Memo1.Add('В редактор загружен файл!')
End

Обработчик OnSelectFile

Если в тексте калькулятора есть функция с именем OnSelectFile, то она будет вызываться автоматически, если окно калькулятора активно и пользователь выделяет (не загружает) кликом мышки файл в проводнике программы iProgPro. Фунцкция OnSelectFile обязательно должна иметь один параметр. В этом параметре передается полное имя выделенного пользователем файла.

Пример:

function OnSelectFile(filename)
    Label2.SetText('Выбран файл: '..filename)
end

Взаимодействие с редактором скрипта

Все функции работают с редактором, который отображается в данный момент на экране. Если выбран скрипт без редактора, то функции работы с редактором игнорируются в калькуляторе.

Если происходит обращение за пределы редактора, то запись в редактор игнорируется, чтение возвращает неопределенное значение.

Editor.Read(adr) Возвращает байт из редактора по адресу adr.

Примеры:

value = Editor.Read(25)
adr = 534
value = Editor.Read(adr)

Editor.Read16(adr) Возвращает 16-битное слово (2 байта) из редактора по адресу adr. Старшие 8 байт результата берутся из адреса adr, младшие из адреса adr+1

Примеры:

value = Editor.Read(25)
adr = 534
value = Editor.Read(adr)

Editor.Read32(adr) Возвращает 32-битное слово (4 байта) из редактора по адресу adr. Старший байт результата берется по адресу adr, остальные байты слева направо - по адресам adr+1, adr+2, adr+3

Примеры:

value = Editor.Read(25)
adr = 534
value = Editor.Read(adr)

Editor.Write(adr,value) Записывает в редактор по адресу adr значение value. Записываются только младший байт значения, старшие байты игнорируются.

Примеры:

Editor.Write(25,77)
adr = 534; value = 100
value = Editor.Write(adr,value)

Editor.Write16(adr,value) Записывает в редактор по адресу adr значение value. Записываются два младших байта значения (16 бит), старшие байты игнорируются. Байт с битами 15...8 записывается по адресу adr, младший байт - по адресу adr+1

Примеры:

Editor.Write(25,77)
adr = 534; value = 100
value = Editor.Write(adr,value)

Editor.Write32(adr,value) Записывает в редактор 32-битное значение value. Старший байт значения записывается по адресу adr, остальные байты слева направо - по адресам adr+1, adr+2, adr+3

Примеры:

Editor.Write(25,77)
adr = 534; value = 100
value = Editor.Write(adr,value)

Editor.Size() Возвращает размер редактора в байтах. Если скрипт не имеет редактора, то возвращается значение -1.

Пример:

print('Размер редактора: '..Editor.Size()..' байт')

Editor.SetHighlight(adr,value) Включает/выключает подсветку байта по адресу adr в редакторе. Если value = 0, то подсветка будет выключена, при ненулевом value - включена.

Пример (байт по адресу 0 будет посвечен (по умолчанию красным цветом)):

Editor.SetHighlight(0,1)

Editor.Highlight(adr) Возвращает 1, если данный адрес в редакторе подсвечен, и 0 если не подсвечен

Пример:

aaa = Editor.Highlight(0)

Editor.Position() Возвращает адрес байта, на котором в данный момент находится курсор в редакторе

Пример:

print('Адрес курсора: '..Editor.Position())

 

Editor.Selection() Возвращает адреса начала и конца выделенной области в редакторе. Если выделенной области нет, то возвращаются значения -1

Пример:

selbegin,selend = Editor.Selection()

 

Editor.Select(start,finish) В редакторе выделяется (по умолчанию синим цветом) область от адреса start до адреса finish

Визуальный редактор

Визуальный редактор позволяет быстро создавать и редактировать визуальные элементы в окне калькулятора.

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

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

Button - Стандартная кнопка. Может содержать иконку.
Group - Группа. Предназначена для визуального отделения компонентов окна
CheckBox - Переключатель
Label - Текстовая метка
Edit - Однострочный текстовый редактор
Digit - Числовой редактор. Позволяет вводить и редактировать только числа
Hbytes - Шестнадцатеричный редактор. Позволяет вводить и редактировать числа в шестнадцатеричном виде.
Combobox - Выпадающий список
Memo - Многострочный редактор
Picture - Статическая картинка.

Для размещения компонента в окне нужно кликнуть на нем мышкой на панели, затем кликнуть мышкой рабочей области окна визуального редактора. При выделении компонента на его рамке отображаются черные квадратики. Ухватив мышкой эти квадратики можно изменять размер компонента. Перемещать компонент можно, кликнув на нем левой кнопкой мыши и удерживая ее нажатой перемещать мышь.

Для удаления компонента необходимо выбрать его в списке в левой верхней части редактора и нажать клавишу Del на клавиатуре.

В левой нижней части окна редактора отображается список свойств выбранного в данный момент компонента. Выбирая мышью нужное свойство, можно изменять его значение (мышью или с клавиатуры). Разные компоненты имеют разные наборы свойств.

Свойство Описание

Alignment

Определяет выравнивание текста на метке

Left - текст выравнивается к левому краю метки
Center - текст выравнивается по центру метки
Right -
текст выравнивается к правом краю метки

Bold font

True - текст компонента будет имет утолщенное начертание
False -
текст компонента будет иметь обычное начертание

Caption

Текст на компоненте
FontColor Цвет шрифта компонента
Color Цвет компонента
FontSize Размер шрифта компонента
FontName Имя шрифта компонента
Left Координата по горизонтали левого верхнего угла компонента
Top Координата по вертикали левого верхнего угла компонента
Height Высота компонента
Width Ширина компонента

Enabled

Поддерживается только для кнопки. True - кнопка доступна. False - кнопка заблокирована

ID

Идентификатор компонента. Любое число от 0 до 65535

Name

Имя компонента. По имени можно обращаться к компоненту из кода скрипта.

OnClick

Имя процедуры, которая будет вызываться при воздействии на компонент пользователем

Icon

Иконка, которая будет отображаться на кнопке.
Checked

Используется для переключателя. True - переключатель активен, False - переключатель неактивен

Text

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

Value

Используется для числового редактора. Значение, которое отображается в редакторе по умолчанию.

Count Используется для шестнадцатеричного редактора. Количество символов, отображаемых в редакторе
Symbols Используется для шестнадцатеричного редактора. Значение, отображаемое в шестнадцатеричном редакторе по умолчанию
Show spaces Используется для шестнадцатеричного редактора. True - после каждых двух символов отображается пробел
AutoSize Используется для картинки. True - высота и ширина компонента автоматически подстраивается под размер картинки
Items Используется для выпадающего списка и многострочного редактора. Набор строк, которые будут отображаться в компоненте

 

Доступ к визуальным компонентам из кода калькулятора.

Для обращения к какому-либо свойству компонента необходимо записать его имя, заданное в визуальном  редакторе, затем через точку имя функции, которая устанавливает или считывает свойство компонента.

 

Color()

Возвращает цвет компонента. Windows поддерживает разные цвета не для всех компонентов.

Пример (Label - имя компонента):

aaa = Label.Color()

FontColor()

Возвращает цвет шрифта компонента. Windows поддерживает смену цвета шрифта не для всех компонентов.

Пример (Label - имя компонента):

aaa = Label.FontColor()

SetColor(value) Устанавливает цвет компонента. Windows поддерживает разные цвета не для всех компонентов.

Пример (Label - имя компонента):

Label.SetColor(0xFF00FF)

SetFontColor(value) Устанавливает цвет шрифта компонента. Windows поддерживает смену цвета шрифта не для всех компонентов.

Пример (Label - имя компонента):

Label.SetColor(500)

FontName() Возвращает строку с именем шрифта, который использует компонент.

Пример (Label - имя компонента):

fn = Label.FontName()

SetFontName(string) Устанавливает имя шрифта для компонента.

Пример (Label - имя компонента):

Button.SetFontName('Courier')

FontSize() Возвращает размер шрифта, который использует компонент.

Пример (Label - имя компонента):

fs = Label.FontSize()

SetFontSize(value) Устанавливает размер шрифта для компонента.

Пример (Button - имя компонента):

Button.SetFontSize(22)

Enable() Делает компонент активным

Пример (Button- имя компонента):

Button.Enable()

Disable() Делает компонент неактивным

Пример (Button - имя компонента):

Button.Disable()

Text() Возвращает стоку с текстом компонента:

Для редактора Edit - текст в редакторе
Для метки
Label - надпись на метке
Для выпадающего списка - текст выбранной в данный момент строки
Для кнопки - текст на кнопке
Для переключателя - текст переключателя

Пример:

bt = Button.Text()
lt = Label.Text()

SetText(string) Устанавливает текст компонента

Для редактора Edit - текст в редакторе
Для метки
Label - надпись на метке
Для выпадающего списка - ищет строку с таким же текстом и выбирает ее
Для кнопки - текст на кнопке
Для переключателя - текст переключателя

Пример:

Button.SetText('Это кнопка')
Label.SetText('Это лабел')

Clear() Для однострочного редактора типа Edit - удаляет текст в редакторе
Для многострочного редактора типа
Memo - удаляет весь текст в редакторе
Для выпадающего списка - удаляет все строки списка
Для переключателя - деактивирует переключатель

Для остальных компонентов ничего не делает

Add(string) Для многострочного редактора типа Memo - добавляет текстовую строку в конце текста
Для выпадающего списка - добавляет строку в конец списка

Пример:

Memo1.Clear()
Memo1.Add('Memo строка 1')
Memo1.Add('Memo строка 2')
Memo1.Add('Memo строка 3')
Combobox1.Clear()
Combobox1.Add('Выпадающий список строка 1')
Combobox1.Add('Выпадающий список строка 2')

Value() Для переключателя возвращает 1, если переключатель активен, иначе 0
Для числового редактора типа Digit возвращает значение (число), отображаемое в редакторе
Для выпадающего списка возвращает индекс выбранной строки (индексы начинаются с нуля)
Для шестнадцатеричного редактора возвращает отображаемое значение в виде числа. Если в редакторе отображается более 4-х байт, то возвращается значение 4 левых байт.
SetValue(value) Для переключателя: если value не 0, то переключатель будет активен, иначе неактивен
Для числового редактора типа
Digit устанавливает значение в редакторе
Для выпадающего списка устанавливает индекс выбранной строки (индексы начинаются с нуля). Если
value имеет недопустимое значение (меньше нуля или больше количества строк), то функция игнорируется.
Для шестнадцатеричного редактора устанавливает отображаемое значение. Если в редакторе отображается менее 4 байт, то старшие биты значения отбрасываются. Если в редакторе отображается более 4 байт, то значение устанавливается для 4 левых байт
Byte(index) Возвращает значение байта по индексу index из шестнадцатеричного редактора. Индексы считаются слева направо и начинаются с нуля.
SetByte(index,value) Устанавливает значение value в байте по индексу index в шестнадцатеричном редакторе. Если index имеет недопустимое значение, то функция игнорируется
Count() Возвращает количество строк в выпадающем списке.

Вызов функций в калькуляторе

Некоторые визуальные компоненты имеют свойство OnClick. Это свойство должно содержать имя функции. Эта функция будет вызываться при воздействии на этот визуальный компонент.

Для кнопки Button - при нажатии на кнопку

Для выпадающего списка Combobox - при выборе новой строки в списке

Функция для обработки OnClick должна обязательно иметь следующий заголовок:

function Click(id)

Click - имя функции, дано для примера, может быть любым. Параметр в вызове функции должен быть только один с именем id.

При вызове функции он будет содержать ID компонента, который вызвал эту функцию.

 

Выполнение кода

При запуске калькулятора Lua до появления окна калькулятора на экране выполняется весь код, записанный снаружи процедур.

Пример:

print('1 - Этот код выполняется при загрузке')

function aaa()
 print('!!!!!!!!!!!!!!!!!!')
end

print('2 - Этот код выполняется при загрузке')

function bbb()
 print('!!!!!!!!!!!!!!!!!!')
end

function load()
 print('Код внутри процедуры load()')
end

load()
b = 20
a = 50
print('3 - Конец загрузочного кода: 20 * 50 = '..(a*b))

При запуске такого калькулятора будут выведены сообщения:

1 - Этот код выполняется при загрузке
2 - Этот код выполняется при загрузке
Код внутри процедуры load()
3 - Конец загрузочного кода: 20 * 50 = 1000

Версия программы и папка калькулятора

Специальная переменная SW_VERSION содержит версию программы, на которой исполняется скрипт. Переменная CURRENT_PATH содержит имя папки, в которой находится запущенный калькулятор

Пример:

print('Версия софта: '..SW_VERSION)
print('Папка: '..CURRENT_PATH)
 

Результат:

Версия софта: 65
Папка: E:\iProg Pro\Calculators\lua\