Newsgroup: it.comp.lang.visual-basic
Titolo: Textbox su listview

Vediamo se riesco a farmi capire...    Vorrei fare in modo di posizionare
una textbox sulla riga selezionata di una listview della dimensione della
colonna in cui si intende modificare il valore in modo che all'utente sembri
possibile modificare i valori delle varie colonne direttamente sulla lista,
ma non so come intercettare le coordinate per posizionare la textbox.
Se sono riuscito a spiegarmi c'è qualcuno che ha qualche dritta? Grazie

 Vorrei fare in modo di posizionare una textbox sulla riga selezionata di
una listview della dimensione della colonna in cui si intende modificare il
valore in modo che all'utente sembri possibile modificare i valori delle
varie colonne direttamente sulla lista, ma non so come intercettare le
coordinate per posizionare la textbox.
Domanda: e... se invece di complicarti la vita facessi apparire una maschera
di aggiornamento dati per quel record?
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

 ma non so come intercettare le coordinate per posizionare la textbox.
Per ottenere qualcosa di valido devi fare pure il subclass del ListView, in
modo da gestire lo scrolling e quant'altro.
Ti posto il codice che va messo in un modulo .BAS.
EditControl è un oggetto pubblico che deve fare riferimento al controllo
che vuoi collocare sul ListView.
==============
Option Explicit
Private Type HD_ITEM
   mask As Long
   cxy As Long
   pszText As String
   hbm As Long
   cchTextMax As Long
   fmt As Long
   lParam As Long
   iImage As Long
   iOrder As Long
End Type
Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
Private Const WM_PAINT = &HF
Private Const GWL_WNDPROC = (-4)
Private Const LVM_FIRST As Long = &H1000
Private Const LVM_GETITEMRECT = (LVM_FIRST + 14)
Private Const LVM_GETCOUNTPERPAGE = (LVM_FIRST + 40)
Private Const LVIR_BOUNDS = 0
Private Const HDM_FIRST = &H1200
Private Const HDM_GETITEMRECT = (HDM_FIRST + 7)
Private Const LVM_GETHEADER = (LVM_FIRST + 31)
Private Const SM_CXVSCROLL = 2
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal
hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As
Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA"
(ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal
wParam As Long, ByVal lParam As Long) As Long
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As
Long) As Long
Private OldEditViewProc As Long
Private HeaderHeight As Long
Private VScrollWidth As Long
Public EditControl As Control
Public Sub SubclassEditView()
    OldEditViewProc = SetWindowLong(frmMain.ListView2.hwnd, GWL_WNDPROC,
AddressOf Module1.EditViewProc)
End Sub
Public Function EditViewProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal
wParam As Long, ByVal lParam As Long) As Long
    Dim rc As RECT
    Dim Top As Long
    Dim Left As Long
    Dim Width As Long
    Dim VScrollBar As Boolean
    On Local Error Resume Next
    Select Case uMsg
        Case WM_PAINT
            EditViewProc = CallWindowProc(OldEditViewProc, hwnd, uMsg,
wParam, lParam)
            With frmMain
                If Not .ListView2.SelectedItem Is Nothing Then
                    If EditControl Is Nothing Then Exit Function
                    EditControl.Height = .ListView2.ListItems(1).Height - (2
* Screen.TwipsPerPixelY)
                    GetListViewFocusedItemRect .ListView2.hwnd, rc
                    Top = (rc.Top + 4) * Screen.TwipsPerPixelY
                    If Top > (.ListView2.Height - (HeaderHeight) *
Screen.TwipsPerPixelY) Then rc.Top = 0
                    If GetListviewVisibleCount(hwnd) <
.ListView2.ListItems.Count Then VScrollBar = True
                    Left = ((rc.Left + 4) * Screen.TwipsPerPixelX) +
.ListView2.ColumnHeaders(1).Width
                    Width = ((.ListView2.Width - Left) \
Screen.TwipsPerPixelX) - 4
                    If VScrollBar = True Then Width = Width - VScrollWidth
                    If Width > 9 Then
                        Width = Width * Screen.TwipsPerPixelX
                        If Width > (.ListView2.ColumnHeaders(2).Width -
Screen.TwipsPerPixelX) Then
                            EditControl.Width =
.ListView2.ColumnHeaders(2).Width - Screen.TwipsPerPixelX
                        Else
                            EditControl.Width = Width +
Screen.TwipsPerPixelX
                        End If
                    Else
                        rc.Top = 0
                    End If
                    If rc.Top < HeaderHeight Then
                        EditControl.Visible = False
                    Else
                        EditControl.Left = Left
                        EditControl.Top = Top
                        EditControl.Visible = True
                    End If
                End If
            End With
        Case Else
            EditViewProc = CallWindowProc(OldEditViewProc, hwnd, uMsg,
wParam, lParam)
    End Select
End Function
Public Sub GetListViewFocusedItemRect(hwnd As Long, rc As RECT)
    Dim i As Long
    Dim rc2 As RECT
    Dim HeaderHwnd As Long
    i = frmMain.ListView2.SelectedItem.Index
    rc.Left = LVIR_BOUNDS
    SendMessage hwnd, LVM_GETITEMRECT, i - 1, rc
    HeaderHwnd = SendMessage(hwnd, LVM_GETHEADER, &H0, &H0)
    SendMessage HeaderHwnd, HDM_GETITEMRECT, 0, rc2
    HeaderHeight = rc2.Bottom - rc2.Top
    VScrollWidth = GetSystemMetrics(SM_CXVSCROLL)
End Sub
Private Function GetListviewVisibleCount(ByVal hwnd As Long) As Long
    GetListviewVisibleCount = SendMessage(hwnd, LVM_GETCOUNTPERPAGE, 0&,
ByVal 0&)
End Function
==============
Spero possa esserti d'aiuto.
Byee,
Zeross

 Grazie mille per l'aiuto, adesso mi scollego e lo provo!
Se funziona, inviate un esempio anche al Sito Comune
--
 /\/\/\/\/\/\/\/\/\/
| Una iniziativa a livello di questo NG:
| Partecipa alla stesura di progetti VB sviluppati in team, informati sul
Sito Comune
| sezione Leonardo.  Io partecipo al progetto Data Raptor, alleati con noi.
 \/\/\/\/\/\/\/\/\/\
Ciao
Ettore Maronese, il Mes
http://www.maronese.com/mes
Sito Comune di questo NG
http://www.murialdo.it/it_lang_vb