Probleem met plaatjes als knoppen in Access

Status
Niet open voor verdere reacties.

Tick399

Gebruiker
Lid geworden
20 mrt 2013
Berichten
37
Ik heb plaatjes (van knoppen) als knoppen in Access(2007). Bij de gebeurtenis klikken op het plaatje wordt dan een formulier geopend of een actie uitgevoerd. Alleen bij mijn inlogscherm gaat het niet goed. Ik heb een stukje VBA-code die het userid en wachtwoord controleert en dan of een foutmelding geeft of het hoofdmenu opent. Dit werkt prima met een gewone access-knop maar niet met mijn plaatje. Als het wachtwoord wordt ingegeven blijft de foutmelding komen dat het wachtwoord niet is ingevoerd. Zodra ik echter de cursor op het veld met de gebruikersnaam er boven terug zet gaat het wel goed. Is er een manier in VBA om de cursor van het ene formulierveld naar het andere te verplaatsen of een enter af te dwingen o.i.d alvorens mijn stukje VBA code wordt uitgevoerd. Het lijkt alsof het ingevoerde wachtwoord in het wachtwoordveld niet over komt als je op het plaatje klikt terwijl dat wel gebeurd als er een echte knop staat. Hoe dit op te lossen?
 
Laatst bewerkt:
Ik zou zeggen: doe de code er eens bij, want het mag in beginsel niet uitmaken of je klikt op een knop of een plaatje; OnClick = OnClick.
Het verbaast me dus eigenlijk dat het wèl werkt bij een gewone knop...
 
Code:
Private Sub Knop46_Click()
 
    'Check for valid username and password
     If IsNull(Txtgebruikersnaam) Then
         MsgBox "Vul de gebruikersnaam in"
         Exit Sub
     End If
     If IsNull(txtwachtwoord) Then
         MsgBox "Vul het wachtwoord in"
         Exit Sub
     End If
 
    'Dim x As Long
     x = Nz(DLookup("Gebruikersnaam", "Inlogtabel", "Gebruikersnaam='" & Txtgebruikersnaam & "' AND Wachtwoord='" & txtwachtwoord & "'"))
 
    If x > 0 Then
         'We have a valid user
         DoCmd.OpenForm "Hoofdmenu"
         'Forms!frmMainMenu!txtUserID = x
         'Forms!frmMainMenu!txtUserName = txtUserName
 

        DoCmd.Close acForm, "Inlogscherm"
 
    Else
         MsgBox "Onjuiste gebruikersnaam of wachtwoord"
     End If
End Sub
 
Laatst bewerkt door een moderator:
Zelf zou ik nooit zo op een leeg tekstveld checken, maar altijd zo:
Code:
     If Me.Txtgebruikersnaam = vbNullString Then
Maar in essentie zou je code wel moeten kunnen werken. Edoch, ik denk dat mijn methode beter werkt. Kijk eens of het uitmaakt.
 
Nope, werkt niet. Als je een enter geeft nadat je het wachtwoord hebt ingevoerd gaat het goed (cursor springt dan weer terug naar de gebruikersnaam, terwijl bij een echte knop de focus naar de knop gaat ). Als je overigens alleen de gebruikersnaam ingeeft en nog geen enter geeft of klikt op het volgende veld wordt ook de melding gegeven dat de gebruikersnaam niet is gevuld ipv dat het wachtwoord niet is gevuld, wat je verwacht. Kan je geen enter in de code "regelen"? 1 enter of het verplaatsen van de cursor naar het volgende veld is voldoende. Of zou het helpen als ik een transparante echte knop onder het plaatje zou zetten.
 
Laatst bewerkt:
Ik begin een idee te krijgen wat er aan de hand is. Je typt iets in een tekstvak, dat op dat moment de focus heeft en actief is. In beginsel kan Access dan de Value niet uitlezen, tenzij je eerst naar een ander object gaat. De huidige code (zowel die van jou als van mij) leest de Value uit. Je ziet dat weliswaar niet gelijk, maar Me.txtGebruikersnaam is hetzelfde als Me.txtGebruikersnaam.Value. En die is er dus nog niet als je op het plaatje klikt. Wil je een waarde uit een actieve, niet-afgesloten tekstvak, dan moet je niet Value gebruiken maar Text.
Code:
     If Me.Txtgebruikersnaam.Text = vbNullString Then
