Posizionamento cursore

di il
9 risposte

Posizionamento cursore

Buongiorno,

Ho il seguente problemino, ho cercato tanto sui vari forum e sul sito microsoft ma senza risultato.
Ho fatto una maschera di accesso al database nel quale si inserisce il nome operatore attraverso lettore di codice a barre (l'operatore deve sparare il proprio codice a barre che ha sul badge).
E' composta da un campo di testo dal nome txtAccessoAutomatizzato, e da due pulsanti.
Il primo apre una seconda maschera per l'eventuale inserimento manuale del nome utente e password, il secondo pulsante chiude la maschera ed esce da Access.
Tramite VBA ho messo un controllo su cosa viene inserito nella casella txtAccessoAutomatizzato. Se il contenuto è corretto (è un operatore abilitato) si entra nel sistema e si va avanti (e funziona).
Se il nome utente è errato il contenuto della cella viene cancellato tramite

Me.txtAccessoAutomatizzato = NULL

E qui il problema: dopo aver cancellato il contenuto il cursore deve riposizionarsi nella casella per un nuovo inserimento, per cui ho aggiunto

Me.txtAccessoAutomatizzato.SetFocus

ma invece di avere il cursore nella casella viene evidenziato il primo pulsante, per tornare nella casella di testo devo premere due volte il tasto TAB (oppure, ovviamente, si usa il mouse).

Come faccio ad avere il cursore nella casella di testo senza intervenire sulla tastiera?
L'operatore deve fare gli inserimenti solo cliccando codici a barre, fisicamente è lontano dal pc.

Grazie per l'aiuto
Stefano

9 Risposte

  • Re: Posizionamento cursore

    Pubblica la parte rilevante del codice altrimenti non ci sono sufficienti elementi per poterti dare indicazioni.
  • Re: Posizionamento cursore

    Eccolo:

    Private Sub txtAccessoAutomatizzato_AfterUpdate()

    Dim Posiz As Integer ' La posizione della virgola
    Dim Recon As Boolean ' Flag utente riconosciuto
    Dim strNome As String ' Nome utente
    Dim strPwd As String ' Password utente

    Posiz = InStr(Me.txtAccessoAutomatizzato, ",") ' Ricavo la posizione della virgola, se non c'è il risultato è zero.

    If Posiz = 0 Then ' Quello che è stato scritto non è corretto.
    ' Cancello la casella di testo e ci riposiziono il cursore.
    Me.txtAccessoAutomatizzato = Null
    Me.txtAccessoAutomatizzato.SetFocus
    Else
    ' Dato valido, estrapolo nome e pwd e controllo se sono validi
    ' A sinistra della virgola c'è il nome, a destra c'è la password.
    strNome = Left(Me.txtAccessoAutomatizzato, Posiz - 1)
    strPwd = Right(Me.txtAccessoAutomatizzato, (Len(Me.txtAccessoAutomatizzato) - Posiz))

    Recon = False ' Inizializzo

    Recon = TrovaOperatore(strNome, strPwd) ' Check dell'utente

    If Recon = False Then
    Me.txtAccessoAutomatizzato = Null
    Me.txtAccessoAutomatizzato.SetFocus
    End If

    If Recon = True Then
    strGlbNomeOperatore = strNome
    DoCmd.OpenForm "frmAutomatizzato", acNormal
    End If


    End If

    End Sub
  • Re: Posizionamento cursore

    Spiego velocemente:

    Nel badge dell'operatore c'è il nome e la password per l'accesso al database, chiusi in un qr code separati dalla virgola.
    Per accedere l'operatore spara il proprio badge in questa maschera.
    Il primo controllo è la presenza della virgola nella stringa sparata, se non c'è è stato scritto qualcosa a mano e il tutto viene cancellato.
    Se la virgola è presente si va nel database degli operatori a verificare se il badge sparato è corretto, se è corretto si procede, se non è corretto si cancella tutto e ci si predispone in attesa di un nuovo badge.
  • Re: Posizionamento cursore

    Forse la soluzione è ricaricare la maschera ?
  • Re: Posizionamento cursore

    Il controllo dei dati lo devi fare sull'evento BeforeUpdate.
  • Re: Posizionamento cursore

    StackPtr ha scritto:


    
    Private Sub txtAccessoAutomatizzato_AfterUpdate()
    ...
        If Posiz = 0 Then   ' Quello che è stato scritto non è corretto.
            ' Cancello la casella di testo e ci riposiziono il cursore.
            Me.txtAccessoAutomatizzato = Null
            Me.txtAccessoAutomatizzato.SetFocus
        Else
    ...
            Recon = False   ' Inizializzo
            Recon = TrovaOperatore(strNome, strPwd) ' Check dell'utente
            If Recon = False Then
                ...
            End If
            If Recon = True Then
                ...
            End If
        End If
    End Sub
    Ho eliminato qualche interruzione di riga per guadagnare spazio (ricorda l'uso dei tag CODE, il codice deve comparire come lo vedi scritto qui sopra e più avanti nel post, non come testo normale).
    Alcune migliorie di "stile" che aiutano a seguire meglio l'esecuzione del codice e la sua lettura.
    Prima If: all'uscita della parte vera si va di fatto alla fine della sub. Senza tenere tutto il resto della routine dentro Else, metti un Exit Sub dentro la parte vera della If. Diverso il caso in cui ci fosse altro codice da eseguire sempre.
    Recon: valore boolean, vero o falso. Inutile fare due If: se non è vero deve per forza essere falso. Si mette in una If unica con il classico Else. Proprio perché è già boolean non ho bisogno di verificarne l'uguaglianza con True o False. Ne sfrutto direttamente il valore (in questo caso con la negazione Not, per "invertirlo") per condizionare l'esecuzione della parte vera o falsa della If.
    Private Sub txtAccessoAutomatizzato_AfterUpdate()
    ...
        If Posiz = 0 Then   ' Quello che è stato scritto non è corretto.
            ' Cancello la casella di testo e ci riposiziono il cursore.
            Me.txtAccessoAutomatizzato = Null
            Me.txtAccessoAutomatizzato.SetFocus
            Exit Sub
        End If
    ...
            Recon = TrovaOperatore(strNome, strPwd) ' Check dell'utente
            If Not Recon Then
                Me.txtAccessoAutomatizzato = Null
                Me.txtAccessoAutomatizzato.SetFocus
            Else
                strGlbNomeOperatore = strNome
                DoCmd.OpenForm "frmAutomatizzato", acNormal
            End If
    
    Detto questo andiamo al problema in senso stretto: non so dov'è il problema.
    L'unica cosa che ci dai per certa è il funzionamento quando nome utente e pwd presi dalla lettura del qr code sono giusti ma la maggior parte del codice gestisce altre situazioni. Vedo la presenza di variabili non dichiarate, come pure di una funzione, quindi di certo c'è altro codice. Le variabili che usi e che non si vedono dichiarate a livello di routine sono comunque dichiarate a livello di modulo o globali? Detto in un altro modo: c'è Option Explicit in ogni modulo?
    Dopo aver riscritto il codice come ti ho suggerito prova a fare un debug con esecuzione di una riga per volta.
    Confido in un'illuminazione in corso di giornata.
  • Re: Posizionamento cursore

    Philcattivocarattere, grazie per i consigli.

    Le variabili che hanno Glb all'inizio sono globali, la funzione TrovaOperatore è in un modulo a parte.
    Usando dati giusti tutto funziona regolarmente, è quando inserisco dati sbagliati che la cosa non funziona.
    Sono convinto che sto sbagliando metodo, non è qui che devo riposizionare il cursore nella finestra di testo.
    Continuo a studiare, poi vedo.

    Grazie
    Stefano
  • Re: Posizionamento cursore

    Non hai risposto a tutto ciò che ti ha chiesto Phill
    hai Option Explicit ovunque?
    il debug che errore ti dà e su quale riga?
  • Re: Posizionamento cursore

    Ho risolto.
    Sicuramente non è elegante, ma funziona, al momento è quello che mi interessa prima che il mio capo mi prenda a calci.
    Option Explicit è presente ovunque, e il debug non l'ho mai usato per l'esecuzione passo passo e non so come si fa.
    Comunque, ho aggiunto una variabile boolean che va a true quando inserisco una stringa non valida nella casella di testo.
    Questa variabile viene analizzata in un evento "su Attivato" relativo al pulsante che ho nella mia maschera sul quale va il Focus dopo aver inserito la stringa errata, se la trova a True la azzera e rimanda il focus alla casella di testo.

    Questo mi permette di andare avanti, quando le bocce saranno ferme vedrò di analizzare meglio la questione.

    Grazie a tutti
    Ste
Devi accedere o registrarti per scrivere nel forum
9 risposte