In this tutorial I'll show you how to get line inputs from a Text box (or String for that matter) and get a String from it, just as if the Text box was in a file and you were using the LineInput statement. Getting inputs from a Text box has many advantages. One reason is to save time. You may find yourself editing a text file in Notepad, saving it, loading it into your game or editor and, testing the results. You could, however, write your data to a text box and test the results. By doing so, you wouldn't have to go through the time consuming opening and saving and opening. You can just see your results, make a small change in the Text box and test the results again. With my Function you can just substitute your LineInput statements with the Rline Functions. Another good reason to do this is incase your program has to reformat the incoming data from a file and read it again. If you have Encrypted save files you may have to unencrypt them to another file and read the valid information from it. This permits the user's spying eyes find the Unencrypted file, which gives them a better chance at cracking your Encryption. You can save yourself the embarrassment if you unencrypt the file to a Text box, which is harder to find in memory. All of which, are reasons I chose to do this.
Sure, reading from Text boxes can be easy. But, if you are like me, a game programmer, who rarely deals with Text boxes and detailed strings, may find that he/she is wasting a lot of time getting single lines from a Text box. And the data may not be as accurate as you'd like.
Well "Here I come to save the day". I have taken the liberty, after I have spent a couple hours to figure this out, to write a tutorial explaining how I did it.
I first, wrote my main Function. It goes like this.
Public Function Rline(Text As String, SPos As Integer, RetPos As Integer) As String
If SPos >= Len(Text) Then
Let Rline = "EOF"
Let RetPos = 0
Exit Function
End If
Dim L 'The length of our search
If SPos = 0 Then Let SPos = 1
For L = 1 To Len(Text) - SPos + 1
Let Rline = Mid(Text, SPos, L)
If Right(Rline, 2) = Chr(13) & Chr(10)
Then Exit For
Next
If L >= Len(Text) Then
Let RetPos = 0
Else
Let RetPos = SPos + Len(Rline)
End If
If Right(Rline, 2) = Chr(13) & Chr(10) Then
Let Rline = Left(Rline, Len(Rline) - 2)
End If
End Function
Wow, That's a lot! Most of it handles all the fixing up of the returned string for you. To get the Function we pass the Text that we are searching through (ex: Text1.Text), the position that we are starting our search from (SPos) and a variable that will later tell us where the search ended (RetPos). The Function itself will return the line found in the Text.
The first thing you may notice is an IF statement that may seem unnecessary at the time. This probably won't be necessary the first, second, or third time you run the function but if you keep running it, it will come in handy. I'll explain that a bit more later.
The next thing you see is the Declaration of a variable, simply called L. L is the variable that we are going to use to let us know where we are in the Text box. This is important to know incase we try to search beyond the length of our Text box. By keeping track of L, we reduce the risk of getting an error.
The next line also reduced the risk of getting an error. Because SPos may be a zero and we can't search a string at a nonexistent position, we set it to 1 (one).
The For...Next loop starts the search from the start position (SPos) and can only continue as far as the distance from the start position to the end of the Text. Inside the loop we keep adding the next character to our line. When a line break is found (Chr(13) & Chr(10)) we prematurely exit the loop. If a line break is not found then we exit the loop when the end of the text has been reached.
The If...Then...Else statement determines where the search and line ended and if the end of the Text was reached.
The last lines make sure the line break is taken out of our returned line, if there is one.
The next thing you need to do is declare some variables. You may want to change them to Public variables if you are declaring them outside the Form or Module that you will be calling to the Function from. They are as shown:
Dim MyLine As String
Dim BeginOfSearch As Integer
Dim EndOfSearch As Integer
And execute the function as follows, with those variables:
MyLine = Rline(Text1.Text, BeginOfSearch, EndOfSearch)
MyLine will be set the the next available
line in the text.
Text1.Text can be replaced with the Text
box or String that you are getting the lines from.
BeginOfSearch tells the function where
to start searching for the next line.
EndOfSearch will become the position in
Text1.Text (or whatever) where the search
as ended.
You are now ready to work with MyLine as if it came strait from an external file.
If you have started at the beginning or somewhere in the middle of the Text box and wish to continue on to the next line you just set the beginning of your next search to the end of the last search:
Let BeginOfSearch = EndOfSearch
And just simply call the function again...
MyLine = Rline(Text1.Text, BeginOfSearch, EndOfSearch)
If and when you have reached past the end of the Text box, you will be notified. The function will return the string "EOF" and the end of the search (EndOfSearch) will be set to zero, the next time you try to get input form the Text box. This is all done by the first couple of lines, which seemed pointless at the time.
And there you have it. I encourage you to use this function if it will save you any amount of time or help your program seem more professional to those people searching your work for a flaw.
Note: There is only one flaw. If your last line only contains a single character it will not appear. If this is your case then I suggest that you add a line to the end that you may use to determine the end of the text box.