←  Ask a Pro

ComputerCraft | Programmable Computers for Minecraft

»

read() add string into read before writing

TechnicalCoding's Photo TechnicalCoding 29 Jun 2016

I am creating something to an operating system, I also want some kind of "memory" to it, and thats good, but what I am having problems to understand is how I can assign text/string to read() before anyone starts writing to it?

EXAMPLE
---------------------------
I have an username variable which use read, they get 3 attempts trying to figure out right details but I want that after first attempt I want the same username to appear to second so no one needs to rewrite the username.


Any ideas? Thanks
Quote

KingofGamesYami's Photo KingofGamesYami 29 Jun 2016

So basically like a text field that has a description in it before you start typing? It's not exactly easy, but you *can* do it.
Quote

TechnicalCoding's Photo TechnicalCoding 29 Jun 2016

View PostKingofGamesYami, on 29 June 2016 - 01:02 AM, said:

So basically like a text field that has a description in it before you start typing? It's not exactly easy, but you *can* do it.

Not exactly an description, but I want it to contain itself, basicly I am using a while loop to make it go over and over again, and for each time it has to repeat I want it to contain the string it had before the it kind of overlap itself, so basicly just using itself (or duplicate it) to make it just contain itself again..
Quote

eniallator's Photo eniallator 29 Jun 2016

View PostTechnicalCoding, on 29 June 2016 - 02:48 AM, said:

View PostKingofGamesYami, on 29 June 2016 - 01:02 AM, said:

So basically like a text field that has a description in it before you start typing? It's not exactly easy, but you *can* do it.

Not exactly an description, but I want it to contain itself, basicly I am using a while loop to make it go over and over again, and for each time it has to repeat I want it to contain the string it had before the it kind of overlap itself, so basicly just using itself (or duplicate it) to make it just contain itself again..

what about you have an option before you get to the login screen where you can quickly login from. for example like a button that has the username that will show an input field where you put in your password instead of both the username and the password.
Quote

LBPHacker's Photo LBPHacker 29 Jun 2016

EDIT: Do check out the answer below this one first. It's way more crafty and simple.

Re-implementing read in a way that it accepts a 4th parameter which defaults to an empty string if not passed is an option. You'd probably end up with more code than sense, though. For example, the history code is completely useless here.

local function read( _sReplaceChar, _tHistory, _fnComplete, initial_sLine ) -- note the new parameter initial_sLine
	term.setCursorBlink( true )

	local sLine = initial_sLine or "" -- empty string used if initial_sLine is not passed (or it's nil/false)

	... -- the rest of read() as seen in bios.lua
end

read(nil, nil, nil, "initial text") -- you'd call it like this

Full code, in case you have never seen bios.lua before

EDIT: You can just call it with the last result it returned if you want it to remember the input.

local last
while ... -- some loop
	last = read(nil, nil, nil, last)
end

Edited by LBPHacker, 29 June 2016 - 06:39 PM.
Quote

Anavrins's Photo Anavrins 29 Jun 2016

A simple way to achieve this is queueing every characters as a char event before read()
local init = "hello world"
for c in init:gmatch(".") do os.queueEvent("char", c) end
read() #-- Will start with "hello world" already written
Or in a format similar to your function
local function newread(sReplaceChar, tHistory, fnComplete, initial_sLine)
  for c in (initial_sLine or ""):gmatch(".") do os.queueEvent("char", c) end
  return read(sReplaceChar, tHistory, fnComplete)
end

Edited by Anavrins, 29 June 2016 - 06:18 PM.
Quote

Bomb Bloke's Photo Bomb Bloke 30 Jun 2016

You could alternatively use the "history" feature already built into the read function.

http://www.computerc....info/wiki/Read

Eg:

read(nil, {"Tom", "Dick", "Harry"})

The user can then use up/down to go through these entries. This is how CraftOS and the Lua console let you get at previously typed commands.
Quote