Bericht 1 van 7NL Computer Forum ~ SQL & Programmeren Van | : | Ronald Beuker | Datum | : | 19-09-2007 |
Aan | : | Allen | MsgID | : | 3563.1 |
Onderwerp | : | Tekst plakken in >1 textbox met VB6? | Forum | : | ws-nlcomputer |
Hallo allemaal,
Ik ben bezig met een VB6-form waarin een serienummer kan worden ingevuld. Dat serienummer ziet er bijvoorbeeld zo uit:
54-1D3N81-92055C87-001654-D2F1
Om het de gebruiker makkelijker te maken, heb ik hiervoor 5 textboxes gemaakt (txtSN1, txtSN2, txtSN3, txtSN4 en txtSN5). De gebruiker hoeft de tussenliggende koppeltekens dan niet in te vullen (op het formulier heb ik de tussenstreepjes tussen de tekstboxen gezet). Het totale serienummer is dan eenvoudig samen te stellen door de inhoud van de 5 textboxes samen te voegen, gecombineerd met de tussenstreepjes:
Public Function MaakSerienummer() As String
Dim GetSerienummer As String
GetSerienummer = txtSN1.Text & "-" & txtSN2.Text & "-" & txtSN3.Text & "-" & txtSN4.Text & "-" & txtSN5.Text
MaakSerienummer = GetSerienummer
End Function
Alle textboxes hebben een MaxLength. Als een textbox helemaal gevuld is, gaat de focus naar de volgende txtbox:
Private Sub txtSN1_Change()
Dim AantaltekensInTekstbox As Long
Dim MaxAantaltekensInTekstbox As Long
MaxAantaltekensInTekstbox = txtSN1.MaxLength
AantaltekensInTekstbox = Len(txtSN1.Text)
If AantaltekensInTekstbox >= MaxAantaltekensInTekstbox Then
txtSN2.SetFocus
End If
End Sub
Tot zover gaat alles ok. Maar nu zou ik er nog 1 ding aan willen toevoegen. Zo'n serienummer is natuurlijk wel heel erg lang, en daarom zou het ook makkelijk zijn als de gebruiker het serienummer kan kopiëren/plakken in de 1e textbox waarbij dan de andere 4 serienummer ook automagisch gevuld worden. Volgens mij moet er dan zoiets gebeuren:
1. Wordt txtSN1.Text veranderd doordat de gebruiker heeft geplakt vanuit het Clipboard?
2. Is de lengte van die gekopieerde tekst groter dan de MaxLength van txtSN1? Zo ja, dan moet het volgende stukje geplakt worden in txtSN2, enz. Hierbij moet dan rekening gehouden worden met de tussenstreepjes (want die worden door de gebruiker meegekopieerd, bijvoorbeeld vanuit een e-mail of vanaf een website).
Het resultaat zou dus zijn, als 54-1D3N81-92055C87-001654-D2F1 wordt geplakt in txtSN1:
txtSN1.Text = "54"
txtSN2.Text = "1D3N81"
txtSN3.Text = "92055C87"
txtSN4.Text = "001654"
txtSN5.Text = "D2F1"
Mijn vraag is natuurlijk: kan dat? ;-) En zo ja, hoe dan. <g>
Groeten,
Ronald
Bericht 2 van 7NL Computer Forum ~ SQL & Programmeren Van | : | Ronald Beuker | Datum | : | 19-09-2007 |
Aan | : | Allen | MsgID | : | 3563.2 |
Onderwerp | : | Tekst plakken in >1 textbox met VB6? | Forum | : | ws-nlcomputer |
Ik ben er al uit. :-)
Private Sub txtSN1_Change()
Dim AantaltekensInTekstbox As Long
Dim MaxAantaltekensInTekstbox As Long
Dim ClipText As String
MaxAantaltekensInTekstbox = txtSN1.MaxLength
AantaltekensInTekstbox = Len(txtSN1.Text)
ClipText = Clipboard.GetText
If AantaltekensInTekstbox >= MaxAantaltekensInTekstbox Then
If Left(ClipText, 2) = txtSN1.Text And Len(ClipText) = 30 Then 'er is zeer waarschijnlijk gekopieerd/geplakt!
txtSN2.Text = Mid(ClipText, 4, 6)
txtSN3.Text = Mid(ClipText, 11, 8)
txtSN4.Text = Mid(ClipText, 20, 6)
txtSN5.Text = Mid(ClipText, 27, 4)
cmdOK.SetFocus
Else
txtSN2.SetFocus
End If
End If
End Sub
Ik ben nog wel benieuwd of ik dit nu inderdaad handig doe, of dat het nog fout zou kunnen gaan?
Bericht 3 van 7NL Computer Forum ~ SQL & Programmeren Van | : | Peter | Datum | : | 19-09-2007 |
Aan | : | Ronald Beuker | MsgID | : | 3563.3 |
Onderwerp | : | Tekst plakken in >1 textbox met VB6? | Forum | : | ws-nlcomputer |
Hoi Ronald,
>>Ik ben nog wel benieuwd of ik dit nu inderdaad handig doe, of dat het nog fout zou kunnen gaan?<<
Aan je code te zien heb je dus 5 OnChange() events die nagenoeg allemaal hetzelfde moeten doen. Dat is niet handig.
Als je nu 5 tekstboxen in een array zet heb je maar 1 OnChange() event nodig maar die moet wel wat slimmer zijn.
Geen probleem, hier komt ie :-)
Private Sub txtSN_Change(Index As Integer)
'er is een wijziging in 1 van de invoervelden
Dim AantaltekensInTekstbox As Long
Dim MaxAantaltekensInTekstbox As Long
Static ClipText As String
Static CopyFlag As Boolean
Static ValidSN As Boolean
'afhankelijk van de index het max. aantal tekens bepalen
Select Case Index
Case 1: MaxAantaltekensInTekstbox = 2
Case 2, 4: MaxAantaltekensInTekstbox = 6
Case 3: MaxAantaltekensInTekstbox = 8
Case 5: MaxAantaltekensInTekstbox = 4
End Select
txtSN(Index).MaxLength = MaxAantaltekensInTekstbox
AantaltekensInTekstbox = Len(txtSN(Index).Text)
If (Index = 1) Or CopyFlag Then
If Not CopyFlag Then
'index in 1e tekstbox OF copyflag al gezet
ClipText = Clipboard.GetText
'controleer het formaat van de cliptext: lengte en streepjes op de goede plek
If Len(ClipText) = 30 Then
If InStr(ClipText, "-") = 3 Then
If InStr(4, ClipText, "-") = 10 Then
If InStr(11, ClipText, "-") = 19 Then
If InStr(20, ClipText, "-") = 26 Then
ValidSN = True
End If
End If
End If
End If
End If
End If
If Left(ClipText, 2) = txtSN(1).Text And ValidSN Then
'cliptext is geldig, zet CopyFlag en vul de gegevens in
CopyFlag = True
'Letop, dit resulteerd in een aantal recursieve calls!
txtSN(2).Text = Mid(ClipText, 4, 6)
txtSN(3).Text = Mid(ClipText, 11, 8)
txtSN(4).Text = Mid(ClipText, 20, 6)
txtSN(5).Text = Mid(ClipText, 27, 4)
'invullen klaar:
'index naar laatste invoerveld en reset static variabelen
Index = 5
CopyFlag = False
ValidSN = False
End If
End If
If AantaltekensInTekstbox >= MaxAantaltekensInTekstbox Then
If Index < 5 Then
'focus naar volgende tekstbox
txtSN(Index + 1).SetFocus
Else
'schakel OK knop in en zet de focus erop
cmdOK.Enabled = True
cmdOK.SetFocus
End If
End If
End Sub
Verder is de MaakSerienummer() te vereenvoudigen:
Public Function MaakSerienummer() As String
MaakSerienummer = txtSN(1).Text & "-" & txtSN(2).Text & "-" & txtSN(3).Text & "-" & txtSN(4).Text & "-" & txtSN(5).Text
End Function
In de Form_Load() event kun je nog
Clipboard.Clear opnemen.
Fout gaat het eigenlijk niet. Het enige wat tijdens plakken kan gebeuren is dat het 1e invoerveld gevuld wordt met 2 tekens van de clipbordtext en dat de focus verplaatst wordt naar het 2e invoerveld. Dat lijkt me geen probleem. De gebruiker wilde zelf plakken. Dat wordt deels gedaan maar afgebroken omdat het ongeldig is.
Groeten, Peter
Bericht 4 van 7NL Computer Forum ~ SQL & Programmeren Van | : | Ronald Beuker | Datum | : | 19-09-2007 |
Aan | : | Peter | MsgID | : | 3563.4 |
Onderwerp | : | Tekst plakken in >1 textbox met VB6? | Forum | : | ws-nlcomputer |
Hoi Peter,
Hartelijk dank voor je tips! Dat met die OnChange events in een array zetten, kende ik nog niet. Zeker bij veel identieke tekstboxen kan dat veel schelen!
Ik heb je code naar m'n werkmail doorgestuurd, dan kan ik er morgen weer mee aan de slag. ;-) Ik had voor nu wel alvast wat vraagjes:
>>
Private Sub txtSN_Change(Index As Integer)
'er is een wijziging in 1 van de invoervelden
Dim AantaltekensInTekstbox As Long
Dim MaxAantaltekensInTekstbox As Long
Static ClipText As String
Static CopyFlag As Boolean
Static ValidSN As Boolean
[/]<<
Het zal wel iets heel basics zijn, maar dat "Static" kende ik nog niet. Wat is het verschil met Dim?
>>
'afhankelijk van de index het max. aantal tekens bepalen
Select Case Index
Case 1: MaxAantaltekensInTekstbox = 2
Case 2, 4: MaxAantaltekensInTekstbox = 6
Case 3: MaxAantaltekensInTekstbox = 8
Case 5: MaxAantaltekensInTekstbox = 4
End Select
txtSN(Index).MaxLength = MaxAantaltekensInTekstbox
AantaltekensInTekstbox = Len(txtSN(Index).Text)
<<Ik had de MaxLength al bij het ontwerpen van het formulier ingesteld. Het maximum aantal tekens wijzigt ook nooit. Is er dan nog een voordeel om het op deze manier te doen?
>>
If (Index = 1) Or CopyFlag Then
If Not CopyFlag Then
'index in 1e tekstbox OF copyflag al gezet
ClipText = Clipboard.GetText
'controleer het formaat van de cliptext: lengte en streepjes op de goede plek
If Len(ClipText) = 30 Then
If InStr(ClipText, "-") = 3 Then
If InStr(4, ClipText, "-") = 10 Then
If InStr(11, ClipText, "-") = 19 Then
If InStr(20, ClipText, "-") = 26 Then
ValidSN = True
End If
End If
End If
End If
End If
End If
If Left(ClipText, 2) = txtSN(1).Text And ValidSN Then
'cliptext is geldig, zet CopyFlag en vul de gegevens in
CopyFlag = True
'Letop, dit resulteerd in een aantal recursieve calls!
txtSN(2).Text = Mid(ClipText, 4, 6)
txtSN(3).Text = Mid(ClipText, 11,
txtSN(4).Text = Mid(ClipText, 20, 6)
txtSN(5).Text = Mid(ClipText, 27, 4)
'invullen klaar:
'index naar laatste invoerveld en reset static variabelen
Index = 5
CopyFlag = False
ValidSN = False
End If
End If
[/]<<
Dit vind ik een hele goede toevoeging! Ik checkte alleen op het aantal tekens, maar dit is veel nauwkeuriger. :-)
Wel nog een vraagje: wat zijn precies die recursieve calls?
>>
If AantaltekensInTekstbox >= MaxAantaltekensInTekstbox Then
If Index < 5 Then
'focus naar volgende tekstbox
txtSN(Index + 1).SetFocus
Else
'schakel OK knop in en zet de focus erop
cmdOK.Enabled = True
cmdOK.SetFocus
End If
End If
End Sub
<<
Goede toevoeging die cmdOK.Enable=True! Veel beter dan die knop continu actief houden. ;-)
>> Verder is de MaakSerienummer() te vereenvoudigen:
Public Function MaakSerienummer() As String
MaakSerienummer = txtSN(1).Text & "-" & txtSN(2).Text & "-" & txtSN(3).Text & "-" & txtSN(4).Text & "-" & txtSN(5).Text
End Function
<<
Inderdaad! Die syntax die ik had gebruikt zal ik ooit wel eens ergens op het Web hebben gevonden, en daarna heb ik het altijd zo gedaan. ;-)
>>In de Form_Load() event kun je nog
Clipboard.Clear opnemen.<<
Ja, daar twijfel ik nog over. Als de gebruiker bijvoorbeeld alvast het serienummer had gekopieerd vóór dat het installatieprogramma is gestart, dan is dat wat minder handig, denk ik. Of zie ik iets over het hoofd?
>>Fout gaat het eigenlijk niet. Het enige wat tijdens plakken kan gebeuren is dat het 1e invoerveld gevuld wordt met 2 tekens van de clipbordtext en dat de focus verplaatst wordt naar het 2e invoerveld. Dat lijkt me geen probleem. De gebruiker wilde zelf plakken. Dat wordt deels gedaan maar afgebroken omdat het ongeldig is. <<
Helemaal mee eens. :-)
Groeten,
Ronald
Bericht 5 van 7NL Computer Forum ~ SQL & Programmeren Van | : | Peter | Datum | : | 19-09-2007 |
Aan | : | Ronald Beuker | MsgID | : | 3563.5 |
Onderwerp | : | Tekst plakken in >1 textbox met VB6? | Forum | : | ws-nlcomputer |
Ronald,
>>Het zal wel iets heel basics zijn, maar dat "Static" kende ik nog niet. Wat is het verschil met Dim?<<
Een Dim variabele binnen een Sub of Functie wordt altijd gereset naar zijn default waarde.
Een Static variabele niet, die behoudt zijn waarde als opnieuw de Sub of Functie aangeroepen wordt. Buiten de Sub of Functie is ie natuurlijk niet bekend.
>>Ik had de MaxLength al bij het ontwerpen van het formulier ingesteld. Het maximum aantal tekens wijzigt ook nooit. Is er dan nog een voordeel om het op deze manier te doen?<<
Eigenlijk niet. Ik vind dit wat overzichtelijker. Het kost alleen wat meer code. Een ander puntje kan zijn dat als je een grote array van controls maakt, je niet daarna weer alle controls af wilt gaan om 1 eigenschap aan te passen.
De volgende vraag bracht nog een klein probleempje naar boven.
Zorg ervoor dat bij het eerste invoerveld de MaxLength WEL al ingevuld is, via code of bij het ontwerpen, anders gaat het plakken vanuit het clipbord mis.
>>Wel nog een vraagje: wat zijn precies die recursieve calls?<<
Dit is een
txtNS_OnChange event en we gaan de text van
txtNS wijzigen. Dat betekend dus dat zodra we txtNS wijzigen opnieuw een OnChange event gebeurt en de lopende
txtNS_OnChange opnieuw gestart wordt.
Zet maar eens een breakpoint op de regel
CopyFlag = True en single-step met de F8-toets door je programma.
>>Veel beter dan die knop continu actief houden<<
Inderdaad. Wel bij het ontwerpen de eigenschap op False zetten!
>>Ja, daar twijfel ik nog over....Of zie ik iets over het hoofd?<<
Tja, dan weet je in ieder geval dat de clipbord tekst leeg is en geen onbekende waardes bevat.
Maar het is niet verplicht.
groeten, Peter
Bericht 6 van 7NL Computer Forum ~ SQL & Programmeren Van | : | Ronald Beuker | Datum | : | 08-10-2007 |
Aan | : | Peter | MsgID | : | 3563.6 |
Onderwerp | : | Tekst plakken in >1 textbox met VB6? | Forum | : | ws-nlcomputer |
Hoi Peter,
Nogmaals hartelijk dank voor je hulp! Ik heb er dankbaar gebruik van gemaakt. ;-)
Weet jij trouwens een goede manier om HKCU sleutels te bewerken? Ik doe dat nu -wel heel creatief vind ik van mezelf <g>- door een .reg bestandje te maken. Dat plaats ik dan in de %TEMP% directory van de gebruiker en vervolgens gaat het met een regedit /s regeltje het register in. Ten slotte wis ik natuurlijk nog even dat tijdelijke .reg bestandje.
Dat kan ongetwijfeld beter, maar hoe? Ik heb wel iets gelezen over een heel specifieke sleutel die je rechtstreeks met VB6 kunt bewerken; iets met de naam 'Visual Basic' of 'VBA' erin ofzo.
Groeten,
Ronald
Bericht 7 van 7NL Computer Forum ~ SQL & Programmeren Van | : | Peter | Datum | : | 08-10-2007 |
Aan | : | Ronald Beuker | MsgID | : | 3563.7 |
Onderwerp | : | Tekst plakken in >1 textbox met VB6? | Forum | : | ws-nlcomputer |
Hoi Ronald,
>>Dat kan ongetwijfeld beter, maar hoe? Ik heb wel iets gelezen over een heel specifieke sleutel die je rechtstreeks met VB6 kunt bewerken; iets met de naam 'Visual Basic' of 'VBA' erin ofzo.<<Met VBA kan het inderdaad ook. Hier staat het een en ander uitgelegd inclusief voorbeeld code:
Registry lesen und schreiben ohne APILet wel op, op sommige Win9x systemen is de WScript.Shell niet standaard geinstalleerd of bevat een afwijkende versie.
Ik gebruik bij voorkeur de API calls, kost wel wat meer code maar dan kan ik ook schrijven en lezen in de registry en ik heb alles in de hand.
Het gebruik van .reg bestanden kan ook. Register waardes daarmee uitlezen wordt wat lastiger lijkt me.
groeten, Peter