Input Fields

Blitz3D Forums/Blitz3D Beginners Area/Input Fields

Hi, i was wondering how to make an input field. What i meen, is i want to make it so, you press a button, and it brings up a box, you can only type on the box, not anywhere else. I also want it to not end the programs execution. I am really not sure how to make an input field like so, that does not pause program execution. I would really love some help on this if anyone has the time. Thanks everyone!

First of all, you need a 'status' variable, and some status constants to be used for:
Global Status
Global Input_Text$ ;store the text input of the user
Global Input_Finished = False ;flag to indicate when the user is done with the input
Const S_NORMAL = 1
Const S_INPUT  = 2
Status = S_NORMAL


When the user presses the 'input text button', the status variable, which normally is set to S_NORMAL, will be set to status S_INPUT.

You need this status variable to decide, in your code, when your program should display a rectangle on the screen, simulating an imput text box, and when not:

while not keydown(1) ;while not esc is pressed

Cls

;code logic here

if keyhit(your_input_key) then ;make input box available
status = S_INPUT ;set the status variable
Input_Text$ = "" ;reset the input text
Input_Finished = False ;reset the input finished flag
endif

if Input_Finished then ;user pressed enter, so input has finished
status = S_NORMAL
endif

select Status
case S_NORMAL
    ;display everything but the input box
    ;check the keyboard as usually
case S_INPUT
    ;display everything + the input box
    ;check the keyboard for input box
    Input_Box() ;the function to read user input
    ;display an input box rectangle
    Rect 100,100,150,80
    ;display the text inside it
    Text 110,110,Input_Text$

end select
flip
wend


Let's now talk about the function Input_Box(). With this function, your program should get the user input, and update the variable string Input_Text$. You may use the GetKey command, which returns the ASCII value of a character, so that your program does not stop while executing the function Input_Box.

A short example would resemble like this:
Function Input_Box()
local av = GetKey() ;gets the ascii value of a pressed key
if av > 0 then ;a key has been pressed
;first check if the user has pressed enter
If av = enter_ascii_code then
Input_Finished = True
Return ;exit the function
endif
;we have to convert the ascii value, which is an integer, to the corresponding string character using the command Chr, and update the input text:

Input_Text = Input_Text + Chr(av)

endif
end function


Note that the function Input_Text() is not complete yet. In fact, you need to find out the ascii code of the enter key, and also handle the delete key. But I think - and hope - that the code provided will help you to find out the way, otherwise post again if you are in trouble :)

You may also find the code archive a mine gold; look in the topic 'User Input', you'll find functions that already make what you need:
http://www.blitzbasic.com/codearcs/codearcs.php?cat=5


Sergio.

Ya i believe i know how to do the rest, but if i do get stuck, i will post here

Thanks alot for your help! : D

also, theres some good ones in here:

http://www.blitzbasic.com/codearcs/codearcs.php?cat=5

look through them

I believe i need some more help if anyone can spare it.

I finished the code that Semar gave me above. Now my problem is getting the input box to appear when whatwaspicked=notebook. I dont know why it wont display any input box. Some help would be really appreciated.
Here is the code.

Graphics3D 640,480,16,2
SetBuffer BackBuffer()
type_bracket=1
type_arrow=2

light=CreateLight()
camera=CreateCamera()
PositionEntity camera,0,0,-1.5


Global Status 
Global Input_Text$ ;store the text input of the user 
Global Input_Finished = False ;flag to indicate when the user is done with the input 
Const S_NORMAL = 1 
Const S_INPUT = 2 
Status = S_NORMAL 

Function input_box()
Local av=GetKey() ;gets the ascii value of a pressed key
If av>0 Then ;a key has been pressed
;first check if the user has pressed enter
If av=13 Then
input_finished=True
Return ;exit the function
EndIf
;we have to convert the ascii value, which is an integer, to the corresponding string character using command Chr, and update the input text

input_text=input_text + Chr(av)

