Newsgroup: it.comp.lang.visual-basic
Titolo: Provocare un evento

Ciao a tutti
ho una dbgrid in cui nel momento di premere il tasto destro del mouse
compare un menu popup ( che interagisce con la selezione effettuata sulla
dbgrid cliccando con il sx).
fino a qui ok
Succede però questo:
clicco con il sx su un record e mi viene selezionato (ok direte voi).
muovo il mouse su un altro record e clicco con il dx.
il popup si apre ma il record selezionato è sempre quello cliccato dal tasto
sx.
ho provato così:
Private Sub DBGriglia_MouseUp(Button As Integer, Shift As Integer, X As
Single, Y As Single)
    If Me.DataQuery.Recordset.RecordCount > 0 And Button = 2 Then
        call DBGriglia_Click
        'giustamente così vb esegue la routin ma non provoca l'evento che
permette alla dbgrid di selezionare un altro record
        PopupMenu FrmPopup.MNUArticolo, , , , FrmPopup.MNUArticoloVisualizza
    End If
End Sub
ho pensato che ci deve essere un api che provoca gli eventi del mouse e ho
trovato "mouse_event".
Public Const MOUSEEVENTF_LEFTDOWN = &H2 '  pulsante sinistro premuto
Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx
As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As
Long)
fa al caso mio?
La uso cosi:
Private Sub DBGriglia_MouseUp(Button As Integer, Shift As Integer, X As
Single, Y As Single)
    If Me.DataQuery.Recordset.RecordCount > 0 And Button = 2 Then
        mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0
        PopupMenu FrmPopup.MNUArticolo, , , , FrmPopup.MNUArticoloVisualizza
    End If
End Sub
non funziona, sono io che non ho capito come funziona o è l'api che non
serve a quello che voglio io?
Grazie
Ciao
~~~~~~~~~~~~~~~~
Andrea Fabbrucci
anfa...@tin.it
Fax: 0761 0131187
~~~~~~~~~~~~~~~~

 ~~~~~~~~~~~~~~~~
Ciao
Interpreto la tua esigenza, vorresti selezionare il record col tasto sx
e selezionare + popup menu col tasto dx vero?
Io userei (idea non l'ho provato)
Private Sub DBGrigli_MouseDown(Button As Integer, Shift As Integer, X As
Single, Y As Single)
    If Button And vbRightButton Then
        ....
        Codice per selezione riga
        ....
        PopupMenu <nome menu>
    End If
    If Button And vbLeftButton Then
        ....
        Codice per selezione riga
        ....
    End If
End Sub
Non sň se risolve il tuo problema ma puň essere un'idea
JKLJKL

 JKLJKL
grazie cmq.

 visualizzerebbe il menu popup.
 Scusa ma laselezione del record non puoi farla da codice come ti ho
proposto
(Row,Col,Focus ecc.) dopo la pressione del tasto DX e quindi far comparire
il PopUp ??
JKLJKL

 il PopUp ??
L'unico modo per selezionare un record da codice è scorrere fino al record
che voglio... giusto?
il problema è che io non so quale record voglio perché non so dov'è
posizionato il mouse!!!!
Allora io ho:
Private Sub DBGriglia_DblClick()
    If Me.DataQuery.Recordset.RecordCount > 0 Then
        IDArticolo.ID = Me.DataQuery.Recordset.Fields("IDArticolo")
        IDArticolo.Composto = Me.DataQuery.Recordset.Fields("ArticoloC")
        If Not IsNull(Me.DataQuery.Recordset.Fields("IVA")) Then
IDArticolo.IVA = Me.DataQuery.Recordset.Fields("IVA")
        Call MNUArticoloVisualizza_Click
    End If
End Sub
Private Sub DBGriglia_MouseUp(Button As Integer, Shift As Integer, X As
Single, Y As Single)
    If Me.DataQuery.Recordset.RecordCount > 0 And Button = 2 Then
        ----------------provocare evento click
        PopupMenu FrmPopup.MNUArticolo, , , , FrmPopup.MNUArticoloVisualizza
    End If
End Sub
NOTA
    nel menu popup compare oltre alla voce "visualizza articolo" anche
"modifica articolo"
    La mia dbgrid è impostata come evidenziazione a riga cioè se clicco su
un record lei mi evidenzia tutta la riga in nero.
quando faccio doppio click il record si seleziona (diventa nero sulla
dbgrid) e poi si avvia la procedura di visualizzazione articolo.
quando clicco con il destro si apre il menu popup.
metti caso io voglia visualizzare l'articolo A... semplice, faccio doppio
click sull'elenco ed il gioco è fatto.
dopo aver visualizzato l'articolo A voglio MODIFICARE l'articolo B cioè
voglio aprire il popup e selezionare la voce Modifica Articolo.
muovo il mouse sopra l'articolo B, faccio click con il destro e... oppala,
compare si il menu con le due voci ma l'articolo selezionato (cioè quello
che la dbgrid visualizza come selezionato in nero e quello in cui nel data è
il record corrente) è sempre quello l'articolo A che avevo selezionato in
precedenza.
Così se io in questo momento seleziono cmq il menu modifica viene modificato
l'articolo A e non il B!!!
praticamente a me serve fare da codice un click al mouse in modo che nella
dbgrid si selezioni il record sotto al punto in cui c'è il mouse, a quel
punto verrebbe seguito il codice per il menu.
spero di essere stato chiaro ora
Grazie

 posizionato il mouse!!!!
Secondo me non leggi le risposte.
JKLJKL aveva capito bene fin dall'inizio, e tu gli hai detto "mi sono
spiegato male".
Poi dici di non sapere "dov'è posizionato il mouse", ma nel suggerimento
postato sempre da JKLJKL non hai notato che ci sono due variabili che si
chiamano X e Y?
Alberto

 chiamano X e Y?
