Knop niet of wel beschikbaar maken

Status
Niet open voor verdere reacties.

Chris Cools

Gebruiker
Lid geworden
19 okt 2008
Berichten
152
Hello,

ik heb een knop op een formulier die ik enkel pas wil beschikbaar maken als een bepaald veld is ingevuld.
Ik heb het via volgende code gedaan:


Private Sub Form_Open(Cancel As Integer)


If Me.TxtBestelbon = "" Then

Me.KnpToevoegen.Enabled = False

Else

Me.KnpToevoegen.Enabled = True

End If


End Sub

Maar om de 1 of andere reden werkt dit niet... iemand een idee wat er zou kunnen schelen, of wat ik verkeerd kan hebben gedaan?

grtz,

chris
 
De code wordt alleen aangesproken bij het openen van het formulier.

Werkt het dan wel?

Indien nee probeer onderstaande code:

Code:
If Me.TxtBestelbon = "" Or _
IsNull(Me.TxtBestelbod) Then

Me.KnpToevoegen.Enabled = False

Else

Me.KnpToevoegen.Enabled = True

End If
End Sub

Zo ja, wanneer werkt het dan niet?

mvg
Charles
 
hey Charles,

bedankt voor je uitleg!
Als ik het stuk van IsNull bijgevoegd had, dan werkte het idd wel.
Ik dacht dat "" genoeg was om aan te geven dat het vak leeg was...
Als ik dan het formulier open, dan is de knop idd niet beschikbaar.
maar als het vak dan ingevuld is, blijft de knop onbeschikbaar...

en het is idd alleen bij het openen, want als ik naar designweergave ga en terug, dan is de knop wel beschikbaar...

heeft dat ermee te maken dat bij het oproepen van het formulier het vak leeg is en dat VBA nadien nergens meer detecteert dat er iets moet veranderen? Dat hij enkel de code doorloopt bij het openen?

grtz,

chris
 
Ik heb het kunnen oplossen door het volgende te doen:



Private Sub TxtArtikel_AfterUpdate()


If IsNull(Me.TxtArtikel) Or IsNull(Me.TxtBestelbon) Or IsNull(Me.ComboAanvuller) Then

Me.KnpToevoegen.Enabled = False

Else

Me.KnpToevoegen.Enabled = True

End If

End Sub



Private Sub TxtBestelbon_AfterUpdate()


If IsNull(Me.TxtArtikel) Or IsNull(Me.TxtBestelbon) Or IsNull(Me.ComboAanvuller) Then

Me.KnpToevoegen.Enabled = False

Else

Me.KnpToevoegen.Enabled = True

End If


End Sub


Private Sub ComboAanvuller_AfterUpdate()


If IsNull(Me.TxtArtikel) Or IsNull(Me.TxtBestelbon) Or IsNull(Me.ComboAanvuller) Then

Me.KnpToevoegen.Enabled = False

Else

Me.KnpToevoegen.Enabled = True

End If




End Sub


Maar nu zit ik nog met het probleem dat de knop wel beschikbaar blijft nadat op toevoegen geklikt is.

Nu dacht ik dit op volgende manier opte lossen:

Als op de knop toevoegen wordt gedrukt, loopt er een appendquery en nadien wordt de code achter de knop-Annuleren opgeroepen om alle velden leeg te maken.
Ik had dan geprobeerd om in de code van de knop annuleren het volgende bij te plaatsen:

me.knpAnnuleren.enabled = false

Maar dan krijg ik de melding dat de Knop toevoegen niet enabled gezet kan worden zolang hij de "focus" heeft...

zit dus weer effe strop... :)
 
1. Je hebt nu bij 3 gebeurtenissen de zelfde code staan. Dat is niet handig. Beter is om de code in een apparte sub te zetten die je bij de 3 gebeurtenissen aanroept. Mocht er iets gewijzigd moeten wordn in de code hoef je dat maar eenmaal te doen. Nu moet je dat 3 keer doen.

2. Verplaats eerst de focus naar een ander object voordat je onderstaande code oproept:

Code:
me.knpAnnuleren.enabled = false

Je kunt de focus verplaatsen met:

Me.NaamVanEenTekstveld.Setfocus

mvg
Charles
 
hey,

met het verplaatsen van de focus lukt het idd wel!!! :thumb: thanx

Maar hoe ik het juist moet doen, om de code compacter te maken en dan aan te roepen is me niet helemaal duidelijk... daar komt de VBA leek in mij dan weer piepen...:)
Ik vind het moeilijk om wegwijs te raken in het gebruik van VBA, bvb wat is het verschil tussen een sub en een funtie, hoe moet je ze aanroepen, wanneer gebruik je private en public, hoe moet je juist declareren en waarom moet dat juist...
Je hoort het nog 1 grote mist :shocked: , maar ik probeer zo hier en daar wat dingen bij mekaar te sprokkelen in de hoop dat het uiteindelijk wel eens op z'n plaats gaat vallen in de bovenkamer!!!

Dus zal ik dat eens even moeten proberen uit te dokteren in een vrij momentje...



Heeft het voorts nog nadelen als ik het op deze manier doe?

grtz,

chris
 
Hangt er vanaf hoe groot je applicatie is. Hoeveel meer code er in je applicatie zit hoe onoverzichtelijker het onderhoud wordt. Hoeveel meer er bij het opstarten in het geheugen geladen moet worden, hoe trager de performence wordt.

Vervang je code die je hier eerder hebt geplaatst met onderstaande code. Probeer deze eens te lezen en kijk of je het begrijpt.

Code:
Private Sub sEnableDisable()


If IsNull(Me.TxtArtikel) Or IsNull(Me.TxtBestelbon) Or IsNull(Me.ComboAanvuller) Then

Me.KnpToevoegen.Enabled = False

Else

Me.KnpToevoegen.Enabled = True

End If

End Sub

Private Sub TxtArtikel_AfterUpdate()

call sEnableDisable

End Sub



Private Sub TxtBestelbon_AfterUpdate()

call sEnableDisable

End Sub


Private Sub ComboAanvuller_AfterUpdate()

call sEnableDisable

End Sub
 
Hey,

bedankt voor de uitleg!!!

Als ik de code zo zie, dan denk ik het toch wel te begrijpen.

Eerst bepaal je een actie en aan welke voorwaarden die moeten doen.
Dan beschrijf je de drie situaties waarin deze actie( met de voorwaarden) moet worden uitgevoerd.

Is er een speciale reden waarom je de letter S voor EnabledDisabled hebt staan?

grtz,

chris
 
Dat is om aan te geven bij de:

Call ....... (Call kun je eigenlijk weg laten, maar ik vind het duidelijker om het te laten staan)

of het een sub (s....) of een functie (f....) is die je aanroept.

Zijn geen vaste regels en is ook geen verplichting.

mvg
Charles
 
Hey Charles,

ik zou nog wel enkele vragen kunnen stellen over VBA, maar dat ga ik je niet aandoen.
Ga dit zoveel mogelijk proberen uit te dokteren met wat ik hier op het forum kan vinden.

Toch (weeral!!) hard bedankt voor de oplossing van dit probleem!!!:thumb:


grtz,

chris
 
thanx!!! hier staan zeker bruikbare dingen in!!!!
ga nu eerst op zoek naar wat extra uiteg over hoe VBA moet opgebouwd worden, wat funties en subs zijn enzo...

grtz
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan