Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 7 su 7

disattivazione NUMLOCK involontaria

  1. #1
    L'avatar di muttley005
    muttley005 non è in linea Topo di biblioteca
    Ciao, scusate il titolo ma non ne trovo uno migliore.
    Spiego:
    ho una form (f1) continua che espone un elenco di record filtrati in base a dei controlli presenti nell'intestazione form, ne ho N ma riduciamo per semplificazione a c1 e c2 (due date) che indicano da-a dell'evento.
    Per entrambi i controlli all'update eseguo la funzione di CalcolaFiltro, che ricalcola appunto il filtro ed aggiorna l'elenco.
    Questo ERA il codice
    'costruisco il filtro
        SQL = ... 
    'applico il filtro
        Me.RecordSource = SQL
    
    Il che fa il suo dovere in quanto a filtro elenco ma il focus, quando esegue il passo
        Me.RecordSource = SQL
    
    non passa al controllo successivo ma al primo controllo del corpo

    A quel punto ho pensato di passare a questo
        Set C = Me.ActiveControl
        Me.RecordSource = SQL
        C.SetFocus
        SendKeys ("{TAB}")
    
    che riporta il focus sul controllo che ha modificato il filtro ed al sendkey al successivo come mi aspetto
    e anche questo funziona ma non si sa per quale motivo si disabilita il tastierino numerico da solo anche se nell'angolo in basso a destra della finestra di Access rimane scritto (ma non lo è)
    e se ripremo il NUMLOCK la scritta scompare ma in realtà si è riabilitata.
    Tra l'altro questo comportamento me lo da solo la prima volta che aggiorno e solo la prima volta che apro la form. se la chiudo (la form) e la riapro (senza chiudere access) la cosa non si ripresenta.

    Se tolgo il sendkey tutto funziona ... ma chiaramente non passa al controllo successivo

  2. #2
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Scommetto che se togli in Sendkeys non lo fa più questo scherzetto...
    È un BUG di vefchia data... ;-)

    Leggi qui propone un workaround
    https://stackoverflow.com/questions/...in-access-form

    Tuttavia mi chiedo se seva veramente usare il Sendkeys...
    Anche se I criteri fossero 100... l'ordine è predefinito... e siccome dici di gestire l'evento AFTERUPDATE dei singoli controlli... va da se che in ogni evento specifico sai su quale controllo spostare il focus...
    ℹ️ Leggi di più su @Alex ...

  3. #3
    L'avatar di muttley005
    muttley005 non è in linea Topo di biblioteca
    Quote Originariamente inviato da @Alex Visualizza il messaggio
    Scommetto che se togli in Sendkeys non lo fa più questo scherzetto...
    È un BUG di vefchia data... ;-)
    si come avevo scritto se lo tolgo va ma rimane sul controllo che ha generato l'aggiornamento

    grazie, lo guardo subito

    Tuttavia mi chiedo se seva veramente usare il Sendkeys...
    Anche se I criteri fossero 100... l'ordine è predefinito... e siccome dici di gestire l'evento AFTERUPDATE dei singoli controlli... va da se che in ogni evento specifico sai su quale controllo spostare il focus...
    qui ti ho perso... es: sono sul controllo con ordine di spostamento 0, l'afterupdate si attiva ed il focus lo perdo al Me.RecordSource = SQL per cui memorizzando il controllo che ha generato l'aggiornamento ci ritorno... poi come faccio a passare al successivo.?!
    magari lo scoprirò nel link

  4. #4
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Sinma al di la dell'ordine di spostamento... se sei sul controllo X con Indice(0) sai bene qual'è il controllo Y di indice(1)... o no..?
    In questo caso
    Private Sub ControlloX_AfterUpdate()
    .....
        Me.RecordSource=sSQL
        Me!ControlloY.Setfocus
    End sub
    
    Se poi hai fatto una funzione passi alla funzione ControlloAttivo e ControlloSuccessivo
    Private Function ApplicaFiltro(actObj as Control, nextObj as Control)
    ... costruzione SQL
        ME.RECORDSOURCE=sql
        NextObj.setfocus
    End sub
    
    ℹ️ Leggi di più su @Alex ...

  5. #5
    L'avatar di muttley005
    muttley005 non è in linea Topo di biblioteca
    si Alex ma se per assurdo io avessi 100 controlli dovrei per ognuno inserire una funzione in cui passo come parametro il nome del controllo successivo col problema che se dovessi spostare graficamente una serie di controlli-filtro dovrei quindi riadattare l'ordine di spostamento di tutti.

    Però è anche vero che con
    i=me.activecontrol.tabindex
    
    otterrei l'indice di spostamento del controllo attivo e a quel punto potrei passarlo al controllo con tabIndex i+1
    però se non sbaglio non c'è una funzione/proprietà della form che lo fa nativamente...
    intendo qualcosa tipo
    me.CollectionPerOrdineDiSpostamento(i+1).setfocus
    
    dovrei usare una funzione che cicla per tutti i controlli della form
    qualcosa tipo questa che ho trovato in rete per brevità e che non avrei problemi a riprodurre/riadattare a mio piacimento
    Public Sub GotoNextTabIndexCtrl(ActiveCtrl As Access.Control)
        Dim Ctrl                  As Access.Control
        Dim iTabIndex             As Integer
     
        On Error GoTo Error_Handler
     
        iTabIndex = ActiveCtrl.TabIndex
    StartOver:
        For Each Ctrl In ActiveCtrl.Parent
            Select Case Ctrl.ControlType
            Case acCheckBox, acComboBox, acCommandButton, acListBox, _
                 acOptionGroup, acTextBox, acWebBrowser
                If Ctrl.TabStop = True Then
                    If Ctrl.TabIndex = iTabIndex + 1 Then
                        If Ctrl.Visible = False Then
                            iTabIndex = iTabIndex + 1
                            GoTo StartOver
                        Else
                            Ctrl.SetFocus
                            Exit For
                        End If
     
                    End If
                End If
            End Select
        Next Ctrl
     
    Error_Handler_Exit:
        On Error Resume Next
        If Not Ctrl Is Nothing Then Set Ctrl = Nothing
        Exit Sub
     
    Error_Handler:
        MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
               "Error Number: " & Err.Number & vbCrLf & _
               "Error Source: GotoNextTabIndexCtrl" & vbCrLf & _
               "Error Description: " & Err.Description & _
               Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
               , vbOKOnly + vbCritical, "An Error has Occurred!"
        Resume Error_Handler_Exit
    End Sub
    
    correggimi se non è così per cortesia perchè già mi ero fissato col TAB senza pensare di poter sfruttare la proprietà tabindex ...

  6. #6
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Scusa ma di quanti controlli stiamo parlando...?
    Se fossero più di 20 magari avrebbe un senso... altrimenti... boh.
    In ogni caso sono da anlizzare il valore di TabIndex(Iniziale) e TabIndex(Finale) dei controlli da monitorare... e devono essere consecutivi e senza buchi... sia che tu voglia usare una Collection oppure un'array che forse è meglio...!

    Se il TabIndex(Ini)=0 sei a cavallo usa un'array di controlli...

    Option Compare Database
    Option Explicit
    Private arrTab(NumTotale) As Control
    
    ' Sfrutti la funzione che hai riportato sopra per popolare l'Array... su LOAD e poi usi sempre l'array
    
    Se il TabIndex(Ini)>0, ipotiziamo 5, allora imposta un Offset e parti sempre da Zero come Array
    Option Compare Database
    Option Explicit
    Private arrTab(NumTotale) As Control
    Private Const offTabIndex As Long=5
    
    ' Sfrutti la funzione che hai riportato sopra per popolare l'Array... su LOAD e poi usi sempre l'array
    
    In questo caso sai che l'indice di Array è uguale a TuoControl.TabIndex-[CODE]Option Compare

    Poi modifichi la Funzione GotoNextTabIndexCtrl, una cosa simile... a braccio
    Function GotoNextTabIndexCtrl(ctl As Access.Control) As Access.Control
       Dim nextIndex As long
       If ctl.TabINdex-offTabIndex >Ubound(arrTab()) Then 
          nextIndex=Lbound(arrTab())
       Else
          nextIndex=ctl.TabINdex-offTabIndex+1
       End If
       Set GotoNextTabIndexCtrl=arrTab(nextIndex)
    End Function
    
    ℹ️ Leggi di più su @Alex ...

  7. #7
    L'avatar di muttley005
    muttley005 non è in linea Topo di biblioteca
    E' che sono un pò fissato col parametrizzare-automatizzare ma in questo caso in effetti non arrivo nemmeno a 20 ... sono una quindicina di controlli che fanno da possibili filtri per cui probabilmente non ha senso sbattersi.

    Quindi per concludere il 3D (fosse utile ad altri):
    • il sendkey genera un bug noto (a me non lo era) che annulla il numlock
    • si può aggirare con dei workaround come da link
    • si può aggirare con un ciclo sui controlli come da post #5
    • si può aggirare, come proposto da Alex, semplicemente inserendo nell'afterupdate di ogni controllo il riferimento al controllo successivo, che non è "automatico" ma è molto pratico[/URL]

    grazie

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. [Outlook] Sendkeys disattiva Numlock
    Da Amedeo.Rosa nel forum Microsoft Word
    Risposte: 16
    Ultimo Post: 25-09-2017, 22:19
  2. Disattivazione incolonnatura automatica
    Da fpta09 nel forum HTML, CSS e JavaScript
    Risposte: 1
    Ultimo Post: 12-11-2011, 14:35
  3. Disattivazione tasto shift
    Da ventimm nel forum Microsoft Word
    Risposte: 1
    Ultimo Post: 20-03-2008, 17:16
  4. [Access]Disattivazione messaggio di errore
    Da raff5184 nel forum Microsoft Access
    Risposte: 5
    Ultimo Post: 12-01-2007, 13:00
  5. Problemi di disattivazione HD esterno
    Da foxdeadwood nel forum Microsoft Windows
    Risposte: 4
    Ultimo Post: 16-02-2006, 21:41