LeshaInc 624 Опубликовано: 22 сентября, 2015 Если нужна удобная модульность — можете подождать и узерть мой аналог формс, с удобной модульностью. Собственно, я либу уже написал, дело в том что надо напитсать модули (чекбоксы всякие, поля для ввода, списки, итд) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 24 сентября, 2015 В библиотеку forms (и конечно же в редактор FormsMaker) добавлены два невизуальных компонента - событие и таймер. В редакторе они видны, что позволяет редактировать их свойства. Событие. Создается командой: Event1=Form1:addEvent(eventName, onEvent) При возникновении в системе события с именем eventName будет вызвана функция-обработчик onEvent. Как видите, компонент событие аналогичен слушателю, создаваемому функцией event.listen, с той разницей, что компонент работает только в пределах создавшей его программы, а слушатель продолжит работу и после её завершения. Параметры вызова метода addEvent: eventName - (строка) имя обрабатываемого события. Если задать пустую строку, компонент будет обрабатывать все возникающие события. onEvent - (функция) обработчик события, принимает параметры, передаваемые событием. Таймер. Создается командой: Timer1=Form1:addTimer(interval, onTime) Вызывает функцию onTime с заданным интервалом. Параметры вызова метода addTimer: interval - (число) период работы таймера в секундах. onTime - (функция) обработчик события. Методы компонентов "событие" и "таймер": stop() - приостанавливает работу компонента. run() - возобновляет работу 4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SergOmarov 34 Опубликовано: 29 сентября, 2015 Зеро, я улучшил компонент Menu(теперь посторонний клик вне области раскрытого меню закрывает его), но это потребовала нескольких серьезных изменений, и в целях оптимизации я перенес его из модуля в саму библиотеку. Можешь использовать мой вариант для последующих обнов? http://pastebin.com/VNxmmkDU Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 29 сентября, 2015 Хорошо. Доберусь до компьютера, посмотрю. Опиши пожалуйста, что делает этот компонент, какие у него свойства и методы. Есть еще какой-то LavelingFrame. Это что? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SergOmarov 34 Опубликовано: 29 сентября, 2015 (изменено) Есть еще какой-то LavelingFrame. Это что? Не работающий(пока) я его там оставил случайно, его скорее надо выделить в модуль и поставлять с пакетом моей программы(для нее его и делал). Хорошо. Доберусь до компьютера, посмотрю. Опиши пожалуйста, что делает этот компонент, какие у него свойства и методы. Menu - раскрывающееся меню, как в Windows При создании передается таблица, содержащая итемы по структуре: {{[1]=<name>,[2]=function()end},...} При клике по пункту <name> вызывается соответствующая функция, при клике вне меню - меню закрывается. Нельзя открыть больше 1 меню. Изменено 1 октября, 2015 пользователем SergOmarov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ilya3000 30 Опубликовано: 23 марта, 2016 Форма не выводит знаки поверх себя, кроме своих частей http://pastebin.com/FDtAVd6j Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 23 марта, 2016 (изменено) Форма не выводит знаки поверх себя, кроме своих частей http://pastebin.com/FDtAVd6j Создавать формы и компоненты следует до запуска функции run, а не по нажатию кнопки. Попробуй так: local wce = require("WCE") local term = require("term") local forms = require("forms") local event = require("event") local buf = require("doubleBuffering") local component = require("component") gpu = component.gpu w, h = gpu.getResolution() ------functions------- local function exit() term.clear() forms.stop() --останавливаем выполнение среды end local function startgame() term.clear() -- этот clear можно не делать. Экран всё равно перетрется формой GameForm:setActive() --Делаем активной форму игры -- печатаем что надо for i=1,w do wce.PrintHere(i, h, "█") end -- buf.line(1, h-10, w, h-10, 0xa9a9a9, 0xa9a9ff, "█") buf.draw() end -- Создаем форму меню MenuForm=forms.addForm() MenuForm.border=1 ButtonExit=MenuForm:addButton(w/2, h-10, "Exit", exit) ButtonStart=MenuForm:addButton(w/2, h-12, "Start", startgame) --по нажатию этой кнопки активной станет GameForm -- Создаем форму игры GameForm=forms.addForm() --по нажатию этой кнопки активной станет MenuForm ButtonExitG=GameForm:addButton(w-10, h-1, "Exit", function() MenuForm:setActive() end) GameForm.border=1 --Запускаем среду на выполнение forms.run(MenuForm) Изменено 23 марта, 2016 пользователем Zer0Galaxy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
HixOff 102 Опубликовано: 18 апреля, 2016 (изменено) Господа люди умные, подскажите смертному простому косяк егов зачатке программы при нажатии на кнопки изменяется переменная enэту переменную выводит Label1дабы выводил он верно, к каждой кнопке дополнительно вывесил Label1:redraw()но... все еще выводит 0где же тут косяк ? не заметил очевидную опечатку или не так понял синтаксис методов ?Осторожно! Крайняя упоротость! require("component").gpu.setResolution(60,50) forms=require("forms") forms.ignoreAll() Form1=forms.addForm() Form1.color=12566463 Form1.border=1 en = 0 function Button1onClick(self, user) en = en - 1000000 Label1:redraw() end Button1=Form1:addButton(13,12,"-1M",Button1onClick) Button1.color=7217965 function Button2onClick(self, user) en = en - 100000 Label1:redraw() end Button2=Form1:addButton(13,14,"-100К",Button2onClick) Button2.color=7217965 function Button3onClick(self, user) en = en - 10000 Label1:redraw() end Button3=Form1:addButton(13,16,"-10К",Button3onClick) Button3.color=7217965 Label1=Form1:addLabel(24,14,en) Label1.centered=true Label1.color=984582 Label1.autoSize=false Label1.fontColor=12779488 Label1.W=10 function Button4onClick(self, user) en = en + 1000000 Label1:redraw() end Button4=Form1:addButton(35,12,"+1М",Button4onClick) Button4.color=8101979 function Button5onClick(self, user) en = en + 100000 Label1:redraw() end Button5=Form1:addButton(35,14,"+100к",Button5onClick) Button5.color=8101979 function Button6onClick(self, user) en = en + 10000 Label1:redraw() end Button6=Form1:addButton(35,16,"+10К",Button6onClick) Button6.color=8101979 Label2=Form1:addLabel(10,9,"Выберите количество покупаемой энергии") Label2.color=10395294 Label2.fontColor=0 Label2.W=38 Label2.border=4 Button7=Form1:addButton(24,19,"Оплатить") Button7.fontColor=0 Button7.color=14329120 Label3=Form1:addLabel(10,24,"Проведите смарт-картой по считывателю") Label3.color=10395294 Label3.fontColor=0 Label3.W=37 Label4=Form1:addLabel(26,26,"<<<<<<") Label4.color=10395294 Label4.fontColor=0 Label4.W=6 Label5=Form1:addLabel(14,33,"Количество энергии в хранилище:") Label5.color=10395294 Label5.fontColor=0 Label5.W=31 Label6=Form1:addLabel(24,36,"Label6") Label6.centered=true Label6.color=8060927 Label6.autoSize=false Label6.fontColor=0 Label6.W=10 Label6.alignRight=true forms.run(Form1) Изменено 18 апреля, 2016 пользователем _Star_Craft_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 18 апреля, 2016 Думаю, в каждую процедуру ButtonХonClick неплохо бы добавить фразу: Label1.caption=en 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Laine_prikol 48 Опубликовано: 29 апреля, 2016 Очень простая и удобная, класс, автор продолжай! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Pofigist 35 Опубликовано: 30 апреля, 2016 ... У меня очень глупый вопрос "TComponent.__index = TComponent" позволяет обращаться в формате "Бла-бла-бла:функция()"? Ну через двоеточие, короче? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 398 Опубликовано: 30 апреля, 2016 TComponent.__index = TComponent — это чудеса метамагии. Есть класс TComponent. При создании нового объекта ему присваивается класс как метатаблица. Однако методы и пр. не копируются. В объекте их нет, по сути. Метапараметр __index задаёт, где искать недостающие методы. Сначала, например, он будет искать значение в таблице объекта, а потом — в таблице __index (то есть, в классе). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SDV 784 Опубликовано: 9 июля, 2016 Левый щелчок мыши на окне переведет компонент в режим ввода текста. Завершение ввода осуществляется нажатием клавиши Enter. После чего вызывается функция-обработчик, если она определена. Функция принимает один параметр - указатель на компонент, который ее вызвал. @Zer0Galaxy, то ли лыжи не едут, то ли я еб***тый Объясни на примере как сделать чтобы то что ввел в инпут можно потом вывести на экран (или вообще в другую переменную). Не пойму просто как вытянуть переменную окна ввода в функцию печати на экран. Пример: function text(a) return print(a) end Edit1=Form1:addEdit(10,10,function() text(??Какую переменную пишем??) end) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 9 июля, 2016 function text(a) return print(a) end Edit1=Form1:addEdit(10,10,function() text(Edit1.text) end) text - строка текста, введенного в окно ввода. (или вообще в другую переменную). local a=Edit1.text Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SDV 784 Опубликовано: 9 июля, 2016 text - строка текста, введенного в окно ввода Во спасибо. Видимо уже разучился читать до конца документацию Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SDV 784 Опубликовано: 9 июля, 2016 Команда создает на форма Form1 надпись и возвращает указатель на вновь созданный объект. @Zer0Galaxy, опять нубаский вопрос Вот есть объект надпись, как сделать чтобы он прорисовывал все что есть в цикле? Покажу на примере, есть инпут туда пишем число, enter - и в лейбле показывается 1, 2, 3 и т.д. Но не все сразу числа, а именно по одной (как в секундомере). Вообще это возможно с твоей либой прокрутить? Мне вообще нужно много чего что в цикле (for или while true) выводить (обновлять) данные (чтобы сами перерисовывались и что бы сам вызывал отображение надписей в циклах через кнопку). Но они всего лишь один раз вызываются и все. Перерисовываться почему-то не хотят ( :redraw() ) forms=require("forms") Form1=forms.addForm() function label(a) for i = 1, a do Label1=Form1:addLabel(2,2,i) Label1:redraw() end return b end Edit1=Form1:addEdit(10,10,function() label(Edit1.text) end) forms.run(Form1) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 9 июля, 2016 Вызывать в цикле функцию addLabel нет необходимости. Каждый вызов такой функции создает новый компонент-метку, тебе же нужно просто изменить надпись на уже существующей метке. Сделать это можно изменив поле caption и перерисовав метку: Label1.caption="New caption" Label1:redraw() Теперь о том по какому событию происходит смена надписи. Если ты просто вставишь эту смену в цикл for i=1,10 do Label1.caption=i Label1:redraw() end то увидишь лишь последнее значение метки, а тебе, как я понял, нужно сделать счетчик, который бы считал с определенным периодом. Можешь для этого использовать компонент-таймер Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SDV 784 Опубликовано: 9 июля, 2016 а тебе, как я понял, нужно сделать счетчик, который бы считал с определенным периодом. Ну почти, если быть точнее просто автообновляемые переменные чтобы не перезагружать по 100500 раз прожку чтобы посмотреть измененные данные (к примеру та же информация о computer.energy()). то увидишь лишь последнее значение метки, Жаль конечно, придется тогда "читерить" в этом случаи Все равно спасибо за консультацию, разраб Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 9 июля, 2016 Вот пример работы того, о чем я говорил forms=require("forms") --подключаем либу Form1=forms.addForm() --создаем форму Label1=Form1:addLabel(2,2,"0") -- создаем метку local Lmax=0 -- тут будем хранить крайнее значение метки function onTime() if Label1.caption>=Lmax then Timer1:stop() return end -- если достигли конца, тормозим таймер Label1.caption=Label1.caption+1 -- иначе, увеличиваем метку Label1:redraw() end Timer1=Form1:addTimer(1,onTime) -- создаем таймер с периодом 1 секунда Timer1:stop() -- пока притормозим его Edit1=Form1:addEdit(10,10, function() -- создаем поле ввода, по которому Label1.caption=0 -- сбрасываем метку в ноль Lmax=tonumber(Edit1.text) -- задаем крайнее значение Timer1:run() -- и запускаем таймер end) forms.run(Form1) -- старт всей конструкции А вот пример с computer.energy forms=require("forms") --подключаем либу Form1=forms.addForm() --создаем форму Label1=Form1:addLabel(2,2) -- создаем метку Timer1=Form1:addTimer(1,function() -- создаем таймер с периодом 1 секунда Label1.caption=computer.energy() -- в котором обновляем значение метки Label:redraw() -- и перерисовываем ее end) forms.run(Form1) -- старт всей конструкции Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SDV 784 Опубликовано: 9 июля, 2016 Вот пример работы того, о чем я говорил Спасибо, попробую эту конструкцию впихнуть себе. Глядишь и получиться "считерить" Было бы конечно интересно если бы lua (?), opencomputers (?) могли поддерживать многозадачность (или многопоточность, кому как интереснее , про эту либу я знаю. вот бы ее в эту гуи либку воткуть бы), чтобы тут например сами по себе обновлялись данные на экране в цикле, и ты же мог юзать прожку и не ждать пока закончится цикл (с while вообще фиг что с делаешь)... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах