<<Enter>> in de textbox

Algemene discussies en vragen omtrent Liberty BASIC programma's. Stuur zoveel mogelijk delen van listings (snippets) in als je hulp wilt.

Moderators: anthonio, Abcott

<<Enter>> in de textbox

Berichtdoor glpape » zo jan 06, 2013 5:32 pm

In een textbox kun je naar de volgende regel springen met <<Ctrl-Enter>>. OK als je het weet, maar ik maak nu een programma voor anderen en dan is het handig als <<Enter>> gewoon werkt. Lbty's Text Editor doet dat maar ik vond het ooit maar een raar ding; verder geen ervaring mee.

Met de code hier werkt <<Enter>> in een textbox. Ik kan me zelfs verschillende manieren voorstellen om dit te doen, maar je hebt wel altijd API calls nodig. Hier staat EM_GETSEL centraal en ik heb onder API calls op dit forum een breedsprakige uitleg geplaatst.

De code hier is gebaseerd op een Default Button. Lbty zelf kent een DefaultBttn in dialog windows [Help: GUI Programming, Window and Dialog Commands]. Hier, in een gewoon window, maak ik een DefaultBttn via stylebits [Lbty Bas Programmers Encyclopaedia, Stylebits Tutorials van Janet Terra].
De textbox krijgt ook een paar styles: ES_AUTOHSCROLL gaat eruit en vertikale scrolling wordt ingevoerd: dat kan via ES_AUTOVSCROLL (zonder scroll bar) of WS_VSCROLL (met).

De DefaultBttn is onzichtbaar klein (size 0, 0); als je op <<Enter>> drukt wordt je doorgeschakeld naar de handler van deze knop.

EM_GETSEL geeft nu de positie van de selectie (of van de text-cursor; voor Windows altijd de 'caret'); de text van de tbox wordt gedeeld in het stuk voor de selectie (t1$) en het stuk erna (t2$); de textbox wordt dan weer gevuld met t1$ + LineFeed + CarriageReturn + t2$. Nu komt de caret, als default, op positie 0, helemaal aan het begin dus, dus die plaatsen we met EM_SETSEL. Werkt net als EM_GETSEL: als je twee waarden invoert wordt het tussenliggende stuk de geslecteerde text, met twee keer dezelfde waarde stel je de nieuwe positie van de caret in.

Met EM_SCROLLCARET is steeds de caret in beeld - probeer maar een zonder deze call en druk 12x op <<Enter>>.

Code: Selecteer alles
nomainwin
Call SetWdwC 0, -20, 500, 400
stylebits #W.b1, _BS_DEFPUSHBUTTON, 0, 0, 0
button    #W.b1, "", [DefaultBttn], UL, 0, 0, 0, 0
stylebits #W.t1, _WS_VSCROLL, _ES_AUTOHSCROLL, 0, 0
textbox   #W.t1, 155, 55, 222, 222
   Open "" for window as #W
   #W "trapclose [qq]"
hWt1 = hwnd(#W.t1)
#W.t1 "!font courier_new 12"

wait
[qq]  Close #W  :  End


[DefaultBttn]
lf = 1                                      ' LineFeeds
struct F, f as long
struct L, l as long
#W.t1 "!contents? t$"
calldll #user32, "SendMessageA", hWt1 as ulong, _
   _EM_GETSEL as long, F as struct, L as struct, rtn as ulong
first = F.f.struct
last  = L.l.struct
   t1$ = left$(t$, first)
   t2$ = mid$(t$, last+1)
   #W.t1 t1$; crlf$(lf);  t2$
first = first + 2*lf
calldll #user32, "SendMessageA", hWt1 as ulong, _
   _EM_SETSEL as long, first as long, first as long, rtn as long
calldll #user32, "SendMessageA", hWt1 as ulong, _
   _EM_SCROLLCARET as long, 0 as long, 0 as long, rtn as long
wait


'  * * * * * * * * * * * * * * *  Functions & Subs  * * * * * * * * * * * * * * * * * * * *

Sub SetWdwC a,b,c,d                         ' Centers window with 0 for both first params
UpperLeftX = ((DisplayWidth - c)/2) + a     ' Adjust horiz pos, neg values move window left
if UpperLeftX<1 then UpperLeftX = 1
UpperLeftY = ((DisplayHeight - d)/2) + b    ' Adjust vert pos, neg values move window up
if UpperLeftY<1 then UpperLeftY = 1
WindowWidth = c
WindowHeight = d
End Sub

Function crlf$(k)                           ' Gives k carriage returns [chr$(13)]
   for i = 1 to k                           '         plus line feeds [chr$(10)]
   crlf$ =  crlf$; chr$(13); chr$(10)
   next i
End Function


Ik ben er nog niet helemaal, ik moet het nog laten werken voor 3 t.boxen in een venster.

Tot zover heb ik het geloof ik nu goed voor elkaar. Als iemand de code probeert en een bug tegenkomt hoor ik het graag.

Vr groet,

George Pape.
glpape
 
Berichten: 83
Geregistreerd: za nov 08, 2008 5:32 pm

Keer terug naar Liberty BASIC Code

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers. en 1 gast

cron