<<Enter>> in meerdere textboxen.

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 meerdere textboxen.

Berichtdoor glpape » di jan 08, 2013 12:34 am

Nu, na mijn vorige post, een versie waar <<Enter>> werkt voor meerdere textboxes.
Hier slechts twee, maar het kunnen er ook meer zijn : de controls die mee mogen doen worden aangewezen in de If-conditie.

De actieve control krijg ik met de "GetFocus" API call. Op zich simpel, maar dan komen toch meteen de complicaties: ik heb nu wel de Windows handle van de actieve control maar niet Liberty's #handle. Dus moet ik verder met API calls: "GetWindowText" ipv #W.t1 "!contents? var$"; en dan weer "SetWindowText".

De API calls worden netjes uitgelegd in AlyceW's onvolprezen Liberty Basic 4 Companion e-book.

Code: Selecteer alles
nomainwin
Call SetWdwC 20, -20, 500,700
stylebits #W.b1, _BS_DEFPUSHBUTTON, 0, 0, 0
button    #W.b1, "", [DefaultBttn], UL, 0, 0, 0, 0
GoSub [InitTboxes]
   Open "" for window as #W
   #W "trapclose [qq]"
GoSub [FormatTboxes]

wait
[qq]  Close #W  :  End


[DefaultBttn]
lf = 1
calldll #user32, "GetFocus", hF as ulong
If (hF = hwnd(#W.t1)) or (hF = hwnd(#W.t2)) then
   Calldll #user32, "GetWindowTextLengthA", hF as ulong, nchar as long
   nchar = nchar+10
   Buffer$  = space$(nchar)
   Calldll #user32, "GetWindowTextA", hF as ulong, Buffer$ as ptr, nchar as long, rtn as long
   t$ = left$(Buffer$, rtn)

   struct F, f as long
   struct L, l as long
   calldll #user32, "SendMessageA", hF 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)
   t12$ = t1$; crlf$(lf); t2$

   calldll #user32, "SetWindowTextA", hF as ulong, t12$ as ptr, rtn as long
   first = first + 2*lf
   calldll #user32, "SendMessageA", hF as ulong, _
      _EM_SETSEL as long, first as long, first as long, rtn as long
   calldll #user32, "SendMessageA", hF as ulong, _
      _EM_SCROLLCARET as long, 0 as long, 0 as long, rtn as long
End If
wait


'  * * * * * * * * * * * * * * *  GoSubs  * * * * * * * * * * * * * * * * * * * *

[InitTboxes]
stylebits #W.t1, _WS_VSCROLL, _ES_AUTOHSCROLL, 0, 0
stylebits #W.t2, _WS_VSCROLL, _ES_AUTOHSCROLL, 0, 0
stylebits #W.t3, _WS_VSCROLL, _ES_AUTOHSCROLL, 0, 0
textbox   #W.t1, 155,  44, 222, 155
textbox   #W.t2, 155, 244, 222, 155
textbox   #W.t3, 155, 444, 222, 155
Return

[FormatTboxes]
#W.t1 "!font courier_new 12"
#W.t2 "!font courier_new 12"
#W.t3 "!font courier_new 12"
Return

'  * * * * * * * * * * * * * * *  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


Het werkt goed met text tot ten minste 1.048.576 tekens (= 2^20), heb ik geprobeerd. De berekeningen gaan snel, maar het duurt erg lang om zoveel tekst in de textbox te krijgen. Is denk ik erg druk bezig met verticaal scrollen, want als ik de textbox bijna 5x breder maak gaat het ook bijna 5x zo snel.

Vr groet,

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

Re: <<Enter>> in meerdere textboxen.

Berichtdoor glpape » vr jan 11, 2013 11:21 pm

Hier heb ik nog een simpeler manier om <<Enter>> te gebruiken in een textbox.
Opnieuw eerst een Default Button. Dan stuur je met de API functie "keybd_event" de Virtuele Key Codes voor <<Ctrl-Emter>> naar de t.box die focus heeft, dat is dus vanzelf de t.box waar je mee bezig bent, en klaar is Kees.

Elke toetsaanslag wordt door Windows gelezen als 2 events: het indrukken van de toets en het weer loslaten. Voor de Control of Shift toets is dat wat je verwacht, voor <<Enter>> of voor gewoon een letter moest ik daar aan wennen. Beide events moet je genereren als je een toets virtueel aanslaat.

De VK codes zijn natuurlijk getallen. Je ziet dat als je intypt <<print _VK_CONTROL>>. Windows gebruikt die text versies omdat ze makkelijker te onthouden zijn, maar je mag ook gewoon 17 invullen in je API call.

Code: Selecteer alles
nomainwin

textbox #W.t1, 55, 20,  155, 100
textbox #W.t2, 55, 150, 155, 100
stylebits #W.b1, _BS_DEFPUSHBUTTON, 0, 0, 0
button    #W.b1, "", [DefaultBttn], UL, 0, 0, 0, 0
   Open "" for window as #W
   #W "trapclose [qq]"
wait

[DefaultBttn]
calldll #user32, "GetFocus", hF as ulong
if (hF = hwnd(#W.t1)) or (hF = hwnd(#W.t2)) then
   Call VKpress _VK_CONTROL, 0
   Call VKpress _VK_RETURN, 0
   Call VKpress _VK_RETURN, 2
   Call VKpress _VK_CONTROL, 2
end if
wait

[qq]  Close #W  :  End

Sub VKpress VK, flag             ' flag: 0=KeyDown  2=Released
   calldll #user32, "keybd_event", VK as ulong, _
       bscan as ulong, flag as ulong, 0 as ulong, rtn as void
End Sub


Indrukken = 0, weer loslaten = 2 gaat tegen m'n intuitie in. Voor mezelf maak ik de Sub zo dat 1 = indrukken, 0 is loslaten.

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