[VB] Tab afvanging en shfit+tab emulatie

Pagina: 1
Acties:
  • 138 views sinds 30-01-2008
  • Reageer

  • robbertb
  • Registratie: September 2000
  • Niet online
Ik ben bezig een component te maken die bestaat uit een text vak
Alleen heeft standaard vb tekstvak maar weinig mogelijkheden. Mijn tekstvak moet kunnen:
-active tekstvak heeft andere achtergrond kleur
-naar volgende tekstvak gaan wanneer er op pijlomlaag/enter/tab wordt gedrukt
-naar vorige tekstvak gaan wanneer er op pijlomhoog/shift tab wordt gedrukt
-wanneer bovenste tekstvak geselecteerd is moet er niet nog hoger kunnen gegaan worden
-bij onderste tekstvak geselecteerd mag er niet nog verder naar benede gegaan zodat ie weer naar eerste springt.

Voor volgend tekstvak simuleer ik gewoon de toets "Tab"
en voor vorig tekstvak shift-tab.

Het gaat dus om een tekstvak die ik later in al me projecten wil gebruiken, dus vooraf is de naam en aantal niet bekend.

En dat soort dingen. Ben er al aardig ver mee, maare heb problemen met het afvangen van de tab toets. Ik heb het nu opgelost door bij het Lostfocus event van tekstvak te kijken of dit gebeurd is door de tabtoets dmv een api call (weet zo niet welke). Maar dit werkt allemaal niet echt geweldig en begin overzicht kwijt te raken. Ik gebruikte eerst sendkeys maar daar wil ik vanaf, die bugged beetje en laat numlock knipperen.
Weet iemand hoe ik dit et beste kan aanpakken?

  • DarkSilence
  • Registratie: December 2002
  • Laatst online: 19-12-2025

DarkSilence

W3designer.nl

Alles wat je zegt kun je gewoon programmeren zonder super moeilijke codes te krijgen het draait een beetje om zoals je zelf zei setfocus en lostfocus.

Visual Basic:
1
Text1.SetFocus
Dan krijg je in text1 de cursor. Dus toets afvangen en deze code klaar.

Visual Basic:
1
2
3
Private Sub Command1_GotFocus()
//jou code
End Sub

Met deze code kun je bijvoorbeeld afvangen wanneer een item de focus krijgt. Achtergrond kleur wijzigen klaar bij lostfocus weer orginele kleur instellen! :)

Werkt prima denk ik, suc6!

W3designer.nl


  • robbertb
  • Registratie: September 2000
  • Niet online
DarkSilence schreef op 17 May 2003 @ 23:26:
Alles wat je zegt kun je gewoon programmeren zonder super moeilijke codes te krijgen het draait een beetje om zoals je zelf zei setfocus en lostfocus.

Visual Basic:
1
Text1.SetFocus
Dan krijg je in text1 de cursor. Dus toets afvangen en deze code klaar.

Visual Basic:
1
2
3
Private Sub Command1_GotFocus()
//jou code
End Sub

Met deze code kun je bijvoorbeeld afvangen wanneer een item de focus krijgt. Achtergrond kleur wijzigen klaar bij lostfocus weer orginele kleur instellen! :)

Werkt prima denk ik, suc6!
uhh dit heb ik ook allemaal al prima werkend..
Ging me om de tab afvanging en shift tab emulatie wat je daarvoor best kan gebruiken.. Want bij lostfocus kijken mbv api call of tab gedrukt is, is beetje omslachtige methode en heeft soms onwenselijke effecten. En hoe je het best met eerste/laatste tekstvak om kan gaan. ik heb ff alle functionaliteit opgenoemt, misschien dat hier in totaal betere oplossing voor is ofzo :)

  • Xander
  • Registratie: Oktober 2002
  • Laatst online: 10:46
Nou robbertb, je oproep in [rml][ VB] Form in een ander form?[/rml] heeft geholpen :P

Ik heb even een simpel projectje in elkaar gezet, wat hier te downloaden is.

