Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] autofit listview

Dubito ci sia soluzione ma ci provo: esiste un modo per impostare l'autofit
di una o tutte le colonne di una listview in formato report dopo che č stata
riempita? Per autofit intendo il ridimensionamento automatico di una colonna
in funzione del dato piů largo contenuto. In fase di run time basta cliccare
sopra il bordo della colonna e viene effettuato ma vorrei lo facesse in
automatico da codice.
Al limite potrei analizzare tutti i dati, ricavarmi la larghezza massima ed
impostarla ma preferirei una soluzione piů veloce come esecuzione.
bye,
max

 automatico da codice.
Non l'ho provata, ma googlando ho trovato:
**
Public Const LVM_FIRST As Long = &H1000 
Public Const LVM_SETCOLUMNWIDTH As Long = (LVM_FIRST + 30) 
Public Const LVSCW_AUTOSIZE_USEHEADER As Long = -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 Sub ridimensionaListView(listview As listview) 
   Dim Ridimensionamento As Long 
   For Ridimensionamento = 0 To listview.columnheaders.Count - 1 
      Call sendmessage(listview.hwnd, _ 
                       LVM_SETCOLUMNWIDTH, _ 
                       Ridimensionamento, _ 
                       ByVal LVSCW_AUTOSIZE_USEHEADER) 
   next 
end Sub
**


A te il compito di scoprire la differenza tra LVSCW_AUTOSIZE e 
LVSCW_AUTOSIZE_USEHEADER.
'ListView column sizing constants
Private Const LVM_FIRST As Long = &H1000
Private Const LVM_SETCOLUMNWIDTH As Long = (LVM_FIRST + 30)
Private Const LVSCW_AUTOSIZE As Long = -1
Private Const LVSCW_AUTOSIZE_USEHEADER As Long = -2
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
sub lvwAutoSIZE(refLVW as listview, optional refCOL as long = 0)
Call SendMessage(refLVW.hWnd, LVM_SETCOLUMNWIDTH, _
  refCOL, _
  ByVal LVSCW_AUTOSIZE_USEHEADER)
end sub
-- 
-> GbC|
www.gbcweb.com
www.chiappori.com
 

 max
Per quanto riguarda il resize delle colonne in generale ti hanno già 
risposto.
Se ti serve ridimensionare l'*ultima* colonna in modo che occupi lo spazio 
residuo (così che non appaia la scrollbar orizzontale), puoi usare questa 
routine (le dichiarazioni sono sempre quelle)
Public Sub SetListViewAutosizeMax(lvw As ListView)
Dim col As Long
    col = lvw.ColumnHeaders.Count
    lvw.ColumnHeaders(col).Width = 0
    SendMessage lvw.hwnd, LVM_SETCOLUMNWIDTH, (col - 1), ByVal 
LVSCW_AUTOSIZE_USEHEADER
End Sub
Ciao
Raf 


Provato, funziona, a differenza del click manuale sul bordo inoltre mi
considera anche l'intestazione (cioč non me la taglia se tutti i dati
sottostanti sono piů stretti) ed č proprio quello che desideravo. Credo sia
questa la differenza tra i due parametri sopra citati.
Per sistemare tutte le colonne ho dovuto fare un loop e l'effetto grafico
non č eccezionale, in pratica impiega una frazione di secondo a fare in
resize totale con un effetto non proprio ideale ma non si puň avere tutto.
Grazie
bye,
max


eBBravo :) hai scoperto proprio tutto
Non so, la prima cosa che mi viene in mente č provare a nascondere la 
lvw (visible=false) prima di sistemarla...
ho programmi con oltre 100.000 righe e una 30na di colonne nelle lvw e 
il riordino non č fastidioso...
ciao cia' :)
