Newsgroup: it.comp.lang.visual-basic
Titolo: Elementi selezionati in listview

Salve a tutti!
    Vorrei sottoporvi un quesito: se ho una listview con qualche migliaio di
elementi ed ho effettuato una selezione multipla, qual'č secondo voi il modo
piů rapido per sapere quali sono ?
Grazie a tutti per l'attenzione!

     Vorrei sottoporvi un quesito: se ho una listview con
qualche migliaio di elementi ed ho effettuato una selezione
multipla, qual'č secondo voi il modo piů rapido per sapere
quali sono ?
Attento che il codice seguente non funziona come dovrebbe. Te
lo sottopongo unicamente come esempio di strada percorribile
se non ne trovi di migliori. Ovviamente, se lo trovi utile e
risolvi i problemi che ha fammi avere il codice corretto.
Grazie. Mi interessano anche le soluzioni alternative
migliori.
' Form1
' Label1
' TreeView1
'
Option Explicit
Private m_objWin    As CWin
Private m_blnShift  As Boolean
Private Sub Form_Load( _
)
  Set m_objWin = New CWin
  With Label1
    Let .Caption = ""
    Let .AutoSize = True
  End With
  With ListView1
    Let .View = MSComctlLib.lvwReport
    Let .MultiSelect = True
    Call .ColumnHeaders.Add(Text:="Campo1")
    With .ListItems
      Call .Add(Text:="Uno")
      Call .Add(Text:="Due")
      Call .Add(Text:="Tre")
      Call .Add(Text:="Quattro")
    End With
  End With
End Sub
Private Sub Form_Unload( _
  Cancel As Integer _
)
  Set m_objWin = Nothing
End Sub
Private Sub ListView1_Click( _
)
Const c_lngLen  As Long = 4
Dim lngPos      As Long
Dim lngCur      As Long
Dim lngFirst    As Long
Dim lngIndex    As Long
Dim strTemp     As String
  Let lngPos = 1
  With Label1
    Do While 1 <= lngPos And lngPos <= Len(.Caption)
      If ListView1.ListItems _
      .Item(Val(Mid$(.Caption, lngPos, c_lngLen))) _
      .Selected Then
        Let lngPos = lngPos + c_lngLen
      Else
        Let .Caption = Mid$(.Caption, lngPos + c_lngLen)
      End If
    Loop
  End With
  Let lngCur = ListView1.SelectedItem.Index
  If m_blnShift Then
    Let lngFirst = Right$(Label1.Caption, c_lngLen)
    For lngIndex = lngFirst To lngCur _
    Step 1 * (lngFirst > lngCur) - 1 * (lngFirst <= lngCur)
      Let strTemp _
        = strTemp _
        & Format$( _
            ListView1.ListItems.Item(lngIndex).Index _
          , "0000")
    Next
    Let Label1.Caption = strTemp
  Else
    Let strTemp = Format$(lngCur, "0000")
    With Label1
      If ListView1.SelectedItem.Selected Then
        If InStr(.Caption, strTemp) = 0 _
          Then Let .Caption = .Caption & strTemp
      Else
        Let .Caption _
          = m_objWin.vb4Replace( _
            Expression:=.Caption, Find:=strTemp)
      End If
    End With
  End If
End Sub
Private Sub ListView1_KeyDown( _
  KeyCode As Integer _
, Shift As Integer _
)
  Let m_blnShift = KeyCode = vbKeyShift
End Sub
Private Sub ListView1_KeyUp( _
  KeyCode As Integer _
, Shift As Integer _
)
  Let m_blnShift = False
End Sub
--
Ciao.
Maurizio

 >     Vorrei sottoporvi un quesito: se ho una listview con
qualche migliaio di elementi ed ho effettuato una selezione
multipla, qual'č secondo voi il modo piů rapido per sapere
quali sono ?
[...] Oppure, invece di andar dietro alle (parziali) vaccate
da me dette nel post precedente:
    Private Const LVM_FIRST = &H1000
    Private Const LVM_GETNEXTITEM = (LVM_FIRST + 12)
    Private Const LVNI_SELECTED = &H2
    Private 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 Sub Command1_Click( _
    )
    Dim lngIndex  As Long
        Call DoEvents
        Let Screen.MousePointer = vbHourglass
        Let Command1.Enabled = False
        Call List1.Clear
        Let lngIndex _
        = SendMessage( _
            ListView1.hWnd _
        , LVM_GETNEXTITEM _
        , -1 _
        , ByVal LVNI_SELECTED)
        While lngIndex > -1
            Call List1.AddItem( _
                ListView1.ListItems _
                .Item(lngIndex + 1).Text)
            Let lngIndex _
            = SendMessage( _
                ListView1.hWnd _
            , LVM_GETNEXTITEM _
            , lngIndex _
            , ByVal LVNI_SELECTED)
        Wend
        Let Command1.Enabled = True
        Call ListView1.SetFocus
        Let Screen.MousePointer = vbDefault