Hierin zitten 3 tekstvakken, die Text(0), Text(1) en Text(2) heten. Deze kun je gewoon kopiëren, en het stukje code blijft nog zonder problemen werken, met meer tekstvakken. Om te zorgen dat ik zelf een Tab afhandeling kan inbouwen moet ik helaas bij alle Objecten op het hele form de eigenschap "TabStop" op "False" zetten, omdat VB anders zelf met de tab gaat spelen.

Hier nog even de code (meer documentatie staat in het zipfile):
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Sub Text_GotFocus(Index As Integer)
Text(Index).BackColor = vbBlue
End Sub
Private Sub Text_LostFocus(Index As Integer)
Text(Index).BackColor = vbWhite
End Sub
Private Sub Text_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)
    If KeyCode = 9 Then 
        If Shift = 1 Then
            If Index > 0 Then
                Text(Index - 1).SetFocus 
            End If
        ElseIf Shift = 0 Then 
            If Index < (Text.Count - 1) Then
                Text(Index + 1).SetFocus 
            End If
        End If
    End If
End Sub


Even voor de duidelijkheid nog, alle tekstvakken heten gewoon "Text", het verschil maak ik met de index.

[edit]
Je kunt het ook nog veel compacter krijgen door dingen als
Visual Basic .NET:
1
If KeyCode = 9 And Shift = 1 and Index > 0 Then Text(Index - 1).SetFocus

Te gaan gebruiken, dat heb ik niet gedaan omdat het een beetje onoverzichtelijk word. Wil je dat wel doen, dan moet je deze code gebruiken:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
Private Sub Text_GotFocus(Index As Integer)
Text(Index).BackColor = vbBlue
End Sub
Private Sub Text_LostFocus(Index As Integer)
Text(Index).BackColor = vbWhite 
End Sub
Private Sub Text_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)
If KeyCode = 9 And Shift = 1 And Index > 0 Then Text(Index - 1).SetFocus
If KeyCode = 9 And Shift = 0 And Index < (Text.Count - 1) Then Text(Index + 1).SetFocus 
End Sub

[ Voor 23% gewijzigd door Xander op 18-05-2003 15:09 ]

PC specs!---Pulse mee voor GoT!
[22:49:37] <@Remy> ik wil een opblaasbare dSLR :+


  • robbertb
  • Registratie: September 2000
  • Niet online
XanderH schreef op 18 mei 2003 @ 15:04:
Nou robbertb, je oproep in [rml][ VB] Form in een ander form?[/rml] heeft geholpen :P

Ik heb even een simpel projectje in elkaar gezet, wat hier te downloaden is.

Hierin zitten 3 tekstvakken, die Text(0), Text(1) en Text(2) heten. Deze kun je gewoon kopiëren, en het stukje code blijft nog zonder problemen werken, met meer tekstvakken. Om te zorgen dat ik zelf een Tab afhandeling kan inbouwen moet ik helaas bij alle Objecten op het hele form de eigenschap "TabStop" op "False" zetten, omdat VB anders zelf met de tab gaat spelen.

Hier nog even de code (meer documentatie staat in het zipfile):
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Sub Text_GotFocus(Index As Integer)
Text(Index).BackColor = vbBlue
End Sub
Private Sub Text_LostFocus(Index As Integer)
Text(Index).BackColor = vbWhite
End Sub
Private Sub Text_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)
    If KeyCode = 9 Then 
        If Shift = 1 Then
            If Index > 0 Then
                Text(Index - 1).SetFocus 
            End If
        ElseIf Shift = 0 Then 
            If Index < (Text.Count - 1) Then
                Text(Index + 1).SetFocus 
            End If
        End If
    End If
End Sub


Even voor de duidelijkheid nog, alle tekstvakken heten gewoon "Text", het verschil maak ik met de index.
Bedankt voor je reply ;)
Maar ik wil dus juist een nieuw component maken die al deze eigenschappen in zich heeft. En met die focus is peanuts ja, probleem is alleen dat ie nooit in de sub "Private Sub Text_KeyDown" komt als je op tab drukt..

Edit:
Hm mooi testproggel en duidelijk gedocumenteerd.
Maar wat raar bij jou komt ie wel in de in die functie als je op tab drukt.. Hoe kan dat dan dat et bij mij niet werkt :S Omdat et bij mij opm een activeX control gaat ofzo?

[ Voor 10% gewijzigd door robbertb op 18-05-2003 15:16 ]


  • Xander
  • Registratie: Oktober 2002
  • Laatst online: 10:46
robbertb schreef op 18 May 2003 @ 15:09:
[...]
Probleem is alleen dat ie nooit in de sub "Private Sub Text_KeyDown" komt als je op tab drukt..
Dus wel als je bij alle objecten "Tabstop" op False zet, maarja, dat is misschien niet echt handig.

edit:

Die code in het zipfile werkt dus wel, zonder problemen.


edit2:
[...]
Maar wat raar bij jou komt ie wel in de in die functie als je op tab drukt.. Hoe kan dat dan dat et bij mij niet werkt :S Omdat et bij mij opm een activeX control gaat ofzo?
Dus omdat ik die tabstop overal uit het staan.

[ Voor 43% gewijzigd door Xander op 18-05-2003 15:16 ]

PC specs!---Pulse mee voor GoT!
[22:49:37] <@Remy> ik wil een opblaasbare dSLR :+


  • robbertb
  • Registratie: September 2000
  • Niet online
XanderH schreef op 18 May 2003 @ 15:10:
[...]


Dus wel als je bij alle objecten "Tabstop" op False zet, maarja, dat is misschien niet echt handig.

edit:

Die code in het zipfile werkt dus wel, zonder problemen.


edit2:

[...]


Dus omdat ik die tabstop overal uit het staan.
Jouw code werkt idd wel goed..
Maar ik heb ook even een voorbeeldje gemaakt:
http://www.geocities.com/robbertsmovies/tekstveldd.zip
Hierin zit het ocxje met de map testsoftware waar het ocxje op een form staat :)

Hij doet nu trouwens wel vreemd bij mij :/

[ Voor 7% gewijzigd door robbertb op 18-05-2003 16:10 ]


  • Xander
  • Registratie: Oktober 2002
  • Laatst online: 10:46
This page is not available.
We're sorry, but this page is currently unavailable for viewing.
If this site belongs to you, please read this help page for more information and assistance.

For general questions see our main help area, or search for other member pages.

PC specs!---Pulse mee voor GoT!
[22:49:37] <@Remy> ik wil een opblaasbare dSLR :+


  • robbertb
  • Registratie: September 2000
  • Niet online
vaag, als je het adres kopieerd in je browser doet ie het wel :/

  • Xander
  • Registratie: Oktober 2002
  • Laatst online: 10:46
robbertb schreef op 18 mei 2003 @ 16:18:
[...]

vaag, als je het adres kopieerd in je browser doet ie het wel :/
idd, dan doet hij het wel.

Overigens heb ik nog nooit OCX bestanden gemaakt, dus eer dat ik dit begrijp ben ik een dagje verder :P

* Xander gaat nogeens zorgvuldig kijken als ik tijd heb

PC specs!---Pulse mee voor GoT!
[22:49:37] <@Remy> ik wil een opblaasbare dSLR :+


  • robbertb
  • Registratie: September 2000
  • Niet online
XanderH schreef op 18 mei 2003 @ 16:23:
[...]


idd, dan doet hij het wel.

Overigens heb ik nog nooit OCX bestanden gemaakt, dus eer dat ik dit begrijp ben ik een dagje verder :P

* robbertb gaat nogeens zorgvuldig kijken als ik tijd heb
Achja OCX is niet zo spannend hoor, stelt eigenlijk niks voor.. alleen je maakt dus een nieuw soort componentje die al code erin heeft zitten.. Heb je testproggel bekeken? evt de group

  • Xander
  • Registratie: Oktober 2002
  • Laatst online: 10:46
robbertb schreef op 18 May 2003 @ 16:36:
[...]

Achja OCX is niet zo spannend hoor, stelt eigenlijk niks voor.. alleen je maakt dus een nieuw soort componentje die al code erin heeft zitten.. Heb je testproggel bekeken? evt de group
I'm on it :P

[edit]
Ja, het werkt idd. niet :P
Het is bij mij zelfs zo dat mijn hele system freezed als ik op tab duw, knap gemaakt >:) .

Zoals ik al zei heb ik niet echt ervaring met OCX-controls, dus ik zou ook niet weten hoe je dit kon oplossen, maar ik ben hopelijk niet de enige die dit topic leest :P

