Перейти к содержимому
  • 0
Zer0Galaxy

Оператор read()

Вопрос

При вызове функции term.read() все символы, находящиеся в той же строке справа от курсора очищаются, а при вызове io.read() - по мере ввода смещаются вправо.

Существует ли простой способ ограничивать поле ввода так, чтобы символы справа от этого поля не изменялись, а вводимая строка при достижении конца поля смещалась влево, как если бы достигала конца экрана?

Вариант написать свою функцию read не рассматривается.

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


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

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

Написать свою функцию не read, а superread() :)

В условии запрещено писать свою ф-кцию read, про superread() никто ничего не говорил.

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


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

term.read в параметрах имеет только таблицу истории. io.read тоже приспособить вряд-ли получится. Похоже, только писать свой read

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


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

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

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


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

Можно еще не писать функцию. Вообще зачем функция? Будем вместо функции использовать стопку кода. :D

io:stdin кто-то смотрел?

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

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


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

Можно еще не писать функцию. Вообще зачем функция? Будем вместо функции использовать стопку кода. :D

io:stdin кто-то смотрел?

С goto для входа и меткой для выхода

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


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

А я уже писал как-то свой read():D Сделал даже интерпретатор для биуса:D 

keys={noconvert=123,numpadenter=156,delete=211,[73]="numpad9",[146]="colon",numpadadd=78,up=200,[18]="e",[36]="j",numpadequals=141,[144]="circumflex",[54]="rshift",kanji=148,[179]="numpadcomma",[71]="numpad7",equals=13,apostrophe=40,ax=150,[35]="h",[70]="scroll",right=205,[53]="slash",pageDown=209,period=52,[69]="numlock",f7=65,pause=197,[210]="insert",[17]="w",numpaddecimal=83,[68]="f10",[26]="lbracket",[52]="period",[104]="f17",[208]="down",f6=64,[103]="f16",[33]="f",[66]="f8",numpad4=75,[102]="f15",f10=68,[65]="f7",[145]="at",[101]="f14",grave=41,f8=66,[16]="q",f19=113,[25]="p",[50]="m",[100]="f13",pageUp=201,[77]="numpad6",convert=121,f1=59,[14]="back",[157]="rcontrol",f14=101,["end"]=207,[42]="lshift",[200]="up",[13]="equals",home=199,[49]="n",[7]="6",[31]="s",[88]="f12",["6"]=7,["5"]=6,["4"]=5,["3"]=4,["2"]=3,["1"]=2,colon=146,[6]="5",[12]="minus",f9=67,[48]="b",numpadsub=74,[64]="f6",[181]="numpaddiv",[62]="f4",[209]="pageDown",[40]="apostrophe",e=18,[45]="x",[55]="numpadmul",slash=53,[44]="z",f15=102,[56]="lmenu",[47]="v",circumflex=144,[67]="f9",[201]="pageUp",[11]="0",[2]="1",[3]="2",[4]="3",minus=12,[22]="u",rcontrol=157,[149]="stop",numpad6=77,[23]="i",[46]="c",insert=210,[184]="rmenu",numpadcomma=179,[147]="underline",[105]="f18",[43]="backslash",numpad5=76,numpaddiv=181,f13=100,f=33,f12=88,d=32,c=46,f3=61,a=30,[59]="f1",[63]="f5",f11=87,stop=149,l=38,k=37,enter=28,i=23,h=35,g=34,v=47,u=22,t=20,s=31,r=19,q=16,lshift=42,numpadmul=55,["0"]=11,[211]="delete",[87]="f11",[27]="rbracket",[123]="noconvert",["9"]=10,at=145,["7"]=8,yen=125,["8"]=9,f2=60,[61]="f3",numpad2=80,[34]="g",numpad3=81,[207]="end",lcontrol=29,[76]="numpad5",[51]="comma",[121]="convert",scroll=70,[21]="y",[205]="right",[15]="tab",[30]="a",[60]="f2",[78]="numpadadd",f16=103,numlock=69,[203]="left",[83]="numpaddecimal",[141]="numpadequals",backslash=43,[125]="yen",[8]="7",[9]="8",[41]="grave",[82]="numpad0",numpad8=72,rbracket=27,[72]="numpad8",[24]="o",[19]="r",[199]="home",[81]="numpad3",lbracket=26,f5=63,[5]="4",[10]="9",[20]="t",[197]="pause",[80]="numpad2",numpad0=82,o=24,f17=104,back=14,[32]="d",semicolon=39,[79]="numpad1",b=48,n=49,m=50,j=36,p=25,[39]="semicolon",lmenu=56,[156]="numpadenter",[57]="space",z=44,y=21,x=45,w=17,numpad1=79,down=208,space=57,[113]="f19",[29]="lcontrol",f4=62,[38]="l",left=203,[28]="enter",underline=147,[112]="kana",numpad9=73,numpad7=71,comma=51,[75]="numpad4",[150]="ax",tab=15,kana=112,f18=105,rmenu=184,[37]="k",[74]="numpadsub",[148]="kanji",rshift=54}
if require then
	component=require("component")
end
_G.History={}
function read(x, y, maxlen)
	if require then
		gpu=require("component").gpu
		unicode=require("unicode")
	else
		gpu=component.proxy(component.list("gpu")())
	end
	_G.inHistory=(#_G.History)+1
	W, H = gpu.getResolution()
	if maxlen==nil then
		maxlen=W-x
	end
	canRead=true
	text=""
	gpu.fill(x, y, x+maxlen, y, " ")
	isBig=false
	while canRead do
		local evName, _, DATA, key = computer.pullSignal()
		if evName=="key_down" and key==201 then --
		else
		if evName=="key_down" then
		local	key=keys[key]
			if key=="back" then
				if #text>0 then
					text=string.sub(text, 0, #text-1)
				end
			elseif key=="enter" then
				canRead=false
			elseif key=="space" then
				text=text.." "
			elseif key=="lshift" then 
				isBig=true
			elseif key=="lcontrol" then
				canRead=false
				text="interrupted"
			elseif key=="rcontrol" then
				--
			elseif key=="rshift" then
				--
			elseif key=="9" and isBig==true then
				text=text.."("
				isBig=false
			elseif key=="0" and isBig==true then
				text=text..")"
				isBig=false
			elseif key=="APOSTROPHE" then
				text=text..'"'
			elseif key=="apostrophe" then
				text=text.."'"
			elseif key=="slash" then 
				if isBig==false then
					text=text.."/"
				else
					text=text.."?"
				end
				isBig=false
			elseif key=="1" and isBig==true then
				text=text.."!"
				isBig=false
			elseif key=="2" and isBig==true then
				text=text.."@"
				isBig=false
			elseif key=="3" and isBig==true then
				text=text.."#"
				isBig=false
			elseif key=="4" and isBig==true then
				text=text.."$"
				isBig=false
			elseif key=="5" and isBig==true then
				text=text.."%"
				isBig=false
			elseif key=="6" and isBig==true then
				text=text.."&"
				isBig=false
			elseif key=="8" and isBig==true then
				text=text.."*"
				isBig=false
			elseif key=="minus" then
				if isBig==true then 
					text=text.."_"
				else
					text=text.."-"
				end
				isBig=false
			elseif key=="period" then
				text=text.."."
			elseif key=="comma" then
				text=text..","
			elseif key=="lbracket" then
				if isBig==true then
					text=text.."{"
					isBig=false
				else
					text=text.."["
				end
			elseif key=="rbracket" then
				if isBig==true then
					text=text.."}"
					isBig=false
				else
					text=text.."]"
				end
			elseif key=="equals" then
				text=text.."="
			elseif key=="up" then
				if inHistory>=1 and inHistory>=2 then
					table.insert(_G.History, text)
					_G.inHistory=inHistory-1
					text=History[inHistory]
				end
			elseif key=="down" then
				if inHistory<#History then
					_G.inHistory=inHistory+1
					text=History[inHistory]
				end
			elseif key=="insert" then
				--
			elseif string.find(key, "numpad") then
				if	#text+1<=maxlen then
					key=string.sub(key, #key, #key)
					if	key=="l" then
						text=text.."."
					elseif key=="d" then
						text=text.."+"
					elseif key=="b" then
						text=text.."-"
					else
						text=text..key
					end
				end
			else 
				if	#text+1<=maxlen then
					if isBig==true then
						text=text..unicode.upper(key)
						isBig=false
					else
						text=text..key
					end
				end
			end
		elseif evName=="clipboard" then
			text=text..DATA
		end
		gpu.fill(x, y, x+maxlen, y, " ")
		gpu.set(x, y, text)
	end 
	end
	table.insert(_G.History, text)
	return text
end
function bindComponents()
	local coms=component.list()
	for address in coms do
		com=coms[address]
		if com~="computer" then
			_G[com]=component.proxy(com)
		end
	end
end
function _G.print(data)
	W, H = gpu.getResolution()
	if type(data)=="string" then
		gpu.fill(1, H, W, H, " ")
		gpu.set(1, H, data)
	elseif type(data)=="table" then
		gpu.fill(1, 5, W, H-1, " ")
		i=5
		for func in pairs(data) do
			gpu.set(1, i, func)
			i=i+1
		end
	end
end
function get(url)
 local inet = component.proxy(component.list("internet")())
local request, reason = inet.request(url)
if not request then return '' end
local text = ''
while true do
local data, reason = request.read()
if not data then 
request.close()
break
elseif #data > 0 then
text = text..data
end
end
return text
end
function runWeb(url)
pcall(load(get(url)))
end
function _G.clear()
	gpu.fill(1, 1, W, H, " ")
end
bindComponents()
while true do
	command=read(1, 1)
	local happened, result=pcall(load(command))
	W, H = gpu.getResolution()
	gpu.fill(1, 2, W, 3, " ")
	gpu.set(1, 2, tostring(happened))
	if result~=nil then
		gpu.set(1, 3, result)
	end
end

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


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

А я уже писал как-то свой read():D Сделал даже интерпретатор для биуса:D 

Задачей было не написать врид. -_-

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


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

Задачей было не написать врид. -_-

Знаю. Просто показал:D Создавать под ЭТО отдельную тему-глупо:)

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


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

Тоже занимался таким же вопросом на гуи библе для СС, пришлось написать свою реализацию на ивентах.

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


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

Да, вопрос возник при написании гуи. Так у меня вся библиотека гуи получилась меньше чем одна функция read

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


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

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...