Newsgroup: it.comp.lang.visual-basic
Titolo: [?] - Impostare la larghezza di una colonna al valore più lungo in FlexGrid

Ciao a tutto il NG
    Come posso fare per impostare la larghezza di una colonna al valore più
lungo della colonna stessa ?
    Una cosa simile a quella che fa excell quando si fa doppio click sul
bordo di una cella di intestazione.
Grazie 1000 per ogni eventuale risposta
        Ciao, Rocco

 bordo di una cella di intestazione.
Devi scandagliare tutte le righe e, per ciascuna, con TextWidth, ricavare la
dimensione piů ampia, poi agisci sul ColWidth della griglia.

 dimensione più ampia, poi agisci sul ColWidth della griglia.
Se parli ovviamente del listview ...
soluzione più bastarda ... sublcassi il messaggio <???> che manda il doppio
click sull'intestazione di colonna ..
saluti

 saluti
    Non ho capito bene cosa intendi dire.
        Una cosa tipo l'overload degli operatori di assegnazione del C++ ?
            Si può fare una cosa simile pure in VB ?    (spero di aprire un
nuovo tread)
            Se si, mi dai (date, estendo la cosa a tutto il NG) qualche link
per approfondire ?
        O semplicemente non ho capito un cavolo di quello che hai detto ?
            Se è così, mi dai informazioni/link aggiuntive ?
Comunque sia, grazie 1000 Fox ;-))
Ciao a tutti da Rocco

 ha scritto

http://p2p.wrox.com/archive/pro_vb/2002-09/10.asp
You'll have to loop through the FlexGrid looking for the longest text
in the
column in question, then change the column width to that size.  To get
the
longest text width, you could do something like this:
Private Function ChangeColWidth(ColNo as Integer) as Long
Dim i                As Integer
Dim liMaxColWidth    As Integer
    liMaxColWidth = 0
    With FlexGrid1
        For i = .FixedRows to .Rows-1
            If TextWidth(.TextMatrix(i, ColNo)) > liMaxColWidth Then
                liMaxColWidth = TextWidth(.TextMatrix(i, ColNo))
            End If
        Next i
        ChangeColWidth = liMaxColWidth
    End With
End Sub

     Non ho capito bene cosa intendi dire.
http://www.mvps.org/vbnet/index.html?code/comctl/lvcolumnautosize.htm


"a.p" ha scritto nel messaggio
Tana "quello là" !
Bye, G.

                 liMaxColWidth = TextWidth(.TextMatrix(i, ColNo))
Ottimizzazione a parte, (la TextWidth č pesantina, vale la pena
di farla una volta sola e memorizzarla in una var), direi anche
di stare attenti al Font usato. Usata cosě, la misura restituita č
quella del testo come verrebbe se fosse stampato sul form,
che magari usa un font diverso da quello della griglia...
Tempo fa avevo buttato giů questa, ha anche lei i suoi difetti,
ma va.
'*********************
Sub Riallinea(Griglia as MSFlexGrid)
    Dim LarghCol As Long
    Dim LarghColonne() As Long
    Dim N As Long
    Dim M As Long
    Dim FormFont As String
    FormFont = 
Me.Font.Name
 
Me.Font.Name
 = 
Griglia.Font.Name
    With Griglia
        .Redraw = False
        ReDim LarghColonne(.Cols)
        For N = 0 To .Cols - 1
            For M = 0 To .Rows - 1
                LarghCol = Me.TextWidth(.TextMatrix(M, N)) + 100
                If LarghCol > LarghColonne(N) Then LarghColonne(N) = LarghCol
            Next M
            .ColWidth(N) = LarghColonne(N)
        Next N
        .Redraw = True
    End With
 
Me.Font.Name
 = FormFont
End Sub
'*********************
Bye, G.

Ho stravolto l'applicazione, eliminando la flex grid ed inserendo una db
grid (tanto il succo della questione resta invariato)
    Quindi:
        Ho una DBGrid associata ad un Data
        Al Load della from vado a vedere quale è la larghezza massima delle
celle (fisse ad 11) rispettando le dimensioni base delle celle stesse.
        L'ultimo campo è di tipo Memo, quindi se lo vedo più grande di 5000,
lo imposto a quella larghezza in modo da non avere una cololla di 2 Km ;-)
        Creato il mio bel vettore con le dimensioni, se eseguo qualche
filtro sul data (e quindi mi cambia la visualizzazione del DBGrid) non
faccio altro che impostare i valori delle colonne con quelli che già
conosco.
    Ecco il mio codice, e grazie a tutti per le preziose risposte.
    P.S.    Per quella cosa del overload degli OdA ? Non si può fare vero ?
Peccato :-/
Ciao, Rocco
Sub LarghezzaGriglia()
Dim I As Integer
Dim Larghezza As Single
    VetDim(1) = 775
    VetDim(2) = 520
    VetDim(3) = 565
    VetDim(4) = 670
    VetDim(5) = 565
    VetDim(6) = 1705
    VetDim(7) = 730
    VetDim(8) = 700
    VetDim(9) = 400
    VetDim(10) = 535
    VetDim(11) = 940
 
Me.Font.Name
 = 
DBG.Font.Name
    Data.Recordset.MoveFirst
    Do While Not Data.Recordset.EOF
        For I = 1 To 11
            If Not IsNull(Data.Recordset(I)) Then
                Larghezza = TextWidth(Trim(Data.Recordset(I)))
            Else
                Larghezza = 0
            End If
            If VetDim(I) < Larghezza + 100 Then
                If (I = 11) And (Larghezza + 100 > 5000) Then
                    VetDim(I) = 5000
                Else
                    VetDim(I) = Larghezza + 100
                End If
            End If
        Next I
        Data.Recordset.MoveNext
    Loop
    Data.Recordset.MoveFirst
    Call ApparaGriglia
End Sub
Sub ApparaGriglia()
Dim I As Integer
    DBG.Columns(0).Visible = False
    For I = 1 To 11
        DBG.Columns(I).Width = VetDim(I)
    Next I
End Sub

 lo imposto a quella larghezza in modo da non avere una cololla di 2
Km ;-)
se non vuoi colonne troppo larghe, hai a disposizione anche
l'_altezza_ delle celle. la flex ha la propr wordwrap. con la dbgrid
puoi regolare l'altezza delle celle.
ciao