Ok... To me this is looking very much like Bplus has a "BUG" with either passing a var. , or FormatTextAreaText has a problem accepting a var. for it's lentgh.
When you run this code arrow up and insert a quote ("kkk"). You should see blue text from the open point of the quote to the end of the text.
Now look at the status bar in the window. It shows the Quote starting charactor position as well as the length of the quote. They are right! When these vars are passed to FormatTextAreaText the starting charactor position gets through ok but not the length. If you were to replace the length var. in FormatTextAreaText with a litieral number it works.
edit - See the Highlite function.
Try it out for yourself. Let me know if this can be duplicated on other Windows systems other then Win98.
Global Win1
Global TEXTAREA1
Global Tree1
Global Button1
CreateWin1()
Global tcur
;load_command
Global cmd_cnt
Dim my_command_sort$(25,100)
Dim my_command_index(25,1)
Global s_command_flag
Dim my_command$(1000)
;load_commands()
Type element
Field name$
Field row
End Type
Type token
Field comment
Field comment_pos
Field o_quote
Field o_quote_pos
Field c_quote
Field c_quote_pos
Field quote
End Type
Type token_data
Field token$
Field o_token_pos
Field c_token_pos
End Type
Type token_quote
Field o_quote_pos
Field c_quote_pos
End Type
Global seperator$=";"
AddTextAreaText textarea1,"kkkkkkkkkkkkkkkkkkk"+Chr$(10)+"kkkkkkkkkkkkkkkkkkk"+Chr$(10)+"kkkkkkkkkkkkkkkkkkk"+Chr$(10)+"kkkkkkkkkkkkkkkkkkk"+Chr$(10)
HotKeyEvent 28,0,$103,28 ;retuen key
Global root=TreeViewRoot( tree1 )
ActivateGadget textarea1
While WaitEvent()<>$803
id=EventID()
If id=$401 ;gadget event
event_gadget()
EndIf
If id=$103 ;on key event
event_key()
EndIf
Wend
Function event_key()
es=EventData()
Select es
Case 28
End Select
End Function
Function event_gadget()
Select EventSource()
Case textarea1
row=TextAreaCursor( textarea1,2 )
syntax_highlite(row)
End Select
End Function
Function syntax_highlite(row)
total_rows=TextAreaLen( textarea1,2 )
tlength=TextAreaLineLen(textarea1,row);"Curnt Line Length (tlength):"+tlength
charp=TextAreaChar( textarea1,row ) ;1st char Line (charp)
ctext$=TextAreaText(textarea1,charp,tlength,1) ;line text
get_token(ctext$)
highlite(ctext$,charp,tlength)
End Function
Function get_token(ctext$)
tpos=Len(ctext$)
t.token=New token
For i=1 To tpos
;Comment
tk$=Mid$(ctext$,i,1)
If tk$="'" And t\comment=0
t\comment=1
t\comment_pos=i
EndIf
;Quote
If tk$=Chr$(34)And t\comment=0 And q_flag_o=0
q_flag_o=1
tq.token_quote=New token_quote
tq\o_quote_pos=i
EndIf
If q_flag_o=1 And tk$<>Chr$(34)
q_flag=1
EndIf
If tk$=Chr$(34)And t\comment=0 And q_flag=1
q_flag=0
tq\c_quote_pos=i
t\quote=1
q_flag_o=0
EndIf
Next
End Function
Function highlite(ctext$,charp,tlength)
Local otmp ; Open position of quote
Local ctmp ; Close Position of quote
FormatTextAreaText (textarea1,0,0,0,1,(charp),(tlength),1)
t.token=First token
If t\comment=True
FormatTextAreaText (textarea1,0,0,255,1,(charp+t\comment_pos)-1,((tlength)-t\comment_pos)+1,1)
;FormatTextAreaText (textarea1,0,0,255,1,(charp+t\comment_pos),((tlength)-t\comment_pos),1)
EndIf
If t\quote=True
For tq.token_quote=Each token_quote
ctmp=(tq\c_quote_pos - tq\o_quote_pos)
otmp=(charp + tq\o_quote_pos)
SetStatusText win1,"Open Quote Position:"+otmp+" Close Quote Length:"+ctmp
FormatTextAreaText textarea1,0,0,255,1,otmp,ctmp,1
Delete tq
Next
EndIf
Delete t
;FormatTextAreaText (textarea1,0,0,0,1,charp,tlength,1)
End Function
Function IsAlpha( i$ )
t=Asc(i$)
If ( (t>=65 And t<=(65+26) ) Or (t>=97 And t<=97+26) )
Return True
Else
Return False
EndIf
End Function
; ----Function Begins----
Function CreateWin1()
Win1 = CreateWindow("Window1",203,155,434,439,Desktop(),7+8)
TEXTAREA1 = CreateTextArea(15,39,225,338,Win1,0)
SetGadgetLayout TEXTAREA1,1,0,1,0
Tree1 = CreateTreeView(256,42,150,320,Win1,0)
SetGadgetLayout Tree1,1,0,1,0
;Button1 = CreateButton("Exit",273,323,118,44,Win1,0)
;SetGadgetLayout Button1,1,0,1,0
End Function
Edit - I just edited this so I can copy it to BPlus bug reports..
This is some kind of BUG for sure. If I iterate a sequnce of numbers in a linear fasion into array then use the array to simulate a number it works.
Adding this to the header of the code:
Dim num(1001)
For i=0 To 1000
num(i)=i
Next
Next to get FormatTextAreaText to work the length has to be done like this:
FormatTextAreaText textarea1,0,0,255,1,pos,num(index),1
or to look at it from the highlite functions "point of view":
Function highlite(ctext$,charp,tlength)
Local otmp ; Open position of quote
Local ctmp ; Close Position of quote
FormatTextAreaText (textarea1,0,0,0,1,(charp),(tlength),1)
t.token=First token
If t\comment=True
FormatTextAreaText (textarea1,0,0,255,1,(charp+t\comment_pos)-1,((tlength)-t\comment_pos)+1,1)
;FormatTextAreaText (textarea1,0,0,255,1,(charp+t\comment_pos),((tlength)-t\comment_pos),1)
EndIf
If t\quote=True
For tq.token_quote=Each token_quote
ctmp=tq\c_quote_pos-tq\o_quote_pos
otmp=(charp + tq\o_quote_pos)
SetStatusText win1,"Open Quote Position:"+otmp+" Close Quote Length:"+ctmp
FormatTextAreaText textarea1,0,0,255,1,otmp-1,num(ctmp+1),1
Delete tq
Next
EndIf
Delete t
;FormatTextAreaText (textarea1,0,0,0,1,charp,tlength,1)
End Function
This little fricken bug has haunted me for a month or more ... :(
L8r,