Zou dus wel kunnen werken.
Deze code heeft wel als nadeel dat het tekstvak altijd de focus moet hebben, en niet is afgesloten. Zou je naar een ander object gaan, waardoor Txtgebruikersnaam niet meer het actieve element is, dan krijg je ook weer een foutmelding. Dus de truc werkt wel, maar levert waarschijnlijk meer problemen op dan ze oplost. Makkelijkst is om de focus codematig te verpaatsen naar iets anders.
Code:
     Me.anderobject.SetFocus
     If Me.Txtgebruikersnaam.Value = vbNullString Then
Is dan ook de meest veilige optie. Je kunt een transparant tekstvak maken met breedte 0 en hoogte 0, zodat je hem niet ziet (desnoods nog achter de knop schuiven) zodat je de focus wel verplaatst, maar dat element niet ziet.
 
Het leek veelbelovend om de focus naar een ander besturingselement te verplaatsen maar ik krijg de melding dat de focus niet naar het besturingselement verplaatst kan worden. Wat gaat hier verkeerd?

Me.Tekst50.SetFocus
' Check for valid username and password
If Me.Txtgebruikersnaam.Value = vbNullString Then
MsgBox "Vul de gebruikersnaam in"
Exit Sub
End If
If Me.txtwachtwoord.Value = vbNullString Then
' If IsNull(txtwachtwoord) Then
MsgBox "Vul het wachtwoord in"
Exit Sub
End If

'Dim x As Long
x = Nz(DLookup("Gebruikersnaam", "Inlogtabel", "Gebruikersnaam='" & Txtgebruikersnaam & "' AND Wachtwoord='" & txtwachtwoord & "'"))

If x > 0 Then
'We have a valid user
DoCmd.OpenForm "Hoofdmenu"
'Forms!frmMainMenu!txtUserID = x
'Forms!frmMainMenu!txtUserName = txtUserName


DoCmd.Close acForm, "Inlogscherm"

Else
MsgBox "Onjuiste gebruikersnaam of wachtwoord"
End If
 
WAt verkeerd gaat is dat je de code niet opmaakt met de CODE knop. Graag vanaf nu (of liever nog met terugwerkende kracht) code opmaken. Dat maakt hem een stuk leesbaarder.
Verder zie ik niet waarachter de code hangt, hij is niet compleet. Dus kan ik ook niet zeggen of het afvangen nu goed gebeurt. Maak anders eens een voorbeeldje, waarschijnlijk was je db al klaar geweest als je dat gelijk gedaan had :)
 
Nu ben je me kwijt. Ik ben nieuw op dit forum en weet niks van een CODE knop. Verder snap ik niet hoe ik hier nu een voorbeeld moet maken zodat jij kan zien waar de code achter hangt. Het zijn gewoon 2 simpele tekstveldjes en een knop van een inlogschermpje. Wat bedoel je met waar het achter hangt?
 
De code knop gebruik je om VBA code netje op te maken. Die zit in de knoppenbalk als je de <Ga geavanceerd> modus gebruikt.
Mijn tweede opmerking betreft het feit dat je code niet compleet is. Je bent de eerste en laatste regel vergeten. Nu heb ik de End Sub niet nodig, maar de eerste (Private sub) wel, want die geeft aan hoe je de code aanstuurt. Aangezien je geen voorbeeldje meepost, moeten we het doen met de tekst van je code. En die is niet voldoende blijkbaar. Daarom duurt je vraag al veel langer dan nodig zou zijn. Maak dus een voorbeeldbestandje, en post dat mee. Is je probleem zo opgelost :)
 
Kijk da's helder. Volgens mij moet 'ie dan zo compleet zijn. Mocht je toch nog iets missen dan lees ik het graag. Er staat trouwens wel knop46 maar deze verwijst naar het plaatje van een knop. Tekst50 is een tekstvakje van 0x0 groot en is niet verborgen of geblokkeerd.

Code:
Private Sub Knop46_Click()
     Me.Tekst50.SetFocus
     ' Check for valid username and password
     If Me.Txtgebruikersnaam.Value = vbNullString Then
         MsgBox "Vul de gebruikersnaam in"
         Exit Sub
     End If
     If Me.txtwachtwoord.Value = vbNullString Then
     ' If IsNull(txtwachtwoord) Then
         MsgBox "Vul het wachtwoord in"
         Exit Sub
     End If
 
    'Dim x As Long
     x = Nz(DLookup("Gebruikersnaam", "Inlogtabel", "Gebruikersnaam='" & Txtgebruikersnaam & "' AND Wachtwoord='" & txtwachtwoord & "'"))
 
    If x > 0 Then
         'We have a valid user
         DoCmd.OpenForm "Hoofdmenu"
         'Forms!frmMainMenu!txtUserID = x
         'Forms!frmMainMenu!txtUserName = txtUserName
 

        DoCmd.Close acForm, "Inlogscherm"
 
    Else
         MsgBox "Onjuiste gebruikersnaam of wachtwoord"
     End If
