Newsgroup: it.comp.lang.visual-basic
Titolo: [?] ComboBox in un OCX e proprietà readonly a runtime

In un mio OCX ho messo una combobox. E nient'altro.
La combobox ha la proprietą "Style" che e' in lettura/scrittura a design-time, ma diventa
read-only a run-time.
La proprietą "Style" permette di modificare il comportamento della combo, che varia
secondo i seguenti valori:
Public Enum ComboStyleEnum
  [DropDown Combo] = 0
  [Simple Combo] = 1
  [DropDown List] = 2
End Enum
Sto impazzendo a rendere disponibilie questa proprietą anche nel mio OCX. Possibile che io
debba fare 3 OCX, uno per ciascun valore della proprietą? Ho usato il "ActiveX Control
Interface Wizard" dell' "Add-In Manager" e non sono riuscito a risolvere. Quando tento di
testare il codice (semplicemente spostandomi sul form di avvio, oppure tentando di
compilare), ottengo sempre un errore per cui la proprietą Style non e' assegnabile ad una
proprietą di sola lettura (sebbene io abbia aggiunto l' "If Ambient.UserMode Then ..." per
evitare un assegnamento a run-time).
Come si risolve questo problema?
Grazie.
Di seguito posto il codice (si tratta del codice che compone un controllo utente in cui vi
e' stato inserito una ComboBox di nome "SimpleComboBox").
___________________________________________________________________________
Option Explicit
Public Enum ComboStyleEnum
  [DropDown Combo] = 0
  [Simple Combo]
  [DropDown List]
End Enum
'Valori predefiniti proprietą:
Const m_def_Style = 2
'Variabili proprietą:
Dim m_Style As Integer
Private Sub UserControl_Resize()
  UserControl.Height = SimpleComboBox.Height
  SimpleComboBox.Width = UserControl.Width
End Sub
'AVVISO: NON RIMUOVERE O MODIFICARE LE SEGUENTI RIGHE DI COMMENTO
'MemberInfo=7,1,0,2
Public Property Get Style() As ComboStyleEnum
  Style = m_Style
End Property
Public Property Let Style(ByVal New_Style As ComboStyleEnum)
  If Ambient.UserMode Then Err.Raise 382
  m_Style = New_Style
  PropertyChanged "Style"
  SimpleComboBox.Style = New_Style
  ' ****** Qui mi segnala l'errore ******
End Property
'Inizializza le proprietą di UserControl.
Private Sub UserControl_InitProperties()
  m_Style = m_def_Style
End Sub
'Carica i valori delle proprietą dalla posizione di memorizzazione.
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
  m_Style = PropBag.ReadProperty("Style", m_def_Style)
End Sub
'Scrive i valori delle proprietą nella posizione di memorizzazione.
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
  Call PropBag.WriteProperty("Style", m_Style, m_def_Style)
End Sub

 Come si risolve questo problema?

  Faccio una ipotesi. Ti farebbe schifo una matrice di combo? Con
indici [DropDown Combo], [Simple Combo] e [DropDown List].
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

 ha scritto
|   Faccio una ipotesi. Ti farebbe schifo una matrice di combo? Con
| indici [DropDown Combo], [Simple Combo] e [DropDown List].
Mah, non parliamo di schifo... :)
Mi sa che prendero' in considerazione il tuo suggerimento, e non vedo alternative... (ma
si sa, la gente ignorante non trova mai alternative :) )

|   Faccio una ipotesi. Ti farebbe schifo una matrice di combo? Con
| indici [DropDown Combo], [Simple Combo] e [DropDown List].
Ho provato, e nel caso in cui vi sia una sola proprietà di read-only a run-time la
soluzione non e' niente male (aggira l'ostacolo egregiamente). Pero' quando di proprietà
read-only ve ne sono due o più, le cose comominciano a farsi complicate: si dovrebbe
infatti prevedere un controllo nella matrice per ogni possibile combinazione delle
proprietà: ad esempio, con due proprietà p1 e p2 ciascuna con due valori v1 e v2 servono
quattro controlli:
ctrl(1) associato a p1=v1 p2=v1
ctrl(2) associato a p1=v1 p2=v2
ctrl(3) associato a p1=v2 p2=v1
ctrl(4) associato a p1=v2 p2=v2
Chiaramente questa e' un soluzione non generica, mentre io vorrei sapere come si procede
in generale...
Ci sono altre soluzioni?

 Mi sa che prendero' in considerazione il tuo suggerimento, e non
vedo alternative... (ma si sa, la gente ignorante non trova mai
alternative :) )
  Infatti non ne ho trovate, per ora. Mi sa che devo darmi da fare
di piu` se voglio scrollarmi di dosso quel marchio infamante.
--
Ciao ;-)


 ha scritto

Ho cercato su un po' di newsgroup, tra i quali microsoft.public.vb.*, e sembra che non ci
sono soluzioni a questo problema.
Tutti suggeriscono di usare una matrice di controlli, oppure di riscrivere il controllo
con le API (AAAAAAAAAAAARRRGHHHHHHHH). Penso che la fantasia di scrivere ocx che estendano
le proprietą di alcuni controlli gią esistenti mi stia passando...

Ci sono altre soluzioni?
La piu' economica, senza API e quant'altro, e usare un combo windowless (che si trova
in mswless.ocx (o qualcosa del genere) nell' ultimo cd di vb.
ciao, hal