EndIf
End Function

;the notebook
notebook=CreateCube()
ScaleEntity notebook,.15,.15,.000001
EntityOrder notebook,-1
PositionEntity notebook,-1.3,.8,0
tex4=LoadTexture("notebook.jpg")
EntityTexture notebook,tex4
EntityPickMode notebook,2

Cls
;code logic here
If whatwaspicked=notepad Then ;make input box available
status=s_input ;set the status variable
input_tex$=" " ;reset the tex variable
input_finished=False ;reset the value of the integer flag
EndIf

Select statue
Case S_NORMAL
	;display everything but the input box
	;check the keyboard as usual
Case S_INPUT
	;displays everything + input box
	;Check the keyboard for input box
	Input_Box() ;check to read user input
	;displays an input box rectangle
	Rect 100,100,150,80
	;display the text inside it.
	Text 110,110,input_text$
	

End Select


You need a while..wend loop, which exits if the user press ESC, where to include the select status.

Also, in your code there's a typo, you have << select statue >> when it should be << select status >> instead. (statue-->status)

The variables whatwaspicked and notepad are not declared Global.

A flip command is needed to show the graphics.

Try starting with a simple 2D box, then improve it with the 3D cube.

Sergio.

Okay... Might I suggest getting a GUI DLL? That would probably simplify things... A BIT!!!

Im sorry, i dont really know much about global and local. I am new to blitz. I did not put in the entire code, cuz what i am doing is really really long. I do have a while..wend loop. While not keydown(1), then at the end it is, renderworld,flip, wend, end.


How do you declare it global? as i said, i dont know much about global and local, and i am trying to learn more of the blitz commands every day. I havent made it to trying out global and local yet though.

And Adam, what is a GUI DLL?

Okay, GUI stands for Graphics User Interface. (Look, I didn't invent the term! ^_ ) Anyway, a GUI is basically all the stuff that makes programs more usable; menus, buttons, extra pop-up windows, and so on. A DLL (just in case you don't know) is a file that "extends" an application like Blitz. In the case of Blitz Basic, a DLL adds more commands into your compiler. Check out the toolbox on this site (click the community tab, then click "Toolbox" underneath) for some various DLLs; I know there's at least one GUI DLL in there.

Oh k, ill look into that. can anyone also answer my first question please though?

The main difference between Global and Local variables is the scope - that is, the range of code where the variable retains its value.

When a variable is declared as Local, its scope is limited to the function - or the part of the code - where the variable were declared.

Consider this example:
test() ;call a test function
Print "MyLocal outside the function: " + MyLocal ;prints 0 because MyLocal scope is only inside the function

function test()
local MyLocal = 5
Print "MyLocal inside the function: " + MyLocal ;prints 5
end function


So, when you need a local variable, just for calculations an the like, then use Local.

Instead, when you need a variable to be accessed in every point of your code - that is, in every function and every place of your code - then use Global declaration.

A variable can be declared Global only in the main part of your code - that is, you can't declare a Global variable inside a function.

Time for another example:
Global MyGlobal$ = "mintybreath"
;call a test function
print MyGlobal; prints "mintybreath"
test()
print MyGlobal ;prints "Hello mintybreath"

function test()
MyGlobal = "Hello " + MyGlobal ;updates the global variable
end function


To summarize: use Global when you need a global scope for your variable. Example: score, player name, speed, etc.

Use Local when you need to compute some value which is only temporary needed.

Don't forget also Costants. A Costant does not change its value, and it's also global by default - that is, you can access it in every piece of your code, exactly like a global variable. But the Costant value can't be changed:
Const PI# = 3.14
print "PI outside the function = " + PI; prints 3.14
test() ;call our lovely test function

;uncomment the next line to generate a compile error: a constant value can't be changed
;pi = pi + 1 ;generates a compile error.

function test()
print "PI inside the function = " + PI ;prints 3.14
end function

Hope this helps,
Sergio.