Newsgroup: it.comp.lang.visual-basic
Titolo: [?]Coordinate di una colonna in Dbgrid

Non riesco a trovare le coordinate di una colonna in dbgrid.
Queste mi servono per inserire il famoso combo-box in dbgrid.
Ho provato ad utilizzare le coordinate del mouse ma il risultato è
impreciso e complicato.
Grazie in anticipo
Edoardo
gd...@tin.it

Prova così:
Private Sub DBGrid1_RowColChange(LastRow As Variant, ByVal LastCol As
Integer)
    Dim x As Long, y As Long
    Dim c   As Integer
    c = DBGrid1.Col
    x = DBGrid1.Left
    y = DBGrid1.Top
    Combo1.Width = DBGrid1.Columns(c).Width
    Combo1.Left = x + DBGrid1.Columns(c).Left
    Combo1.Top = y + DBGrid1.RowTop(DBGrid1.Row)
End Sub
Ciao Francesco C.

 Prova cosě:

Vero, ma a me quando "scrollo" la combo non si sposta.
Un modo che risolve quasi tutti i problemi e' questo:
1) Aggiungi un Timer, chiamalo "TimerEdit" e imposta la proprieta' Interval=1 e Enabled=False
2) Usa il codice qui sotto
Private Sub TimerEdit_Timer()
    Dim x As Long, y As Long
    Dim c   As Integer
 
    TimerEdit.Enabled = False
 
    If DBGrid1.CurrentCellVisible Then
        c = DBGrid1.Col
        x = DBGrid1.Left
        y = DBGrid1.Top
        Combo1.Width = DBGrid1.Columns(c).Width
        Combo1.Left = x + DBGrid1.Columns(c).Left
        Combo1.Top = y + DBGrid1.RowTop(DBGrid1.Row)
        Combo1.Visible = True
    Else
        Combo1.Visible = False
    End If
End Sub
Private Sub DBGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
    Call TimerEdit_Timer
End Sub
Private Sub DBGrid1_Scroll(Cancel As Integer)
    TimerEdit.Enabled = True
End Sub
Se avete soluzioni migliori ditelo, altrimento metto questo codice sul Sito comune.
-- 
Hi, Ciao
Ettore                 By -MES-
http://freeweb.aspide.it/freeweb/ilmes
Il sito comune di programmatori VB
http://members.xoom.com/it_lang_vb

1) Aggiungi un Timer ........
Non mi piace aggiungere timers.Non è possibile semplicemente usando
l'evento:
dbgrid_Scroll ?
Ciao
Francesco C.

 dbgrid_Scroll ?
Nemmeno a me!
Quella e' una tipica soluzione da "ultima spiaggia".
Appunto ho chiesto se c'e' gente che ha trovato soluzioni piu' intelligienti.
Non sono riuscito ad usare il metodo dbgrid_Scroll direttamente perche' viene scatenato prima che venga realizzato lo scroll,
e quindi non sono ricavabili la nuova posizione della casella.
Se qualcuno ha idee....


Accidenti manca sempre quel qualcosina che .... (sembra fatto apposta)
Nella versione standard (non quella fornita con vb) esiste il metodo PostMsg
che scatena l'evento PostEvent.
Quindi dovrebbe essere possibile gestire il problema in questo modo:
nell'evento scroll utilizzare PostMsg, la griglia si aggiorna (forse c'è
bisogno di un doevents) e poi nell'evento PostEvent dovrebbe essere
possibile spostare o nascondere il combo.
Ciao
Francesco C.

...

Buona idea!  Dalla quale o creato questo codice che non usa piu' il timer, e va anche meglio.
(per chi ha perso il thread, dico che con questo codice si gestisce il posizionamento di una combo su un DBGrid)
Ora lo metto sul Sito Comune in "Piccole Perle"
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam
As Long, ByVal lParam As Long) As Long
Private Const WM_KEYUP = &H101
Come procedere:
1) Aggiungere una DBGrid1 al form
2) Aggiungere una Combo1 al form
3) Aggiungere il codice qui sotto
Private Sub DBGrid1_KeyUp(KeyCode As Integer, Shift As Integer)
    Dim x As Long, y As Long
    Dim c   As Integer
 
    ' il tasto &HF4 non esiste, e' un messaggio per spostare la combo
    If KeyCode = &HF4 And Shift = 0 Then
        If DBGrid1.CurrentCellVisible Then
            c = DBGrid1.Col
            x = DBGrid1.Left
            y = DBGrid1.Top
            Combo1.Width = DBGrid1.Columns(c).Width
            Combo1.Left = x + DBGrid1.Columns(c).Left
            Combo1.Top = y + DBGrid1.RowTop(DBGrid1.Row)
            Combo1.Visible = True
        Else
            Combo1.Visible = False
        End If
    End If
End Sub
Private Sub DBGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
    ' Aggiurno la posizione della combo di edit simulando il tasto &HF4 (che non esiste)
    Call DBGrid1_KeyUp(&HF4, 0)
End Sub
Private Sub DBGrid1_Scroll(Cancel As Integer)
    ' Aggiurno la posizione della combo di edit simulando il tasto &HF4 (che non esiste)
    Call PostMessage(DBGrid1.hwnd, WM_KEYUP, &HF4&, &H40F40000)
End Sub
-- 
Hi, Ciao
Ettore                 By -MES-
http://freeweb.aspide.it/freeweb/ilmes
 
(con OCX per stampare i Recordset)


 possibile spostare o nascondere il combo.
Buona idea!  Dalla quale o creato questo codice che non usa piu' il timer, e va anche meglio.
(per chi ha perso il thread, dico che con questo codice si gestisce il posizionamento di una combo su un DBGrid)
Ora lo metto sul Sito Comune in "Piccole Perle" come "Posizionare una Combobox su un DBGrisd".
