Newsgroup: it.comp.lang.visual-basic
Titolo: Si può migliorare?





Ciao a tutti,


qualche tempo fa ho avuto un problema con il 
controllo listview: non riuscivo ad adattare automaticamente in base al testo 
la larghezza della colonna! Girando sulla Rete ho trovato una funzione API 
che lo faceva, essa funziona perfettamente con la versione 5.0 del controllo 
listview ma con la 6.0 (qella che uso io nei mie prj) non funziona affatto!! 
Così, pur essendo un programmatore alla prime armi, ho deciso di cimentarmi in 
una routine che mi permettesse SENZA usare api di ottenere il suddeddo 
effetto... Il risultato è stato abbastanza incoraggiante. L'unico problema che 
non ho saputo risolvere bene è stato come trovare le dimenzioni in twips di ogni 
carattere della tabella ASCII tenendo conto di fattori quali il grassetto, le 
dimensioni in punti del font, il tipo del font ecc. Ho risolto con un sistema 
rudimentale inserendo una lettera (nella fattispecie la B) in una label con 
autosize=true, estraendo la dimenzione della label ed utilizzandola come 
campione per tutti i caratteri... La cosa funziona piuttosto bene (non 
perfettamente) se si utilizza nella listview sempre il font "Ms Sans Serif" 
senza grassetto e con le dimensioni di 8pt... Per gli altri ho fatto qualche 
calcolo matematico ma i risultati sono stati praticamente nulli! Adesso vi 
chiedo: 
esiste qualche funzione API o qualche trucco che posso 
utilizzare per calcolare le dimensioni di un carattere in base al tipo e alle 
caratteristiche del font utilizzato?
 Ecco cmq la funzione che ho 
costruito (NOTA: non è ottimizzata e non è neanche ben leggibile in quanto 
è solo una bozza):


'COSTANTI


Private Const ORD2PT = 30.0472 
'Tentativo non riuscito di capire quale rapporto ci fosse tra le 
dimenzioni a 8pt del carattere e quelle a 10pt dello stesso 
carattere
Private Const SPA8PT = 105 
'Dimensione 
in twips che occupa la lettera B
Private Const SPAECC = 90.0236 
'Spazio libero da aggiungere alle dimensioni della 
listview


'FUNZIONE


Public 
Function adattacolonna(lst As ListView, vform As Object, col As Integer, 
Optional stretch As Boolean = True, Optional range As Integer = 0)
Dim tw As 
Single, limits As Integer, ttw As Single, dimfnt As Double, ind As Integer, dind 
As Integer
dimfnt = SPA8PT + (ORD2PT * (lst.Font.Size - 8.25) / 2)
If 
range <> 0 Then range = range + RNG2PT * (lst.Font.Size - 8.25)
tw = 
dimfnt * Len(lst.ColumnHeaders(col).Text)
ind = 0
limits = 
lst.ListItems.Count
For cx = 1 To limits
If col = 1 Then ttw = dimfnt * 
Len(lst.ListItems(cx).Text)
If col > 1 Then ttw = dimfnt * 
Len(lst.ListItems(cx).SubItems(col - 1))
If ttw > tw Then
tw = 
ttw
ind = cx
End If
Next cx
If col = 1 And ind <> 0 Then dind 
= Len(lst.ListItems(ind).Text)
If col > 1 And ind <> 0 Then dind = 
Len(lst.ListItems(ind).SubItems(col - 1))
If ind = 0 Then dind = 
Len(lst.ColumnHeaders(col).Text)
If dind < 3 Then tw = tw + 
SPAECC
lst.ColumnHeaders(col).Width = vform.ScaleX(tw, 1, vform.ScaleMode) + 
range
If stretch = True Then
Dim nd As Integer
nd = 0
For cz = 1 To 
lst.ColumnHeaders.Count
nd = nd + lst.ColumnHeaders(cz).Width
Next 
cz
lst.Width = nd
End If
End Function


 


GRAZIE
Antonio Mirarchi


P.S
Scusatemi se sono un 
dilettante...
-- 
--


 


Antonio "[stamc]" 
Mirarchi
==================
Email           
: 
st...@bigfoot.com
#ICQ           
: 31866145
Pager ICQ   : 
3186...@pager.mirabilis.com
Siti 
WWW   : 
http://stamc.n3.net
 & 
http://wol.n3.net


 