Scusa ma continuo a non capire..............
che ci faccio con la posizione se non posso simulare un click sulla dbgrid?
per selezionare un articolo io faccio così:
Controllo Data con recordset tabella articoli (Campo chiave=IDArticolo)
DBGrid collegata a Data.
quindi DBGrid visualizza tabella articoli
clicco con il SX su dbgrid
dbgrid seleziona il record e fa spostare il record corrente al controllo
Data
NB: tutto questo senza una riga di codice scritto!!!!
Quando clicco su una qualsiasi funzione (visualizza, modifica, etc...) la
funzione stessa cattura l'IDArticolo del record corrente sul controllo data
e lo mette su una variabile pubblica
IDArticolo = data.field("IDarticolo")
e da qui posso fare quello che voglio perché so quale articolo l'utente a
voluto.
se io invece clicco con il destro su un controllo DBGrid il record non viene
automaticamente selezionato ( e quindi il controllo Data non si sposta sul
record voluto dall'utente)!!! è questo il mio problema!!!
nell'evento click della mia DBGrid non c'è scritto nessun codice da
eseguire!!!
Ciao

Non ci crederete ma finalmente ho risolto
Private Sub DBGriglia_MouseDown(Button As Integer, Shift As Integer, X As
Single, Y As Single)
    'Quando clicco con il dx su una dbgrid
    If Button = 2 Then 'intercetto il tasto destro
        mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 'simulo un click con il
tasto sx del mouse sulla posizione corrente.
        mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
    End If
    'a questo punto del programma ho cliccato col il sx e quindi ho
seleionato il record dove c'è il mouse,
    'di conseguenza il controllo data si è posizionato  nel record dove è il
mouse
End Sub
Private Sub DBGriglia_MouseUp(Button As Integer, Shift As Integer, X As
Single, Y As Single)
    'quando rilascio il dx del mouse apro il menu popup
    If Me.DataQuery.Recordset.RecordCount > 0 And Button = 2 Then
        PopupMenu FrmPopup.MNUArticolo, , , , FrmPopup.MNUArticoloVisualizza
    End If
    'a questo punto qualsiasi cosa io faccia il record corrente nel
controllo data è quello giusto!!!
End Sub
E VAI!!!
grazie di avermo sopportato!!!


 eseguire!!!
Se vuoi fare tutto in maniera bound (nonostante nel NG sia già stato
sconsigliato in abbondanza), è evidente che non è possibile realizzare
tutto, ma solo le cosine previste. D'altro canto, è talmente comodo che ti
capisco.
Per le funzionalità un filo oltre, del codice ne va scritto, eccome.
Ciao
Alberto

 Non ci crederete ma finalmente ho risolto
Complimenti.
Una bella soluzione.
La terrò presente per il futuro.
Alberto
PS: senza Api non era proprio possibile?

 End Sub
mi dispiace disilluderti, hai ottenuto lo spostamento sulla griglia, ma sei
ancora posizionato sul record precedentemente selezionato.
Partendo da quanto tu hai fatto lo puoi ottenere con l'ausilio di una
boolean:
Private Attiva As Boolean
Private Sub DBGriglia_MouseDown(Button As Integer, Shift As Integer, X As
Single, Y As Single)
    If Button = 2 Then 'intercetto il tasto destro
        mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 'simulo un click con il
tasto sx del mouse sulla posizione corrente.
        mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
        Attiva = True
    End If
End Sub
Private Sub DBGriglia_RowColChange(LastRow As Variant, ByVal LastCol As
Integer)
    If Attiva = True Then
        Attiva = False
        MsgBox "sono in " & Data1.Recordset.Fields(0).Value
    End If
End Sub
beppe

 boolean:
    NO NO a me funziona benissimo...
dopo aver prodotto il click forzatamente la dbgrid si sposta e con essa
anche il record corrente sul data
Andrea

 Per le funzionalità un filo oltre, del codice ne va scritto, eccome.
    sicuramente ma se ci sono gia delle api perché non sfruttarle?
    scusa la mia ignoranza che significa fare "in maniera bound" e perché me
lo sconsigli?
    Perché sei nemico delle api?
Ciao

Ragazzi scrivo ancora xché ho risolto un'altro problema che avevo sempre
attinente a questo e che voglio condividere con voi.
Il problema era questo:
Nel momento in cui avevo cliccato con il destro sulla dbgrid e il mio record
(A) si era selezionato ed era comparso il menu popup, se avevo cambiato idea
(volevo cioè il menu popup su un altro articolo B) istintamente mi veniva di
cliccare direttamente con il destro sull'articolo B.
Questo però non funziona xché è già aperto il menu popup che si aspetta SOLO
un click dal tasto SX.
A questo punto potevo:
1) Scegliere una voce dal menu con il tasto SX ed l'articolo A selezionato
(ma questo non voglio farlo perché io voglio l'articolo B)
2) Cliccare con il tasto SX sull'articolo B (questo produce la chiusura del
menu popup) e cliccare sempre sull'Articolo B con il destro per far apparire
il menu popup (soluzione unica ma scomodissima e non intuitiva per l'utente)
Allora ho pensato di inserire anche nell'evento Form_MouseDown (della form
che ospita tutti i miei menu popup) la forzatura al click SX così:
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single,
Y As Single)
    If Button = 2 Then
       mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
       mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
    End If
End Sub
Ora funziona benissimo perché nella form dei menu popup quando si clicca con
il DX è cone se si cliccasse anche con il SX
Spero che vi sia di aiuto.
Ciao