Microsoft Small Basic

Program Listing: WZH765-0
Initialise()

GraphicsWindow.KeyDown = OnKeyDown 'fires repeatedly when key is down
GraphicsWindow.KeyUp = OnKeyUp

'WHICH IS 1st? Text typed in TextBox or KeyDown. On the surface there's no garauntee. They're independent.
'So using LastTypedTextBox or GetTextBoxText in OnKeyDown implies that they aren't independent.
'This Solution for read-only is while OnKeyDown is firing set the TextBox text with expilicit text stored in rOnlyText[]

Sub OnKeyDown
For i = 1 To Array.GetItemCount(rOnly)
Controls.SetTextBoxText(rOnly[i], rOnlyText[i])
EndFor
EndSub

Sub OnKeyUp
If Array.ContainsValue(readOnly, Text.GetSubTextToEnd(Controls.LastTypedTextBox, 8)) Then
GraphicsWindow.ShowMessage("This Field is READ-ONLY!" + Text.GetCharacter(13) + "Click OK to continue", "READ-ONLY")
EndIf
EndSub

'=====================================================================
'Initialise
'=====================================================================
string = "" 'Garbage
tb = ""

Sub Initialise
string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. "
tb = "w=200;h=60;gap=10"
readOnly = "1=3;2=8;3=9;4=14;5=17"

'Adds rOnly[] & txtBox[] Controls. Expilicity stores the text of rOnly[] in rOnlyText[]. Adds these Controls left to right & sets them with random text.
For r = 1 To 6
For c = 1 To 3
If Array.ContainsValue(readOnly, Array.GetItemCount(txtBox) +1 + Array.GetItemCount(rOnly)) Then
GraphicsWindow.BrushColor = "DarkGray" 'is read only
rOnly[Array.GetItemCount(rOnly) +1] = Controls.AddMultiLineTextBox(tb["gap"] *c + tb["w"] *(c-1), tb["h"] * (r-1) + tb["gap"] *r)
Controls.SetSize(rOnly[Array.GetItemCount(rOnly)], tb["w"], tb["h"])
Controls.SetTextBoxText(rOnly[Array.GetItemCount(rOnly)], Text.GetSubText(string, Math.GetRandomNumber(100), 10))
rOnlyText[Array.GetItemCount(rOnlyText) +1] = Controls.GetTextBoxText(rOnly[Array.GetItemCount(rOnly)])
Else
GraphicsWindow.BrushColor = "Black" 'is read - write
txtBox[Array.GetItemCount(txtBox) +1] = Controls.AddMultiLineTextBox(tb["gap"] *c + tb["w"] *(c-1), tb["h"] * (r-1) + tb["gap"] *r)
Controls.SetSize(txtBox[Array.GetItemCount(txtBox)], tb["w"], tb["h"])
Controls.SetTextBoxText(txtBox[Array.GetItemCount(txtBox)], Text.GetSubText(string, Math.GetRandomNumber(100), 10))
EndIf
EndFor
EndFor

GraphicsWindow.CanResize = 0
GraphicsWindow.Title = "Read Only TextBoxes"
GraphicsWindow.Width = (tb["w"] + tb["gap"]) * (c-1) + tb["gap"]
GraphicsWindow.Height = (tb["h"] + tb["gap"]) * (r-1) + tb["gap"]
EndSub