Ammiraglio Hut, gestore gioco di ruolo "Star 
Trek: 
war"
=====================================
Email                    
: 
h...@trekwar.cjb.net
Sito 
WWW          : 
http://trekwar.cjb.net
 o 
http://trekwar.n3.net
Free email service : 

http://trekwar.zzn.com



...
Ciao a tutti,
qualche tempo fa ho avuto un problema con il controllo listview: non
riuscivo ad adattare automaticamente in base al testo la larghezza della
colonna! Girando sulla Rete ho trovato una funzione API che lo faceva, essa
funziona perfettamente con la versione 5.0 del controllo listview ma con la
6.0 (qella che uso io nei mie prj) non funziona affatto!! Così, pur essendo
un programmatore alla prime armi, ho deciso di cimentarmi in una routine che
mi permettesse SENZA usare api di ottenere il suddeddo effetto... Il
risultato è stato abbastanza incoraggiante. L'unico problema che non ho
saputo risolvere bene è stato come trovare le dimenzioni in twips di ogni
carattere della tabella ASCII tenendo conto di fattori quali il grassetto,
le dimensioni in punti del font, il tipo del font ecc. Ho risolto con un
sistema rudimentale inserendo una lettera (nella fattispecie la B) in una
label con autosize=true, estraendo la dimenzione della label ed
utilizzandola come campione per tutti i caratteri... La cosa funziona
piuttosto bene (non perfettamente) se si utilizza nella listview sempre il
font "Ms Sans Serif" senza grassetto e con le dimensioni di 8pt... Per gli
altri ho fatto qualche calcolo matematico ma i risultati sono stati
praticamente nulli! Adesso vi chiedo: esiste qualche funzione API o qualche
trucco che posso utilizzare per calcolare le dimensioni di un carattere in
base al tipo e alle caratteristiche del font utilizzato? Ecco cmq la
funzione che ho costruito
[SNAP SNAP SNAP]
Prima che finisca di leggere due consigli:
1) Scrivi in text plain e non in html
2) Guarda la proprietà TextWidth/TextHeight che si basano sull'unità di
misura e sul font del form.
Ciao

 misura e sul font del form.
Non ci avevo pensato... GRAZIE!
Antonio Mirarchi





Io uso questa classe e funge benissimo con VB6SP3


 


Option Explicit


 


Private Const LVM_FIRST = &H1000
Private Const LVM_SETCOLUMNWIDTH = 
(LVM_FIRST + 30)
Private Const LVSCW_AUTOSIZE = -1
Private Const 
LVSCW_AUTOSIZE_USEHEADER = -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
   
   Public Enum 
HEADMODE
      
eAUTOSIZE
      
eAUTOSIZE_USEHEADER
      
eAUTOSIZE_LAST
   End Enum
   
Public Sub 
HeadSetup(Lv As ListView, Mode As HEADMODE)
Dim col2adjust As 
Long
'---------------------------------------------------------------
Select 
Case Mode
   Case 
eAUTOSIZE_USEHEADER
      'Size each column based on 
the maximum of
      'EITHER the columnheader text 
width, or,
      'if the items below it are wider, 
the
      'widest list item in the 
column
       For col2adjust = 0 To 
Lv.ColumnHeaders.Count - 
1
          Call 
SendMessage(Lv.hwnd, 
_
                           
LVM_SETCOLUMNWIDTH, 
_
                           
col2adjust, 
_
                           
ByVal LVSCW_AUTOSIZE_USEHEADER)
       
Next
   Case eAUTOSIZE
      For 
col2adjust = 0 To Lv.ColumnHeaders.Count - 1
      

         Call SendMessage(Lv.hwnd, 
_
                          
LVM_SETCOLUMNWIDTH, 
_
                          
col2adjust, 
_
                          
ByVal LVSCW_AUTOSIZE)
      Next
   
Case 
eAUTOSIZE_LAST
      
      
col2adjust = Lv.ColumnHeaders.Count - 1
      

      Call SendMessage(Lv.hwnd, 
_
               
LVM_SETCOLUMNWIDTH, 
_
               
col2adjust, 
_
               
ByVal LVSCW_AUTOSIZE_USEHEADER)
End Select
End Sub


 



Io uso questa classe e funge benissimo con VB6SP3
GRAZIE!! Mi funzica perfettamente anche con VB5SP3.
Antonio Mirarchi
