Retrieve text from ScintillaGadget

Just starting out? Need help? Post your questions and find answers here.
User avatar
Lord
Addict
Addict
Posts: 913
Joined: Tue May 26, 2009 2:11 pm

Retrieve text from ScintillaGadget

Post by Lord »

Hi!

I started to have a look at scintilla.
I manged to write colored text to the gadget.

But now I got trouble to get the text back from the gadget.
Why do I not get the whole written text back?
Output ends always at 19693.

Here my test code:

Code: Select all

EnableExplicit

#SciWindow = 2
#SciTextGadget = 3

Define *t
Define.i i, Pos, L, Range, Buffer, Event
Define Text$

Procedure SciPrint(Gadget, Text.s, Pos)
  Protected *T, L.i
  *T=UTF8(Text.s)
  L=Len(Text.s)
  ScintillaSendMessage(Gadget, #SCI_ADDTEXT, L, *T)
  FreeMemory(*T)
  ScintillaSendMessage(Gadget, #SCI_NEWLINE)
  ProcedureReturn L
EndProcedure


OpenWindow(#SciWindow, 10, 10, 640, 480, "", #PB_Window_SystemMenu)
ScintillaGadget(#SciTextGadget, 0, 0, WindowWidth(#SciWindow), WindowHeight(#SciWindow), 0)
*t = UTF8("Arial")                                          
ScintillaSendMessage(#SciTextGadget, #SCI_STYLESETFONT, #STYLE_DEFAULT, *t)
FreeMemory(*t)                              

ScintillaSendMessage(#SciTextGadget, #SCI_STYLESETSIZE, #STYLE_DEFAULT, 10)
ScintillaSendMessage(#SciTextGadget, #SCI_STYLECLEARALL)

#StyleBlack = 1
#StyleBlue = 2
#StyleRed = 3
ScintillaSendMessage(#SciTextGadget, #SCI_STYLESETFORE, #StyleBlack, #Black)
ScintillaSendMessage(#SciTextGadget, #SCI_STYLESETFORE, #StyleBlue, #Blue)
ScintillaSendMessage(#SciTextGadget, #SCI_STYLESETFORE, #StyleRed, #Red)

SendMessage_(GadgetID(#SciTextGadget),#WM_SETREDRAW,#False,0)

Pos=0
For i=1 To 20000; Limit: 19692 ?
  Text$=RSet(Str(i), 6, "0")+". Row"
  L=SciPrint(#SciTextGadget, Text$, Pos)
  If i&1
    ScintillaSendMessage(#SciTextGadget, #SCI_STARTSTYLING, Pos, #StyleBlue)
    ScintillaSendMessage(#SciTextGadget, #SCI_SETSTYLING, L, #StyleBlue)
  Else
    ScintillaSendMessage(#SciTextGadget, #SCI_STARTSTYLING, Pos, #StyleRed)
    ScintillaSendMessage(#SciTextGadget, #SCI_SETSTYLING, L, #StyleRed)
  EndIf
  Pos+L+2
Next

SendMessage_(GadgetID(#SciTextGadget),#WM_SETREDRAW,#True,0)


Range= ScintillaSendMessage(#SciTextGadget, #SCI_GETLENGTH)
Debug Range
Buffer=AllocateMemory(Range+2)
Debug Buffer
Debug MemorySize(Buffer)
If Buffer
  Debug ScintillaSendMessage(#SciTextGadget, #SCI_GETTEXT, range, Buffer)
  Debug PeekS(Buffer, Range, #PB_UTF8)
  FreeMemory(Buffer)
EndIf

Repeat
  Event=WaitWindowEvent()
  Select Event
    Case #PB_Event_CloseWindow
      Break
  EndSelect
ForEver
Any help appriciated.
Image
User avatar
spikey
Addict
Addict
Posts: 809
Joined: Wed Sep 22, 2010 1:17 pm
Location: United Kingdom

Re: Retrieve text from ScintillaGadget

Post by spikey »

I don't know if it's a limitation of the debugger or the debug output window but you're getting the right result just not seeing it. This will point the memory viewer at the end of the buffer:

Code: Select all

EnableExplicit

#SciWindow = 2
#SciTextGadget = 3

Define *t
Define.i i, Pos, L, Range, Buffer, Event
Define Text$

Procedure SciPrint(Gadget, Text.s, Pos)
  Protected *T, L.i
  *T=UTF8(Text.s)
  L=Len(Text.s)
  ScintillaSendMessage(Gadget, #SCI_ADDTEXT, L, *T)
  FreeMemory(*T)
  ScintillaSendMessage(Gadget, #SCI_NEWLINE)
  ProcedureReturn L
EndProcedure


OpenWindow(#SciWindow, 10, 10, 640, 480, "", #PB_Window_SystemMenu)
ScintillaGadget(#SciTextGadget, 0, 0, WindowWidth(#SciWindow), WindowHeight(#SciWindow), 0)
*t = UTF8("Arial")                                          
ScintillaSendMessage(#SciTextGadget, #SCI_STYLESETFONT, #STYLE_DEFAULT, *t)
FreeMemory(*t)                              

ScintillaSendMessage(#SciTextGadget, #SCI_STYLESETSIZE, #STYLE_DEFAULT, 10)
ScintillaSendMessage(#SciTextGadget, #SCI_STYLECLEARALL)

#StyleBlack = 1
#StyleBlue = 2
#StyleRed = 3
ScintillaSendMessage(#SciTextGadget, #SCI_STYLESETFORE, #StyleBlack, #Black)
ScintillaSendMessage(#SciTextGadget, #SCI_STYLESETFORE, #StyleBlue, #Blue)
ScintillaSendMessage(#SciTextGadget, #SCI_STYLESETFORE, #StyleRed, #Red)

SendMessage_(GadgetID(#SciTextGadget),#WM_SETREDRAW,#False,0)

Pos=0
For i=1 To 20000; Limit: 19692 ?
  Text$=RSet(Str(i), 6, "0")+". Row"
  L=SciPrint(#SciTextGadget, Text$, Pos)
  If i&1
    ScintillaSendMessage(#SciTextGadget, #SCI_STARTSTYLING, Pos, #StyleBlue)
    ScintillaSendMessage(#SciTextGadget, #SCI_SETSTYLING, L, #StyleBlue)
  Else
    ScintillaSendMessage(#SciTextGadget, #SCI_STARTSTYLING, Pos, #StyleRed)
    ScintillaSendMessage(#SciTextGadget, #SCI_SETSTYLING, L, #StyleRed)
  EndIf
  Pos+L+2
Next
Text$="! The End !"
L=SciPrint(#SciTextGadget, Text$, Pos)
  
SendMessage_(GadgetID(#SciTextGadget),#WM_SETREDRAW,#True,0)

Range= ScintillaSendMessage(#SciTextGadget, #SCI_GETLENGTH)
Debug Range
Buffer=AllocateMemory(Range+2)
Debug Buffer
Debug MemorySize(Buffer)
If Buffer
  Debug ScintillaSendMessage(#SciTextGadget, #SCI_GETTEXT, range, Buffer)
  Debug PeekS(Buffer, Range, #PB_UTF8)
  ShowMemoryViewer(Buffer + (MemorySize(Buffer) - 40), 60)
  FreeMemory(Buffer)
EndIf

Repeat
  Event=WaitWindowEvent()
  Select Event
    Case #PB_Event_CloseWindow
      Break
  EndSelect
ForEver
https://www.youtube.com/watch?v=7lqGwAkylI4 :D
(No offence intended, I just like this one because I had an instructor on my apprenticeship who used to say exactly this!)
User avatar
Lord
Addict
Addict
Posts: 913
Joined: Tue May 26, 2009 2:11 pm

Re: Retrieve text from ScintillaGadget

Post by Lord »

Hi spikey!

Thank you for looking into this.
You are right. Debug doesn't seem to be the right tool for this job. :D

Code: Select all

EnableExplicit

#SciWindow = 2
#SciTextGadget = 3

Define *t
Define.i i, Pos, L, Range, Buffer, Event
Define Text$

Procedure SciPrint(Gadget, Text.s, Pos)
  Protected *T, L.i
  *T=UTF8(Text.s)
  L=Len(Text.s)
  ScintillaSendMessage(Gadget, #SCI_ADDTEXT, L, *T)
  FreeMemory(*T)
  ScintillaSendMessage(Gadget, #SCI_NEWLINE)
  ProcedureReturn L
EndProcedure


OpenWindow(#SciWindow, 10, 10, 640, 480, "", #PB_Window_SystemMenu)
ScintillaGadget(#SciTextGadget, 0, 0, WindowWidth(#SciWindow), WindowHeight(#SciWindow), 0)
*t = UTF8("Arial")                                          
ScintillaSendMessage(#SciTextGadget, #SCI_STYLESETFONT, #STYLE_DEFAULT, *t)
FreeMemory(*t)                              

ScintillaSendMessage(#SciTextGadget, #SCI_STYLESETSIZE, #STYLE_DEFAULT, 10)
ScintillaSendMessage(#SciTextGadget, #SCI_STYLECLEARALL)

#StyleBlack = 1
#StyleBlue = 2
#StyleRed = 3
ScintillaSendMessage(#SciTextGadget, #SCI_STYLESETFORE, #StyleBlack, #Black)
ScintillaSendMessage(#SciTextGadget, #SCI_STYLESETFORE, #StyleBlue, #Blue)
ScintillaSendMessage(#SciTextGadget, #SCI_STYLESETFORE, #StyleRed, #Red)

SendMessage_(GadgetID(#SciTextGadget),#WM_SETREDRAW,#False,0)

Pos=0
For i=1 To 20000; Limit: 19692 ?
  Text$=RSet(Str(i), 6, "0")+". Row"
  L=SciPrint(#SciTextGadget, Text$, Pos)
  If i&1
    ScintillaSendMessage(#SciTextGadget, #SCI_STARTSTYLING, Pos, #StyleBlue)
    ScintillaSendMessage(#SciTextGadget, #SCI_SETSTYLING, L, #StyleBlue)
  Else
    ScintillaSendMessage(#SciTextGadget, #SCI_STARTSTYLING, Pos, #StyleRed)
    ScintillaSendMessage(#SciTextGadget, #SCI_SETSTYLING, L, #StyleRed)
  EndIf
  Pos+L+2
Next
Text$="! The End !"
L=SciPrint(#SciTextGadget, Text$, Pos)
  
SendMessage_(GadgetID(#SciTextGadget),#WM_SETREDRAW,#True,0)

Range=ScintillaSendMessage(#SciTextGadget, #SCI_GETLENGTH)
Debug Range
Buffer=AllocateMemory(Range+2)
Debug Buffer
Debug MemorySize(Buffer)
If Buffer
  Debug ScintillaSendMessage(#SciTextGadget, #SCI_GETTEXT, range, Buffer)
  Text$=PeekS(Buffer, Range, #PB_UTF8)
  Debug Len(Text$)
  FreeGadget(#SciTextGadget)
  EditorGadget(#SciTextGadget, 0, 0, WindowWidth(#SciWindow), WindowHeight(#SciWindow))
  SetGadgetText(#SciTextGadget, Text$)
  Text$=GetGadgetText(#SciTextGadget)
  Debug Len(Text$)
  Debug Text$
  FreeMemory(Buffer)
EndIf

Repeat
  Event=WaitWindowEvent()
  Select Event
    Case #PB_Event_CloseWindow
      Break
  EndSelect
ForEver
Image
Post Reply