Newsgroup: it.comp.lang.visual-basic
Titolo: [?] [API] Resize colonne listview con Bold

Uso questo codice per fare l'autoresize delle colonne di un listview:
For col2adjust = 0 To lv.ColumnHeaders.Count - 1
  Call SendMessage(lv.hWnd, _
     LVM_SETCOLUMNWIDTH, _
     col2adjust, _
     ByVal LVSCW_AUTOSIZE_USEHEADER)
Next
Diciamo che funziona (l'ultima colonna viene dimensionata in base ad una 
regola bislacca) se non uso caratteri in grassetto per gli item/subitem.
Se c'e' il grassetto la larghezza delle colonne e' sempre troppo piccola 
ed gli item in grassetto sono troncati.
C'e' qualche soluzione?
grazie
	maxx
P.S. Vedo che anche in .NET il problema persiste ... :-(
http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&threadm=a78e3151.0310122353.6a6d92d7%40posting.google.com&rnum=1&prev=/groups%3Fq%3Dlistview%2Bautosize%2Bbold%26ie%3DUTF-8%26oe%3DUTF-8%26hl%3Den%26btnG%3DGoogle%2BSearch
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!

 C'e' qualche soluzione?
http://www.google.it/groups?q=g:thl4243285577d&dq=&hl=it&lr=&ie=UTF-8&oe=UTF-8&selm=qCtA9.5491%24Yw.219761%40news2.tin.it
questa l'avevi vista?
-- 
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 
No.
La ho appena provata. Ho fatto una  piccola correzione perche' genera 
errore utilizzando listsubitem, invece di subitems.
Purtroppo non funziona.
Come altre routine che ho trovato, viene utilizzato il trucco di 
allargare di n punti le colonne. Solo che l'allargamento di una colonna 
che contiene caratteri in bold non e' fisso ma dipende dalla lunghezza 
del testo.
Mi domando chi me lo fa fare di perdere tempo in questo modo, di 
sentirmi le ramanzine dei clienti. :-(
grazie
	maxx


 sempre troppo piccola e gli item in grassetto sono troncati.
Ecco un piccolo barbatrucco per risolvere:
Prima del SendMessage, imposta il Font del controllo ListView con Bold =
True e poi rimettilo a False.
Occhio che se il Font del controllo e' Bold gli Item sono _per forza_ Bold,
viceversa (il Font del controllo non e' bold),
gli Item possono esserlo. In ogni caso gli Item mantengono lo stato, anche
se il LV viene messo Bold. Da qui, lo sporco trucco(TM) =)
<codice>
'Controllo ListView1 con 3 colonne ("1","2","3")
Option Explicit
Private Declare Function SendMessage _
    Lib "user32" Alias "SendMessageA" _
    (ByVal hWnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    ByRef lParam As Any) As Long
Private Const LVM_FIRST = &H1000
Private Const LVM_SETCOLUMNWIDTH = LVM_FIRST + 30
Private Const LVSCW_AUTOSIZE_USEHEADER = -2
Public Sub AutoSizeListView(ByRef lv As ListView)
    Dim i As Long
    With lv
        If .View = lvwReport Then
            For i = 0 To .ColumnHeaders.Count - 1
                .Font.Bold = True
                Call SendMessage(.hWnd, LVM_SETCOLUMNWIDTH, i, ByVal
LVSCW_AUTOSIZE_USEHEADER)
                .Font.Bold = False
            Next i
        End If
    End With
End Sub
Private Sub Form_Load()
    Dim i As Long
    Dim li As ListItem
    Dim bBold As Boolean
    For i = 0 To 20
        bBold = CBool((i Mod 2) = 0) 'Una si e una no
        Set li = ListView1.ListItems.Add(, , CStr(i * 1000))
        li.Bold = bBold
        li.SubItems(1) = CStr(i * 10000)
        li.ListSubItems(1).Bold = bBold
        li.SubItems(2) = CStr(i * 100000)
        li.ListSubItems(2).Bold = bBold
    Next i
    Call AutoSizeListView(ListView1)
End Sub
</codice>
hth,
Lokar
-- 
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt
Statuto: 
http://www.it-lang-vb.net/docs/Statuto.txt
UGIdotNET - 
http://www.ugidotnet.org

 del testo.
io non l'ho mai usata, però dovrebbe prendere il carattere utilizzato nella
colonna, assegnarlo alla form (temporaneamente) per calcolare la textwidth.
se fa questo, dovrebbe trasferire anche il fatto che stai usando il
grassetto, credo. se non lo fa, forse è da modificare un attimo.


 forse è da modificare un attimo.
Gli ho dato un'occhiata e mi sembra MOLTO macchinosa =)
C'e' uno sproco trucco(TM) nell'altro mio post =)


 
Ottimo, funziona.
Chissa sefunziona anche infilando qualche icona qua e la'... ;-)
grazie
	maxx


 se il LV viene messo Bold. Da qui, lo sporco trucco(TM) =)
Sono stato un po' contorto. Mi rispiego va:
 ------------------------------------
|  ListView |  Item  |  Visualizzato |
 ------------------------------------
|    Norm   |  Norm  |      Norm     |
 ------------------------------------
|    Norm   |  Bold  |      Bold     |
 ------------------------------------
|    Bold   |  Norm  |      Bold     | (!!!)
-------------------------------------


 e non fare l'autosize su di lei.
Altro sporco trucco(TM) =)


 
Ti eri spiegato perfettamente. Oppure abbiamo contorsioni congruenti. :-)
	maxx


 
Vb aguzza l'ingegno!


 C'e' qualche soluzione?
ESP0DAMA? :-P (Ctrl+Shift+F sulla ListView e poi riaggiornare).
Sě, c'č un correttore da 180, ma c'č sempre, con bold e no (perchč la
TextWidth č fatta ... al risparmio).
Voi e le vostre API...

 
Quante righe di codice sono? ;-)
	maxx
P.S. Cos'e' un correttore "da 180"?


 P.S. Cos'e' un correttore "da 180"?
Trova nel progetto corrente, 180, successivo (maggiorazione)...

 
Aaaahhhhh! Non ho capito. Cos'e', dialetto cremonese?!
:-)
	maxx


 Voi e le vostre API...
!!!
Scusa Lupo ma le API sono li' per essere usate. Le usi tutti i giorni anche
tu, anche se VB fa le cose per te. I controlli stessi, gli ocx, le dll,
anche'essi non sono altro che API!
SendMessage e' alla *base* di *tutte* le applicazioni che funzionano su S.O.
Windows. Non e' che non dichiarandola, non la usi: *tutti* programmi sono
riconducibili ad una funzione main che fa piu' o meno:
- GetMessage
- mi interessa? -> processo il messaggio
- non mi interessa? -> SendMessage
Il controllo ListView ha delle "potenzialita'" non utilizzabili in VB solo
perche' la sua interfaccia VB non espone *tutti* i metodi. Non mi sembra un
"acrocchio" utilizzare la SendMessage per richiedere al controllo di
eseguire il metodo X che da VB non potrei utilizzare. Per quanto riguarda il
Font, pensandoci bene si capisce perche' funzioni cosi'. Se il controllo
quando gli chiedi l'autosize guarda fra le sue proprieta' e vede, "toh sono
una listview con font NON bold, facciamo st'autosize col font normale" mi
sembra plausibile. E infatti basta dire al controllo "ehi l'autosize fammelo
sul font bold" e lui lo fa. L'errore di progettazione risiede nel fatto che
se il controllo ha font Bold _tutti_ gli item vengono visualizzati in bold,
indipendentemente dalla loro proprieta'.
Just my 2 eurocent.


 Lupo

 VB, non come lo faccia.
LOL =)
Personalmente e caratterialmente non posso condividere le questioni di
principio, ma sui tuoi progetti sei tu il capo =). Io davo solo un parere
tecnico.
Happy Coding =)


 parere tecnico.
Ecco, spiegami pure come funziona il motore e non come si guida l'auto.
Finirei nel primo fosso. Però col motore ancora acceso.

 motore ancora acceso.
Io veramente non pretendo di insegnare nulla. Era "pour parler" e mi
dispiace di averti "punto" di nuovo. *Sul serio* mi dispiace. Anche quando
dico "sui tuoi progetti sei tu il capo", non c'e' nessun intento di fare
"sfotto'", spero che tu mi creda.
Di nuovo, Happy Coding =)


 intento di fare "sfotto'", spero che tu mi creda.
Ti credo, non potrebbe essere altrimenti, senza alcuna presunzione.

 senza alcuna presunzione.
Spero che mi creda anche su tutto il resto, e ti prego di non smettere mai
di dare il tuo prezioso contributo al ng =)


 tempo inutile abbiamo perso a discutere =)
Ecco, facciamo basta.

 faccia.
Per quanto mi riguarda e per quello che può servire, sono daccordo con te su
tutta la linea.
Mordo