Newsgroup: it.comp.lang.visual-basic
Titolo: A volte ritornano...aiuto listview :))

Salve,
un piccolo aiutino con una listview. Una cosa da poco :))
Ho una form con una listview dentro divisa in tre colonne. Stò
provando ad inserire qualcosa dentro le colonne. Se io alla pressione
di un pulsante volessi che li dentro ci andasse a finire qualcosa (un
testo qualunque, giusto per vedere come funziona) come è che si fa??
Ho preovato a vedere sulla guida ma non ho trovato molto. Sono rimasto
alla proprietà listview.listindex.add (ammesso che sia giusta).
Aspetto news, grazie.
Saluti, ciao ciao.

 ha scritto nel messaggio
news:3a1175a0...@news.libero.it...

e infatti la strada è quella giusta;
la listview è analoga alla listbox, soltanto che invece di trattare semplici
stringhe la listview trata dei vori e propri oggetti; ogni item inserito in
una listview è rappresentato da un oggetto, per mezzo del quale poter
specificare il testo, il font, il colore, l'eventuale icona ecc.
in altre parole prova qualcosa del genere
Option Explicit
Private Sub Form_Load()
    Dim lvItem As ListItem
    ' imposta la modalità di visualizzazione "dettaglio"
    ' (si può fare anche in fase di design)
    ListView1.View = lvwReport
    ' imposta la ImageList associata
    ' (si può fare anche in fase di design)
    Set ListView1.SmallIcons = ImageList1
    ' ora crea alcune colonne
    ' (si può fare anche in fase di design)
    ListView1.ColumnHeaders.Clear
    ListView1.ColumnHeaders.Add , , "Cliente", 3000
    ListView1.ColumnHeaders.Add , , "Acconto", 1500, lvwColumnRight
    ListView1.ColumnHeaders.Add , , "Scadenza", 2000
    ' per finire inserisce alcuni elementi
    ListView1.ListItems.Clear
    Set lvItem = ListView1.ListItems.Add()
    lvItem.Text = "Mario Rossi"
    lvItem.Bold = True
    lvItem.ForeColor = RGB(255, 0, 0)
    lvItem.SubItems(1) = "1.200.000"
    lvItem.SubItems(2) = "01/12/2001"
    ' si faccia riferimento al controllo
    ' ImageList associato come SmallIcons
    lvItem.SmallIcon = 1
    Set lvItem = ListView1.ListItems.Add()
    lvItem.Text = "Giuseppe Verdi"
    lvItem.Bold = False
    lvItem.ForeColor = RGB(0, 0, 0)
    lvItem.SubItems(1) = "500.000"
    lvItem.SubItems(2) = "17/02/2021"
    lvItem.SmallIcon = 3
    Set lvItem = ListView1.ListItems.Add()
    lvItem.Text = "Gianni Agnelli"
    lvItem.Bold = False
    lvItem.ForeColor = RGB(0, 0, 255)
    lvItem.SubItems(1) = "-"
    lvItem.SubItems(2) = "01/01/2020"
    lvItem.SmallIcon = 6
End Sub
tieni presente che alcuni valori possono essere impostati direttamente a
livello di metodo Add();
nell'esempio qui sopra mi sono tenuto volutamente "lungo" sperando di essere
più chiaro possibile;
ciao

    Set lvItem = ListView1.ListItems.Add()
In fine, l' istruzione Set a cosa serve? Sempre sulla guida ho letto
che dice; questa volta non è stata chiarissima :)) E' una sorta di
comando alias? Humm, mica tanto, la guida dice "...assegna un
riferimto a un oggetto..." mi spieghi meglio per favore?



non è facile, ma proverò ad essere più chiaro e sintetico possibile;
in VB esistono sostanzialmente 2 tipi di avriabili: le variabili "semplici"
e gli oggetti;
tali variabili, sia quelle "semplici" che gli oggetti, possono essere anche
organizzate in vettori e matrici... ma questa è un'altra storia...
la differenza sostanziale tra questi due tipi di variabili è il modo in cui
si possono utilizzare; una variabile "semplice" è sostanzialmente "stupida",
cioè subisce tutte le operazioni che un programmatore decide di effettuare e
di suo non sa far niente;
una variabile oggetto ha invece una sorta di intelligenza nascosta al suo
interno; es. se prendo un oggetto Form1 di tipo Form, e gli "dico" Show
(chiamo cioè il metodo Show dell'oggetto) scateno una serie di operazioni
più o meno complesse che determina (guarda caso...) la visualizzazione di un
form sullo schermo;
le variabili oggetto nascondono quindi al loro interno un bel malloppo di
roba (se mi passi il termine); al contrario una variabile intera nasconde al
suo interno... soltanto due miseri byte di dato; maneggiare una variabile
intera è quindi un'operazione banale, mentre maneggiare un oggetto può
essere un'operazione decisamente scomoda per la CPU (chissà quanti dati e
quanti altri oggetti sono contenuti all'interno di un form...);
quindi VB tratta questo tipo di variabili ad oggetto (intelligenti ma
potenzialmente molto ingombranti) in maniera diversa dalle variabili di tipo
semplice; piuttosto che prenderle e copiarle in giro per la memoria come
farebbe con un intero o una stringa, per accedere ad esse utilizza dei
riferimenti (in C si parlerebbe di puntatori.... ma anche questa è un'altra
storia)
una variabile oggetto non rappresenta l'oggetto stesso, ma un riferimento ad
un qualcosa caricato chissaà dove in memoria; per assegnare tale riferimento
non basta il semplice "=" ma devo utilizzare la parola chiave "Set"
proviamo a fare un esempio, se scrivo
    Dim a As Integer, b As Integer
    a = 1
    b = a
    a = 2
    Debug.Print a, b
ottengo come output
    2    1
perchè a e b (due variabili integer) sono due entità distinte;
se invece scrivo
    Dim frm1 As Form, frm2 As Form
    Set frm1 = Form1
    Set frm2 = Form1
    frm1.Caption = "1"
    frm2.Caption = "2"
otterrò che la Form1, alla fine dell'operazione, contenga "2" come caption;
frm1 e frm2 sono due riferimenti ad un oggetto; appendo dopo l'istruzione
"Dim" esse non contengono niente di valido, infatti se provi a fare
    Dim frm1 As From
    frm1.Caption = "Ciao"
ottieni un errore di "object not set", cioè la variabile oggetto frm1 non fa
riferimento (non è stato fatto cioè alcun "Set") a nessun oggetto;
fin quì è tutto chiaro?
tornando alla ListView, quando scrivi
    Set lvItem = ListView1.ListItems.Add()
esegui prima di tutto il metodo Add() della collection ListItems esposta da
ListView1 (rileggere almeno due volte prima di proseguire....);
guardando l'help in linea risulta che il metodo Add "...adds a ListItem
object to a ListItems collection in a ListView control and returns a
reference to the newly created object..." cioè si preoccupa di creare un
nuovo oggetto ListItem,  lo inserisce nella collection ListItems (occhio
alla s finale ...) e ritorna il riferimento al nuovo oggetto creato;
tale riferimento, per comodità, viene quindi memorizzato tramite un Set
nella variabile oggetto lvItem; quindi da li in avanti posso utilizzare
lvItem per accedere a tutte le proprietà e ai metodi del nuovo oggetto
creato;
tanto per crearti un dubbio in più, le due sequenze di istruzioni
    Set lvItem = ListView1.ListItems.Add()
    lvItem.Bold = True
e
    ListView1.ListItems.Add().Bold = True
fanno esattamente la stessa cosa... riesci a cipire il perchè?
ok, è tardi e nonostante volessi essere breve ho finito per srotolarti una
risposta kilometrica... spero solo di esserti servito a qualcosa;
ciao

Ciao, grazie della spiegazione! Tzč, ridi ridi :)) Veniamo alle cose
serie vŕ :) Ho capito come aggiungere qualcosa in una listview, e se
io volessi aggiungere la risposta di una quey? Ho postato anche un
altro messaggio, ma visto che anche qui si parlava di qualcosa di
interente, vado avanti su due fronti :)) Io ho questa cosa qua:
       If .BOF Or .EOF Then
            txtSql.Text = "Nessun Mp3 trovato!"
        Else
            Do While Not .EOF
            For Each fd In .Fields
                With fd
 
                Set lvItem = LswLista.ListItems.Add()
                lvItem.Text = fd.Value
                'lvItem.SubItems(1) = fd.Value
                'lvItem.SubItems(2) = fd.Value
                'lvItem.SubItems(3) = fd.Value
                'lvItem.SubItems(4) = fd.Value
                'lvItem.SubItems(5) = fd.Value
faccio prima una query, e vorrei la ripsota di questa all' interno
della listview. Questo č quello che ho scritto io, ma in questo modo
ho tutta la risposta (giusta) sotto un' unica colonna. Per mandare
sotto i vari "subitems" il valore giusto, come faccio? Ora accade
questo:
Titolo		Autore	Album	Genere	Anno	Cd
Feels So Good
Sonique
---
Dance
2000
Mp3 CD #6
Io invece vorrei che "Sonique" andasse sotto "Autore" e cosě via. Che
ti viene in mente? :))



[cut]
Beh!, In pochi post sui vari ng che seguo ho letto una risposta cosģ
esauriente e chiara.
Non posso che complimentarmi per la completezza e la chiarezza
d'esposizione.
... veramente, non sto scherzando!
giorgio b.


è decisamente banale ("ma che devo fa' tutto io?" come avrebbe detto il
messia di Quelo....);
....
    Dim nColumn As Integer
....
    Set lvItem = LswLista.ListItems.Add()
    nColumn = 0
    For Each fd In .Fields
        If (nColumn > 0) Then
            lvItem.Subitems(nColumn) = fd.Value
        Else
            lvItem.Text = fd.Value
        End If
        nColumn = nColumn + 1
    Next
....
assicurati di avere definito abbastanza "colonne" per la ListView
ciao


ti ringrazio;
ciao

Hei Pal, una domanda....guarda questo codice:
Private Sub CmdLDb_Click()
    Dim strLista As String
    Dim strCount As String
 
    Dim lvItem As ListItem
    Dim nColumn As Integer
    Dim cont As Integer
    Dim fd As Field
 
    Dim count As Integer
 
    strLista = "Select * from mp3;"
 
    strCount = "Select count (titolo) from mp3;"
 
    LswLista.ListItems.Clear
 
    Set dbDatabase = DBEngine.OpenDatabase(TxtNomeDb.Text)
    With dbDatabase
 
        Set dbTable = dbDatabase.OpenRecordset(strLista,
dbOpenDynaset)
        With dbTable
 
        Do While Not .EOF
 
    'INIZIO MODIFICA 15/10/2000 16.56
                Set lvItem = LswLista.ListItems.Add()
                nColumn = 0
                For Each fd In .Fields
                    If (nColumn > 0) Then
                        lvItem.SubItems(nColumn) = fd.Value
                    Else
                        lvItem.Text = fd.Value
                    End If
                nColumn = nColumn + 1
 
                Next
    'FINE MODIFICA
 
            cont = cont + 1
 
            .MoveNext
            Loop
 
        .Close
        End With: Set dbTable = Nothing
        .Close
    End With: Set dbDatabase = Nothing
 
    Set dbDatabase = DBEngine.OpenDatabase(TxtNomeDb.Text)
    Set dbTable = dbDatabase.OpenRecordset(strCount, dbOpenDynaset)
 
    For Each fd In dbTable.Fields
        count = fd.Value
    Next
 
    txtSql.Text = cont & " mp3 su " & count & " presenti in archivio"
End Sub
Private Sub CmdNuovo_Click()
    Load frmCreaDb
    frmCreaDb.Show
End Sub
ma possibile che se strlista è uguale a "select * mp3" si inchioda,
mentre se gli dico "select * mp3 where cd = 'mp3 cd #5' " mi va bene?
Le due query danno lo stesso risultato!!!

 Le due query danno lo stesso risultato!!!
detta cosi', la seconda query dovrebbe darti un solo record, quello che
corrisponde alla condizione. suppongo sia solo uno. quante schede hai nella
tabella mp3 ?
ciao, a.

 ma possibile che se strlista è uguale a "select * mp3" si inchioda,
select * FROM mp3
Ciao
Aldo


 select * FROM mp3
ci avevo badato anch'io, ma dato che nel codice e' corretto ho pensato a una
svista nel post.

>select * FROM mp3
Si si, nel codice l' ho scritto bene, solo qui mi sono sbagliato...

tabella mp3 ?
si ma se io gli dico cercami tutti quelli che hanno cd = mp3 cd #5, e
nel database tutti i record hanno quel valore uguale, lui mi
restituisce tuttii record, per questole due query danno lo stesso
risultato. Non capisco però perchè funziona solo in caso.

 nel database tutti i record hanno quel valore uguale
se ti chiedo "quante?" tu non rispondermi "si'"...
se e' cosi', hai impostato male il db.
di "mp3 cd#5" dovrebbe essercene uno solo, fra il cd#4 e il cd#6.
in access, ordina la tabella su quel campo e controlla un po'.
se invece ti sembra corretto cosi', sono io a non capire la logica del tuo
db.
aspetto news grazie saluti ciao ciao
(gioco d'anticipo :)
a.