Newsgroup: it.comp.lang.visual-basic
Titolo: Problema con Listview e ProgressBar

Ciao a tutti, per quanto ci sia diventato pazzo, non sono riuscito a capire 
se è possibile includere una "progressbar" in una "subitem" della mia 
"listview"; siamo nel form1 dove ho già piazzato sia la ListView1 che la 
ProgressBar1, ecco uno spezzato del codice incriminato:
-------------------------------------------------------------------------------------------------------------
ListView1.LabelEdit = lvwManual
ListView1.View = lvwReport
             With ListView1.ColumnHeaders
             .Add , , "File"
             .Add , , "Dimensione"
             .Add , , "Scaricato"
             .Add , , "Sorgenti"
             .Add , , "Progresso"
             End With
ListView1.ListItems.Add , , "Item 1"
ListView1.ListItems.Add , , "Item 2"
ListView1.ListItems.Add , , "Item 3"
ListView1.ListItems.Item(1).ListSubItems.Add , , "Dimensione"
ListView1.ListItems.Item(1).ListSubItems.Add , , "Scaricato"
-------------------------------------------------------------------------------------------------------------
Fino a qui tutto ok, ho preparato la listview e i relativi item e subitem ed 
è qui che nasce il problema, dalla riga seguente, che come ulteriore SUBITEM 
al primo ITEM dovrebbe aggiungere fisicamente la progressbar anzichè un 
comune testo:
----------------------------------------------------------------------------------------------------------
ListView1.ListItems.Item(1).ListSubItems.Add , , ProgressBar1 ' VB6 
sottointende ProgressBar1.Value
-----------------------------------------------------------------------------------------------------------
Così facendo, mi viene visualizzato il Value della ProgressBar1 ma non la 
sua immagine fisica come vorrei io, ma poi ho capito che questa sintassi 
evidentemente serve solo per aggiungere una ulteriore SubItem di testo alla 
Item1, e giustamente dell'oggetto ProgressBar1 viene considerata la 
proprietà 'Value' per default di VB6 suppongo.
Allora nella speranza di vedere caricata fisicamente la ProgressBar1 in 
questa SubItem ho provato anche cosi':
--------------------------------------------------------------------------------------------------------------
ListView1.ListItems.Item(1).ListSubItems.Add  ProgressBar1
--------------------------------------------------------------------------------------------------------------
VB6 con questa sintassi non ritorna alcun errore runtime ma anche così non 
viene caricata fisicamente la ProgressBar1 dentro questa SubItem. e neppure 
ne viene piu visualizzato il suo Value come prima.
Chi mi sa dire se si può ottenere questo risultato e come ?
Se servono altri chiarimenti sull'obbiettivo sono a disposizione.
Ivan

 Chi mi sa dire se si può ottenere questo risultato e come ?
Si può, ma non è quella la strada: se avessi osservato ben bene gli argomenti
del metodo Add della collection ListSubitems avresti capito subito che non
avrebbe mai potuto funzionare.
La tecnica esiste ma è un po' più "tricky", seppure abbastanza semplice. Io l'ho
realizzata con le API, ma poi ho trovato questo esempio senza API che è ancora
più semplice:
http://members.xoom.virgilio.it/vbwork/Sorgenti/ListviewProgressBar.zip
Bye
Raf

"Rafunk" <rafun...@NOTHANKSlibero.it> ha scritto nel messaggio 
news:dhtb64$8ui$1...@alix.livenet.it...




Grazie Raf, ottimo esempio io non ne avevo trovato nessuno, forse non sono
mai stato un maestro della ricerca non lo avevo trovato questo, tuttavia
essendo un pricipiante di VB6 e non essendomi cimentato mai nell'utilizzo di
funzioni grafiche, ovviamente mi ero fatto ingannare dall'aspetto di alcune
di queste progressbar, che sono disegnate così bene, che mi avevano portato
a pensare, che l'oggetto progressbar, potesse essere incluso fisicamente in
una viewlist ecco perchè ci sono impazzito così, sto già analizzando a fondo
quell'esempio che mi hai dato modo di trovare e scaricare, chissà oggi
imparo qualcosa di davvero nuovo, per quanto riguarda le API da 1 a 100 io
sono a 1, le trovo ancora troppo enigmatiche per i miei gusti anche se
capisco che con esse si potrebbero fare cose ancor piu strabilianti. :-)
Ciao, alla prossima !

 Ciao, alla prossima !