End Sub

Private Sub Knop47_Click()

End Sub

En dan volgt deze melding in de bijlage.
 

Bijlagen

  • Screenshot - 22-03-2013 , 10_52_17.jpg
    Screenshot - 22-03-2013 , 10_52_17.jpg
    12,3 KB · Weergaven: 29
Laatst bewerkt:
Hoe heb je het tekstvak ingesteld? Er vanuit gaande dat je nog steeds een fout krijgt bij SetFocus?
 
Zie hieronder. Voor de foutmelding zie hier boven onder de code.
 

Bijlagen

  • Screenshot - 22-03-2013 , 11_11_47.jpg
    Screenshot - 22-03-2013 , 11_11_47.jpg
    82,3 KB · Weergaven: 49
  • Screenshot - 22-03-2013 , 11_12_30.jpg
    Screenshot - 22-03-2013 , 11_12_30.jpg
    72,5 KB · Weergaven: 41
Laatst bewerkt:
Ik vraag me zo langzamerhand af of je veldenstructuur wel in orde is. Met name: is het veld [Gebruikersnaam] wel een getal? Want daar zit ook een probleem als dat niet zo is. En gezien de check die je doet, heb ik hevige twijfels. In dat geval zou ik de code zo ombouwen. Getest met een afbeelding, en hij werkt.
Code:
Private Sub Afbeelding0_Click()
Dim x As Variant
Dim sCheck As String
     
     Me.Txtgebruikersnaam.SetFocus
     If Me.Txtgebruikersnaam.Text & "" = "" Then
         MsgBox "Vul de gebruikersnaam in"
         Exit Sub
     End If
     Me.txtwachtwoord.SetFocus
     If Me.txtwachtwoord.Text & "" = "" Then
         MsgBox "Vul het wachtwoord in"
         Exit Sub
     End If
 
    sCheck = "[Gebruikersnaam]='" & Me.Txtgebruikersnaam & "' AND Wachtwoord='" & Me.txtwachtwoord & "'"
    x = Nz(DLookup("[Gebruikersnaam]", "[Inlogtabel]", sCheck))
    If Not x = vbNullString Then
        DoCmd.OpenForm "Hoofdmenu"
        DoCmd.Close acForm, Me.Form.Name
    Else
         MsgBox "Onjuiste gebruikersnaam of wachtwoord"
     End If
End Sub
 
Dan zal daar wel de fout zitten. Het veld gebruikersnaam is een tekstveld. Blijft raar dat de code gewoon gewerkt heeft. Maar goed ook als ik deze code gebruik haakt hij al af bij de setfocus op txtgebruikersnaam.
 
Dan weet ik het ok niet meer. De code werkt bij mij perfect. Zonder voorbeeldje is het dus wat mij betreft einde oefening.
 
Ik zal het relevante deel van de database er als bijlage bij zetten. Bij het uploaden van het betreffende accdb-bestand krijg ik de melding invalid file. Mag je een database niet uploaden op dit forum?
 
Laatst bewerkt:
Nee, databases gaat niet lukken. Eerst comprimeren, en dan zippen en dan mag/kan het wel.
 
Bij deze een zip. Bij een ander probleem had ik waarschijnlijk de moed al opgegeven en iets anders geprobeerd, maar dit probleem ga ik op nog meer plaatsen krijgen straks bij het verwisselen van alle knoppen op alle formulieren. Dus als je nog even zou willen kijken, dan graag. Alvast bedankt.

N.B.: Nog even voor de zekerheid de fout treedt op als je admin invoert enter geeft en dan bij het wachtwoord nog een keer admin en dan zonder enter op inloggen klikt.
 

Bijlagen

Laatst bewerkt:
Hij doet inderdaad vreemd. Ik zou in ieder geval de Recordbron van het formulier afhalen, want die heb je helemaal niet nodig. Het is namelijk een niet-afhankelijk formulier. Verder kun je er een extra regel bijzetten, die de foutmelding afvangt. Gek genoeg loopt hij dan namelijk weg gewoon werkend door;

Code:
    On Error Resume Next
    Me.Txtgebruikersnaam.SetFocus
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan