Newsgroup: it.comp.appl.access
Titolo: Larghezza elenco di casella combinata

Salve,
oggi sto postando a rotta di collo :) Il motivo è che sto dando gli
ultimi ritocchi al database.
Passiamo alla domanda.
Ho una casella combinata nel cui elenco vengono visualizzate due
colonne: NomeCliente e ViaCliente (l'ho fatto in caso di clienti
omonimi).
Mi chiedevo se fosse possibile, in qualsiasi modo, che la larghezza
delle due colonne, e quindi dell'elenco, si espanda o si riduca a
seconda della lunghezza del testo contenuto.
Spero di essermi spiegato bene.
Ciao e grazie.

robb ha scritto:

argomento ampiamente discusso su 
www.alessandrobaraldi.it
Resize List/Combo_Box


Ti ringrazio della risposta. Io, in realtà, avrei voluto che solamente
la larghezza dell'elenco si dimensionasse automaticamente e non tutta
la combo.
E' possibile?

è possibile farlo cambiando la function resizecontrol con il seguente
codicd:
Public Function ResizeControl(ctl As Control, _
                               Optional blHeight As Boolean = True, _
                               Optional blWidth As Boolean = True, _
                               Optional maxWidth As Long = 35000, _
                               Optional blFirstColHidden As Boolean =
False)
   'blHeight indica se il Controllo deve essere Ridimensionato in
Altezza
   'blWidth indica se il Controllo deve essere Ridimensionato in
Larghezza
   Dim TwipsPerPixel As POINTAPI
   Dim lngMax() As Long
   Dim lngWidth As Long
   Dim strFont As String
   Dim intWeight As Integer
   Dim fItalic As Boolean
   Dim fUnderline As Boolean
   Dim lngHeight As Long
   Dim intSize As Integer
   Dim strText As String
   Dim intI As Integer
   Dim intCol As Integer
   Dim Scroll As Long
   Dim Sz As ControlSize
   Dim strWidth As String
   Dim blHead As Integer
   Dim strWidth1 As Double
   With ctl
       intSize = .fontsize
       strFont = .FontName
       intWeight = .FontWeight
       fItalic = .FontItalic
       fUnderline = .FontUnderline
       blHead = .ColumnHeads
   End With
   ' Cicla i valori del Controllo, e
   ' memorizza la larghezza(lngMax) del piu lungo.
   ' Non è detto che il valore con più caratteri
   ' sia il più lungo:
   ' Es.:
   ' OOOOO è più lungo di
   ' 11111 nonostante Len(..)=5
   ' Queste proporzioni dipendono anche dal
   ' tipo di Font e dalla Formattazione applicata.
   ' E' necessario, quindi ricavare il numero di Twips
   ' o Pixel che occupa la Scritta e confrontare questo
   ' valore.
   Call TwipsPixel
   ReDim lngMax(ctl.ColumnCount)
   For intI = 0 To ctl.ListCount + CInt(Not blHead)
      For intCol = 0 To ctl.ColumnCount - 1
         If intCol = 0 And blFirstColHidden Then
            lngMax(intCol) = 0
         Else
            strText = Nz(ctl.Column(intCol, intI), vbNullString)
            If TwipsFromFont(strFont, intSize, _
             intWeight, fItalic, fUnderline, 0, strText, _
             False, lngWidth, lngHeight) Then
                If lngWidth > lngMax(intCol) Then
                    lngMax(intCol) = lngWidth
                End If
            End If
         End If
      Next intCol
   Next intI
   ' Calcola la larghezza della SCROLL_BAR
   ' ricavandone le dimensioni utilizzando
   ' le API(GetSystemMetrics).
   ' Somma una % della Larghezza in quanto aumentando
   ' il FONT si introducono errori percentuali VISIBILI.
   ' Convert it to twips for use in Access.
   TwipsPerPixel.x = TwipsPerInch / lngLogPixels.x
   Scroll = GetSystemMetrics(SM_CXVSCROLL) * TwipsPerPixel.x
   For intCol = 0 To ctl.ColumnCount - 1
      If intCol = 0 And blFirstColHidden Then
         Sz.XMax = 0
         'strWidth = strWidth & "0;"
         strWidth1 = strWidth1
      Else
         If CInt(lngMax(intCol)) > 0 Then
            Sz.XMax = CInt(Sz.XMax + lngMax(intCol) + 100)
            'strWidth = strWidth & CInt(lngMax(intCol) + 100) & ";"
            strWidth1 = strWidth1 + CInt(lngMax(intCol) + 100)
         End If
      End If
   Next
   'strWidth = strWidth & "0"
         strWidth1 = strWidth1
   Sz.XMax = Sz.XMax + AdjustForScreen
   If Sz.XMax > maxWidth Then Sz.XMax = maxWidth
   Sz.YMax = ctl.ListCount * lngHeight * 1.02 + AdjustForScreen
   Sz.YMin = lngHeight '+ AdjustForScreen
   'Il RESIZE Verticale avviene in modo differente su LIST e COMBO
   'LIST:
   '     Aggiorna la proprietà Height=ListCount*AltezzaCarattere
   'COMBO:
   '     Aggiorna la Proprietà Height=AltezzaCarattere
   If TypeOf ctl Is ListBox Then
      If blHeight Then ctl.Height = Sz.YMax
      If blWidth Then
         If ctl.ListCount * lngHeight < (ctl.Height) Then Scroll = 0
         'ctl.Width = Sz.XMax + Scroll
      End If
   ElseIf TypeOf ctl Is ComboBox Then
      If blHeight Then ctl.Height = Sz.YMin
      'If blWidth Then ctl.Width = Sz.XMax + Scroll
      'ctl.ListWidth = Sz.XMax + Scroll
   End If
   [Forms]![es_resize_list]![combo2].ListWidth = strWidth1
End Function


Ti ringrazio molto per l'aiuto.
Non mi sono chiare alcune cose.
1- Ho scaricato il file dal sito di Alessandro Baraldi. Devo copiare
tutti e quattro i moduli nel mio db o mi basta solo il modulo
basResizeControl modificato come da te suggerito?
2- E' necessario creare una sottomaschera, come nel file del sito?
3- Come mai alla fine del codice che mi hai postato ci sono le
coordinate della combo2 presente nel file del sito? Ciò vuol dire che
il modulo può essere applicato ad una sola combo?
4- Ultima, ma non per importanza. Su quale evento della combo devo
richiamare il modulo?
Grazie.

 Grazie.
Ho provato a sostituire il codice che mi hai scritto direttamente nel
file del sito e l'elenco non sembra ridimensionarsi come dovrebbe.
Qualche lettera risulta tagliata.


Con il codice che mi hai postato, l'elenco in effetti si ridimensiona
in maniera corretta, ma sono le colonne che sono un po' sbalestrate.

robb wrote:
[CUT]
Lascia perdere tutti i messaggi precedenti. :)
Ho importato solo il modulo basResizeControl nel mio DB. Ho modificato
parte del codice con il codice che mi hai postato. Alla fine del codice
ho sostituito le coordinate di Combo2 con quelle della mia Combo.
Nell'evento "Su apertura" della maschera ho scritto:
ResizeControl Me.Combo_Cliente, True, True, , True
L'ultimo True, mi pare di aver capito, va inserito se la prima colonna
è una colonna nascosta.
Ho impostato "Larghezza elenco" della Combo su "Automatica".
In "Larghezza colonne" ho scritto "0 cm", altrimenti, nonostante
l'ultimo True, la prima colonna, che dovrebbe stare nascosta, viene
visualizzata.
Le colonne, quindi, sono 3. La prima, che è un Contatore, è nascosta.
Le altre due devono essere visualizzate.
Mi rimane un problema.
Premetto che le dimensioni, con il tuo codice, rimangono sempre uguali.
Il problema è costituito dalle due colonne visualizzate, che vengono
divise in parti esattamente uguali, a prescindere dalla lunghezza del
testo in esse contenuto.
Se il testo diventa più lungo, anche la larghezza dell'elenco cresce,
ma le colonne restano sbalestrate e sempre divise in due parti uguali.
Quale può essere il problema?


La frase "Premetto che le dimensioni, con il tuo codice, rimangono
sempre uguali." è riferita alle dimensioni della Combo e non
dell'elenco. Quelle dell'elenco cambiano, come specificato più avanti.

robb ha scritto:

Non saprei come fare, dovresti chiedere a Baraldi, il fautore del db.

 Non saprei come fare, dovresti chiedere a Baraldi, il fautore del db.
Mannaggia! Ci eravamo quasi.
Come faccio a chiedere a Baraldi? Ho letto nella netiquette del ng che
non sono ben accetti i messaggi nel cui titolo si mette il nome di una
persona specifica.
Dovrei postare un nuovo messaggio nella speranza che lo legga.


Ti sta leggendo, se vuole risponde
-- 
_ _
Ciao
MAssimiliano Amendola            
www.accessgroup.it
Cisa - Conferenza Italiana per Sviluppatori Access
Info:  
www.donkarl.com/it

robb ha scritto:

Non ho ben capito il problema sarà il caldo, ti spiacerebbe inviarmi
un Demo molto stringato per capire meglio...!
Più o meno dovrebbe essere questione di impostare il ColumnWidths, ma
dovrei
essere sicuro di quanto ho capito, per questo meglio il Demo.
i k 2 z o k @l i b e r o . i t
Togli gli interspazi.
@Alex

Alessandro Baraldi ha scritto:
[CUT]
Pubblico la modifica della Routine sperando di aver capito il problema:
' Da chiamare così:
  ResizeControl Me.Combo_Cliente, True, False, , True


      ctl.ColumnWidths = strWidth
      ctl.ColumnWidth = strWidth1
      If blWidth Then ctl.Width = Sz.XMax + Scroll
      ctl.ListWidth = Sz.XMax + Scroll
   End If
   [Forms]![M_Fattura]![Combo_Cliente].ListWidth = strWidth1
 
End Function
Ciao
@Alex

    [Forms]![M_Fattura]![Combo_Cliente].ListWidth = strWidth1
può, deve, essere rimossa, riduce la flessibilità del codice,
eventualmente
avrebbe dovuto essere
ctl.ListWidth=strWidth1
ma non serve in questo contesto.
Ciao
@Alex