Ok, ciao!

 
Potresti invece postare a me il tuo esempio con le api o inviarmelo in 
mail a capobecchino chiocciola hotmail punto com :) vorrei vedere i 2 
metodi anche se non mi serve ad un cavolo ora .. ma sono davvero curioso  :)
Grazie
-- 
[CapoBecchino]
Il becchino si sposa: in abito rigorosamente nero, con la sposa accanto 
parte in auto (nera) con le classiche bare attaccate al paraurti posteriore.
La sera, dopo cena, lei lo aspetta semisdraiata su letto, in un negligé 
che sembra una nuvola. Lui si prepara in bagno ed esce impeccabile: 
pigiama nero con i risvolti oro, viso impassibile, passo bilanciato; si 
avvicina alla moglie e dice:
- Signora, vuol baciarlo prima di metterlo dentro? (da Barzellette.it)

 metodi anche se non mi serve ad un cavolo ora .. ma sono davvero curioso  :)
Posto qui il codice estratto dal mio programma, così magari può servire anche ad
altri.
Ometto per motivi di spazio le declare delle varie API SendMessage, GetDC etc...
Bye
Raf
-----------------------
Dim li  As ListItem
...
  Set li = lvwTransfers.ListItems(Key)
  DrawLVSubItemProgress lvwTransfers, li.Index,
li.ListSubItems.Item("Progress").Index, Percent
...
Public Sub DrawLVSubItemProgress(lvw As ListView, ByVal RowIndex As Integer, _
        ByVal SubitemIndex As Integer, ByVal Percent As Single)
Dim rc  As RECT
Dim hDC As Long
    rc.Top = SubitemIndex
    If SendMessage(lvw.hwnd, LVM_GETSUBITEMRECT, RowIndex - 1, rc) <> 0 Then
        hDC = GetDC(lvw.hwnd)
        DrawProgressRect hDC, rc, Percent
        Call ReleaseDC(lvw.hwnd, hDC)
    End If
End Sub
Private Sub DrawProgressRect(ByVal hDC As Long, rc As RECT, ByVal Percent As
Single)
Dim hPen    As Long
Dim hbr     As Long
Dim rcFill  As RECT
Const BORDER_WIDTH = 3
    hPen = CreatePen(PS_SOLID, BORDER_WIDTH, GetSysColor(vbHighlight And &HFF))
    Rectangle hDC, rc.Left + 1, rc.Top + 1, rc.Right - 1, rc.Bottom - 1
    DeleteObject hPen
    hbr = GetSysColorBrush(vbHighlight And &HFF)
    With rcFill
        .Left = rc.Left + BORDER_WIDTH
        .Top = rc.Top + BORDER_WIDTH
        .Right = .Left + ((rc.Right - rc.Left - 2 * BORDER_WIDTH) * Percent) /
100
        .Bottom = rc.Bottom - BORDER_WIDTH
    End With
    FillRect hDC, rcFill, hbr
End Sub

Rafunk ha scritto:

grazie caro .. dopo gli do un'occhiata .. :)
salutoni


 grazie caro .. dopo gli do un'occhiata .. :)
nel frattempo magari impari a sfrondare un po' quando rispondi, eh? :)
non sei un novellino qui...
raf, grazie per il codice.
ciao, a.

 non sei un novellino qui...
Pardon non volevo .. :)	
-- 
[CapoBecchino]
OFFERTONA!!! Muori oggi ed in compagnia, avrai uno sconto paghi 1 porti 
via 2 :)

 altri.
[cut]
Spettacolo! Avevo scaricato da... credo VbAccelerator del codice per
fare una cosa simile, ma si sparava delle seghe mentali paurose...
subclassing della ListView e robe simili. Il tuo esempio e' moooolto
piu' semplice ed efficace. Sarebbe carino incapsularlo in una
classettina/dll...
Bye by SixaM 8-]
P.S. Ho notato che se ridimensiono la colonna con la ProgressBar, questa
sparisce...probabilmente qui si che ci vorrebbe del subclassing per
ridisegnare le ProgressBar...
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 
Non a caso da vbaccellerator lo hanno usato .. ;)


 classettina/dll...
In effetti ero partito da quell'esempio ora che ci penso, ed effettivamente
avrebbe risolto anche il problema del resize della colonna.
Ma dato che nel mio programma (un FTP manager) la colonna ha dimensione fissa,
ho pensato di semplificarmi un po' la vita.
Quanto all'incapsulamento... boh fate vobis, a me risulta piů comodo cosě.
Ciao
Raf