Intercettare evento paste in una combo box

di il
4 risposte

Intercettare evento paste in una combo box

Buongiorno a tutti.
Ho un form di ricerca in visualizzazione griglia che in "intestazione maschera" ha una textbox in cui viene sparato il bar code oppure digitato un testo codice che filtra i dati man mano che vengono digitati i singoli caratteri. Tutto viene gestito dall'evento change che scatena una serie combinata di requery (gestite da codice FormLoad Me.RecordSource = SQL... e non dalle query Access) che puntano sullo stesso textbox. Nel caso della sparata barcode l'evento si scatena invece all'invio incluso nella "sparata" che passa il focus sul bottone posto subito dopo (il requery viene avviato su quel focus).

L'unica cosa che non riesco a gestire è l'evento paste che può essere fatto da control+v oppure con incolla da mouse. L'evento change del textbox viene avviato da control+v (ma non da incolla da mouse) e comunque essendo gli eventi legati al .value viene rilevato un valore vuoto anche nel caso control+v.

Dovrei pertanto intercettare con precisione l'evento paste, comunque sia fatto, avendo come unica certezza il fatto che il focus è sul textbox. A quel punto prelevo il valore dalla clipboard e lo accoderò direttamente nella variabile delle routine che attualmente preleva invece un valore vuoto.

E' la prima volta che chiedo soccorso in un forum pertanto spero di essermi spiegato sufficientemente, diversamente perdonatemi perché la sintesi non è un mio pregio.

Ringrazio anticipatamente chi contribuisce

4 Risposte

  • Re: Intercettare evento paste in una combo box

    Devi sempre sfruttare l'evento Change del textbox recuperando i dati inseriti tramite la proprietà Text dello stesso controllo.
  • Re: Intercettare evento paste in una combo box

    Ciao, per gestire l'eventuale 'paste' da mouse potresti impostare una logica che coinvolge le proprietà valore del text box e gli eventi mouse up e mouse down. Probabilmente copiando in una variabile il valore del textbox quando clicchi sul mouse e quando rilasci il mouse prelevi e confronti il nuovo valore del medesimo text box con quello precedentemente memorizzato potrai decidere cosa fare in caso il valore è differente anche se temo che l evento relativo al rilascio del mouse avvenga prima del cambio valore del textbox quindi forse non rileverestii cambiamenti..
  • Re: Intercettare evento paste in una combo box

    Ciao mokor,
    potresti gestire entrambe le cose nell'evento "keydown" della textbox. Vedi i seguenti link:
    https://msdn.microsoft.com/en-us/vba/access-vba/articles/textbox-keydown-event-access
    https://msdn.microsoft.com/en-us/vba/language-reference-vba/articles/keycode-constants

    Per quanto riguarda la funzione "incolla", penso che dovresti valutare l'opzione di realizzare un menù contestuale personalizzato. Vedi, ad esempio, i seguenti link:
    https://www.iprogrammatori.it/forum-programmazione/access/creazione-menu-accesso-rapido-t26214.html
  • Re: Intercettare evento paste in una combo box

    La routine inserita nell'evento change agisce sul filtro che viene applicato DOPO la Query che compone il recordset dei dati iniziali visualizzati nella griglia.

    Il codice che vi riporto funziona se viene digitato il singolo carattere da tastiera ma non se incollo. Esso permette il filtraggio durante la digitazione, intercetta il change della casella di ricerca TxtFind, memorizza il valore e la posizione del cursore per poterlo riposizionare dopo il filtraggio anche nel caso il risultato sia zero record, ma in quella situazione si ferma prima di visualizzare la griglia vuota permettendo di correggere senza dover "mangiare" a ritroso i caratteri.

    Pur arrivando alla riga "If TxtFind.Value <> "" Then" con un valore, il FilterOn non applicava perché nel caso del paste intercetta il .value come nullo, pertanto il mio errore era semplicemente che puntavo al .value invece che al .text

    Credo di aver risolto, pensavo di raggirare il problema intercettando l'evento paste per poter impostare la procedura del barcode (che in realtà è pure un paste) aggiungendogli però l'invio che nella sparata è automatico, grazie comunque per le indicazioni che mi serviranno per altro, intanto magari a a chi legge può servire come spunto il codice.

    Private Sub TxtFind_Change() 'Change:Manual/BarCode
    'Cerca e riposiziona testo e cursore
    If SwcBarcode = False Then
    'Se bottone impostato per input manuale
    On Error Resume Next
    Dim MEMFindText As String
    Dim MEMCursorPos As Integer
    TxtFind.SetFocus
    MEMFindText = Replace(TxtFind.Text, "'", "-")
    MEMCursorPos = Len(MEMFindText)

    'Applico il filtro sui campi correlati alla casella di ricerca
    If TxtFind.Value <> "" Then 'ERRORE deve essere .text
    Me.Filter = "Rsr1CodInt LIKE '*" & TxtFind.Text & "*' OR Rsr1CodProd LIKE '*" & TxtFind.Text & "*' OR Rsr1Descr LIKE '*" & TxtFind.Text & "*'"
    Else
    Me.Filter = ""
    End If
    Me.FilterOn = True

    'Azioni in base ai record rimanenti nel filtraggio
    If Me.Recordset.RecordCount > 0 Then
    TxtFind.SetFocus
    TxtFind.Value = MEMFindText
    TxtFind.SelStart = MEMCursorPos + 1
    Else
    MsgBox "Non ci sono dati corrispondenti al testo digitato!", vbInformation, "No match"
    TxtFind.Value = Left(MEMFindText, Len(MEMFindText) - 1)
    TxtFind.SetFocus
    TxtFind.SelStart = MEMCursorPos - 1
    End If
    End If
    End Sub

    (La variabile pubblica SwcBarcode viene impostata da una routine sul relativo bottone)
Devi accedere o registrarti per scrivere nel forum
4 risposte