Перейти к публикации
Форум - ComputerCraft
Zer0Galaxy

[OC] "Лёгкая" библиотека GUI

Рекомендованные сообщения

...

У меня очень глупый вопрос :D

"TComponent.__index = TComponent" позволяет обращаться в формате "Бла-бла-бла:функция()"? Ну через двоеточие, короче? :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

TComponent.__index = TComponent — это чудеса метамагии.

Есть класс TComponent. При создании нового объекта ему присваивается класс как метатаблица. Однако методы и пр. не копируются. В объекте их нет, по сути. Метапараметр __index задаёт, где искать недостающие методы.

Сначала, например, он будет искать значение в таблице объекта, а потом — в таблице __index (то есть, в классе).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

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

@Zer0Galaxy, то ли лыжи не едут, то ли я еб***тый :blink:

Объясни на примере как сделать чтобы то что ввел в инпут можно потом вывести на экран (или вообще в другую переменную).

Не пойму просто как вытянуть переменную окна ввода в функцию печати на экран.

Пример:

function text(a)
return print(a)
end

Edit1=Form1:addEdit(10,10,function() text(??Какую переменную пишем??) end)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

function text(a)
return print(a)
end
 
Edit1=Form1:addEdit(10,10,function() text(Edit1.text) end)

 

 

text - строка текста, введенного в окно ввода.

 

 

(или вообще в другую переменную).
local a=Edit1.text 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

text - строка текста, введенного в окно ввода

Во спасибо.

Видимо уже разучился читать до конца документацию :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Команда создает на форма 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)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вызывать в цикле функцию addLabel нет необходимости. Каждый вызов такой функции создает новый компонент-метку, тебе же нужно просто изменить надпись на уже существующей метке. Сделать это можно изменив поле caption и перерисовав метку:

Label1.caption="New caption"
Label1:redraw()

Теперь о том по какому событию происходит смена надписи. Если ты просто вставишь эту смену в цикл

for i=1,10 do
  Label1.caption=i
  Label1:redraw()
end

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

Можешь для этого использовать компонент-таймер

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

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

Ну почти, если быть точнее просто автообновляемые переменные чтобы не перезагружать по 100500 раз прожку чтобы посмотреть измененные данные (к примеру та же информация о computer.energy()).

 

 

 

то увидишь лишь последнее значение метки,

Жаль конечно, придется тогда "читерить" в этом случаи :D

 

Все равно спасибо за консультацию, разраб :smile9:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот пример работы того, о чем я говорил

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) -- старт всей конструкции

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот пример работы того, о чем я говорил

Спасибо, попробую эту конструкцию впихнуть себе. Глядишь и получиться "считерить" :smile9:

 

Было бы конечно интересно если бы lua (?), opencomputers (?) могли поддерживать многозадачность (или многопоточность, кому как интереснее :D , про эту либу я знаю. вот бы ее в эту гуи либку воткуть бы), чтобы тут например сами по себе обновлялись данные на экране в цикле, и ты же мог юзать прожку и не ждать пока закончится цикл (с while вообще фиг что с делаешь)...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну, если говорить строго, данные на экране обновляются не в цикле, а с периодом. Именно для этого и предназначен компонент-таймер (см. пример с computer.energy). Применение таких таймеров реализует своего рода многопоточность ибо работа таймера никак не должна влиять на работу остального кода.

К стати, не рекомендую использовать многопоточность на основе thread совместно с forms. Они могут передраться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

К стати, не рекомендую использовать многопоточность на основе thread совместно с forms. Они могут передраться.

Окей, если бы все было с ними хорошо, то они бы давно бы были как одно единое целое  B-) 

 

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

На форуме я в частности насчитал лишь 3 штуки (возможно и больше есть, но эти либы в топе раздела): твоя, либа от Крутого, ну и всеми забытого нами господина Элиты, мать его, ECS :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

onEnter - (функция) обработчик окончания ввода
Что за обработчик окончания ввода? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я уже 1 год не могу понять! Как вытащить текст из edit чтобы он записался в переменную?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я уже 1 год не могу понять! Как вытащить текст из edit чтобы он записался в переменную?

Edit1.text не пробовал присваивать переменной?

Изменено пользователем Ingr

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я уже 1 год не могу понять! Как вытащить текст из edit чтобы он записался в переменную?

Edit может работать в двух режимах: редактор строки и редактор текста. По умолчанию он настроен на редактирование строки. В этом случае строка вытаскивается из редактора просто чтением поля text

var = Edit1.text

Если перед началом редактирования полю text присвоить пустую (или не пустую) таблицу

Edit1.text = {}

то редактор переходит в режим редактирования многострочного текста. В этом случае каждая строка текста доступна как элемент таблицы

var = Edit1.text[1]
Изменено пользователем Zer0Galaxy

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Отличная библиотека, простая и удобная.
Было бы неплохо добавить что-то типа :isActive() для Timer и Event, а также :addEvents("key_down","key_up",...) для форм (возможно в другом формате).

Изменено пользователем AndySingularity

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Было бы неплохо добавить что-то типа :isActive() для Timer и Event
 

Я забыл упомянуть в описании, таймер имеет поле Enabled, которое принимает значение true, когда таймер работает и false в противном случае. А для события даже не представляю как это сделать. Событие ведь не приостанавливается, в отличии от таймера. Его можно только уничтожить методом Event1:destruct().

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А как можно получить user-а, нажавшего кнопку? Например, есть кнопка "ВХОД", как при нажатии на эту кнопку в функцию-обработчик передать ник-нейм нажавшего(user)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
А как можно получить user-а, нажавшего кнопку? Например, есть кнопка "ВХОД", как при нажатии на эту кнопку в функцию-обработчик передать ник-нейм нажавшего(user)?
Описание обработчика onClick устаревшее. В обработчик передается еще один параметр - ник пользователя, нажавшего кнопку. Просто в обработчике добавь еще один параметр: user. Должно получиться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А как насчет двойной буферизации? Пусть библиотека и "лёгкая", тем не менее очень удобная.
Я вот с нее начинал. Глубоко проникся. Однако проект вырос - нагрузка выросла. Нет ну совсем никакого желания переписывать графический интерфейс с нуля, особенно если увидеть масштаб документации (с этой же библиотекой можно разобраться в считаные минуты).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Библиотека довольно самодостаточная, в ней только самые нужные функции, но можно добавлять свои модули.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

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

Не понял, при чем тут демон?
То, как я себе это представляю: написать обертку для gpu компонента, являющуюся промежуточным звеном между этой библиотекой и библиотекой двойной буферизации. Тогда можно работать с такой оберткой как с gpu. Если об этом и была речь, то эту штуку и хотелось бы.  :D
Хотя это уже совсем другая библиотека, да.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Господа люди умные, подскажите смертному простому косяк его

в зачатке программы при нажатии на кнопки изменяется переменная 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)

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Оо"

год прошел :D

я уже переписал вроде-бы...

или нет, не помню

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Привет! Поясните как должен выглядеть вызов функции по кнопке.

 

Так
 

Form:addButton(20,5,"Open file",function() Моя функция() end)

или так?

Form:addButton(20,5,"Open file", Моя функция())

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

Привет! Поясните как должен выглядеть вызов функции по кнопке.

 

Так

 

Form:addButton(20,5,"Open file",function() Моя функция() end)

или так?

Form:addButton(20,5,"Open file", Моя функция())

Вот так:

function My_func()
-- что-то там
end

Form:addButton(20,5,"Open file", My_func) -- без скобочек

Но можно и анонимной функцией

Form:addButton(20,5,"Open file", function () -- что-то там -- end)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
огромного костыля в виде таймера и pullSignal

Родина дала тебе event.listen, используй его мудро!

 

Вот пример кода

local valid_users = {["man_cubus"] = true}

local function valid(name)
  return valid_users[name]
end

function common.motion_handler(...)
local evt = {...}
  -- evt[1] всегда равно "motion" потому что именно это событие мы и будем слушать,
  -- остальные поля в соответствии с описанием события на ocdoc.cil.li
  if valid(evt[6]) then
    common.red_actions.process_sensor(evt[2]) --[[эта функция тут не показана,
    но evt[2] - это будет адрес сенсора движения, от которого поймано сообщение]]
  end
end

common.event.listen("motion", common.motion_handler)
Изменено пользователем man_cubus
  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×