Probleem met selstart - sellength

Status
Niet open voor verdere reacties.

jhdw

Gebruiker
Lid geworden
15 dec 2012
Berichten
166
Goedendag,

In een dB heb ik een formulier dat niet goed (meer) werkt m.b.t. de zoekvelden. Er staan meerdere zoekvelden in waarop live gefilterd kan worden. Dit heeft altijd goed gewerkt maar nu niet meer. De code hangt aan de gebeurtenis "bij wijzigen". Als er een teken in een veld wordt ingegeven wordt er gelijk gefilterd, echter de cursor gaat niet meer naar de laatste maar naar de eerste positie in het veld. Bijv. in txtFilter2 geef je een a in en dan wordt er gefilterd waarna de cursor voor de a gaat staan; dat werkt natuurlijk niet zoals het hoort.

Ik wou in het zoekveld bij onderdeelnummer (txtFilter1) de code hangen aan de gebeurtenis "After update" omdat de gebruikers ook met een scanner werken. Het was dan zo dat na elk teken het filter doorlopen werd waardoor het onnodig lang duurt. Ik dacht met de code achter het event "After update" sneller te kunnen zijn.

Een aantal maanden geleden heb ik Office 2019 geïnstalleerd, ik dacht dat het daar iets mee te maken heeft. Office 2016 teruggezet maar daar is het niet anders. In andere porgramma's met dezelfde constructie werkt het ook niet goed meer. Bij clientinstellingen staat dat de cursor het einde in het veld moet gaan.

Wie heeft een idee en oplossing voor dit rare probleem.

Alvast bedankt

Gr. Jan
 

Bijlagen

  • Helpmij_test.zip
    93,4 KB · Weergaven: 37
Of we geven de oplossing:
Code:
Function ChangeTxtField(ctl As String) As Boolean
    On Error GoTo Hell
        Me(ctl).SelStart = Len(Me(ctl).Text)
        If Mid(Me(ctl), 1) <> vbNullString Then
            CheckFilter Me
            Me(ctl).SetFocus
            Me(ctl).SelStart = Me(ctl).SelLength
        End If
    
Hell:
    ChangeTxtField = False
End Function
 
Bedankt voor de reacties.

Deze functie staat er al in (bij mij staat nog een me.refresh).
Het probleem zit er nog steeds in.
Als ik bijv. in txtFilter2 (zoekveld boven Ond_omschrijving) het volgende intyp: pakking.
Dan komt er te staan: gnikkap en de cursor staat vooraan in het veld!

Werkt het op jullie PC / Laptop wel goed?

Ik wil nog bij iemand anders op de PC proberen hoe het daar werkt.

Als noodoplossing heb ik nu deze code:
Code:
Function ChangeTxtField(ctl As String) As Boolean
    On Error GoTo Hell
        Call NumLock
        Me.Refresh
        Me(ctl).SelStart = Me(ctl).SelLength
        If Mid(Me(ctl), 1) <> vbNullString Then
            CheckFilter Me
            Me(ctl).SetFocus
'            Me(ctl).SelStart = Me(ctl).SelLength
            SendKeys "{TAB}", True
            SendKeys "+{TAB}", True
        End If
    
Hell:
    ChangeTxtField = False
End Function

Omdat ik daarna ook nog een probleem kreeg met af en toe uitschakelen van NumLock, heb ik nog een functie gevonden op internet om dit te voorkomen. Allemaal lapmiddelen, maar je moet wat.
Code:
Option Compare Database
Option Explicit

Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Private Const kNumlock = 144

Public Function NumLock() As Boolean
    NumLock = KeyState(kNumlock)
    If (NumLock = True) Then
'        MsgBox ("Num lock was off. Will turn back on now...")
        SendKeys "{NUMLOCK}", True
'    Else: MsgBox ("Num Lock stayed on")
    End If
End Function

Private Function KeyState(lKey As Long) As Boolean
    KeyState = CBool(GetKeyState(lKey))
End Function
 
Heb even je database geïnstalleerd en op mijn PC (office 2016) gaat alles goed. Mogelijk is dat de installatie van office 2019 ergens een paar dll's heeft overschreven met een nieuwere versie en bij herinstallatie van 2016 zijn deze nieuwere versies blijven staan.
 
Bedankt voor de terugmelding.
Dat zou dan betekenen dat Office 2019 (32 bits) anders met selstart - sellength omgaat als Office 2016 (32 bits).
Met de groeten van Microsoft.:(
 
Bij mij (Office 365) doet-ie het ook niet. Dus het ligt niet aan jou. Overigens heb je mijn aanpassing (die dus wél werkt) ofwel niet gelezen, of wens je hem niet te gebruiken. :D.
 
Goedenavond,

Hallo Michel, ik had jouw code er al in staan (die heb je al eens voor mij gemaakt).
Ik ben vanmiddag bij iemand geweest die Office 365 heeft en daar werkt het wel zoals het hoort. Wel vreemd dat het bij jou met 365 ook niet werkt. Het blijft natuurlijk wel Microsoft.

Als ik op mijn PC in een txtFilter één teken in geef, dan springt de cursor daarna gelijk naar het begin in het veld (bij gebeurtenis "bij wijzigen"). Als je de code bij gebeurtenis "After update" zet kun je wel meerdere tekens ingeven, maar na ENTER springt de cursor ook gelijk weer naar het begin in het veld.

Andere programma's die dezelfde constructie hebben, werken op dit punt ook niet goed meer!

Ik zou niet weten waar het nu aan ligt.
CCleaner laten draaien na het verwijderen van Office 2019, ook nog eens TuneUp van AVG de zaak laten opschonen. Het brengt allemaal niks.

Wat kun je nog meer doen, behalve de PC opnieuw installeren en als het aan Office 2019 ligt nog hetzelfde probleem hebben?
 
Ik heb deze aanpassing gemaakt:
Code:
        Me(ctl).SelStart = [B][COLOR="#FF0000"]Len(Me(ctl).Text)[/COLOR][/B]
Die zie ik in jouw laatste code niet terug. Bij mij werkt hij dan prima.
 
Bedankt.

Als je deze code bij "bij wijzigen" zet, dan werkt het mij nu ook.
Echter als je deze code bij "After update" zet, dan werkt het niet, na ENTER springt de cursor weer naar de eerste positie in het veld.

Na TAB en SHIFT TAB staat de cursor wel na de laatste positie in het veld.

Mijn vraag is dan waarom het eindresultaat van de cursorpositie bij de twee gebeurtenissen verschillend is.
 
Echter als je deze code bij "After update" zet, dan werkt het niet, na ENTER springt de cursor weer naar de eerste positie in het veld.
Logisch; de eigenschap .Text werkt alleen bij een object dat de focus heeft. AfterUpdate verplaatst de focus (anders zou het geen After Update zijn).
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan