Hallo

Welkom, Gast. Alsjeblieft inloggen of registreren.

Recent

360 gasten, 0 leden

Welkom, Gast. Alsjeblieft inloggen of registreren.

29 maart 2024, 14:21:11

Login met gebruikersnaam, wachtwoord en sessielengte

Nieuws

Welkom op het vernieuwde NL Computer Forum!

Auteur Topic: Tekst plakken in >1 textbox met VB6?  (gelezen 11458 keer)

0 leden en 1 gast bekijken dit topic.

Offline NLCOMP

  • Forumheld
  • *****
  • Berichten: 14.666
    • NL Computer Forum
Tekst plakken in >1 textbox met VB6?
« Gepost op: 9 november 2009, 20:08:41 »
Bericht 1 van 7

NL Computer Forum ~ SQL & Programmeren
 Van:Ronald BeukerDatum:19-09-2007
 Aan:AllenMsgID: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 7

NL Computer Forum ~ SQL & Programmeren
 Van:Ronald BeukerDatum:19-09-2007
 Aan:AllenMsgID: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 7

NL Computer Forum ~ SQL & Programmeren
 Van:PeterDatum:19-09-2007
 Aan:Ronald BeukerMsgID: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 7

NL Computer Forum ~ SQL & Programmeren
 Van:Ronald BeukerDatum:19-09-2007
 Aan:PeterMsgID: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, 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
[/]
<<
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 7

NL Computer Forum ~ SQL & Programmeren
 Van:PeterDatum:19-09-2007
 Aan:Ronald BeukerMsgID: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 7

NL Computer Forum ~ SQL & Programmeren
 Van:Ronald BeukerDatum:08-10-2007
 Aan:PeterMsgID: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 7

NL Computer Forum ~ SQL & Programmeren
 Van:PeterDatum:08-10-2007
 Aan:Ronald BeukerMsgID: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 API
Let 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