[ Voor 34% gewijzigd door Xander op 18-05-2003 16:49 ]

PC specs!---Pulse mee voor GoT!
[22:49:37] <@Remy> ik wil een opblaasbare dSLR :+


  • robbertb
  • Registratie: September 2000
  • Niet online
XanderH schreef op 18 May 2003 @ 16:39:
[...]

I'm on it :P

[edit]
Ja, het werkt idd. niet :P
Het is bij mij zelfs zo dat mijn hele system freezed als ik op tab duw, knap gemaakt >:) .

Zoals ik al zei heb ik niet echt ervaring met OCX-controls, dus ik zou ook niet weten hoe je dit kon oplossen, maar ik ben hopelijk niet de enige die dit topic leest :P
Hmm et probleem zit em idd als je TAB-stop voor de tekstvakjes uit zet, dan kent hij idd wel "Keydown " event voor tab.. mar dan kan ik geen sendkeys "{tab}" meer doen omdat tabstop uit staat.

En in dat bestandje wat ik op die url heb staan, staan de tabstops uit. Zet je em aan, dan freeze hij niet meer, maar dan is het TAB - keydown event niet meer op te vangen

Btw je kunt je systeem uit de freeze halen door even op de windowstoets te drukken

Verwijderd

De Tab is lastig omdat andere controls er ook gebruik van kunnen maken. Dus zul je bijv. met een keyboard hook moeten gaan werken of misschien met een oplossing als deze:
http://www.planet-source-...?txtCodeId=41506&lngWId=1
Zoek meteen op dezelfde site naar keyboard hook.
Een betere versie van sendkeys is pushkeys, zie hier de source:
http://www.froggy.com.au/andromeda/software/pushkeys/

  • robbertb
  • Registratie: September 2000
  • Niet online
Verwijderd schreef op 18 mei 2003 @ 17:19:
De Tab is lastig omdat andere controls er ook gebruik van kunnen maken. Dus zul je bijv. met een keyboard hook moeten gaan werken of misschien met een oplossing als deze:
http://www.planet-source-...?txtCodeId=41506&lngWId=1
Zoek meteen op dezelfde site naar keyboard hook.
Een betere versie van sendkeys is pushkeys, zie hier de source:
http://www.froggy.com.au/andromeda/software/pushkeys/
Hmz, snap nou niet echt mer hoe dat nou werkt, erg veel code, ben overzicht beetje kwijt B) Wil alleen tab opvangen
Ik snap dat ik de API voor GetKeyState() moet gebruiken.. maar die kijtk alleen naar huidige moment en om dat nou op een timertje te zetten/lusje vind ik ook zo slordig

En werkt die pushkeys ook als tabstop op false staat? Sendkeys werkt dan nl niet meer..

[ Voor 11% gewijzigd door robbertb op 18-05-2003 18:10 ]


Verwijderd

Ja, 't is veel code maar er zit weinig anders op denk ik. Een loop met GetKeyState() is nou niet echt het principe van een keyboard hook dus dat lijkt me zeker geen goede oplossing. Of pushkeys wel werkt als Tabstop op false staat zou ik niet weten maar het lijkt me wel. Als een handmatige druk op Tab wel werkt dan werkt pushkeys ook. Bij gebruik van een keyboard hook hoef je overigens Tabstop niet op false te zetten.

  • robbertb
  • Registratie: September 2000
  • Niet online
Verwijderd schreef op 18 mei 2003 @ 18:36:
Ja, 't is veel code maar er zit weinig anders op denk ik. Een loop met GetKeyState() is nou niet echt het principe van een keyboard hook dus dat lijkt me zeker geen goede oplossing. Of pushkeys wel werkt als Tabstop op false staat zou ik niet weten maar het lijkt me wel. Als een handmatige druk op Tab wel werkt dan werkt pushkeys ook. Bij gebruik van een keyboard hook hoef je overigens Tabstop niet op false te zetten.
oww ben er nog niet uit, valt ook slecht te debuggen door de repaint event.
Is er iemand die het wel begrijpt wel code ik nodig heb om gewoon de (shift)tab event altijd af te vangen
Pagina: 1