Proprietà controlli

Vorrei applicare a tutti i controlli checkbox di una windows la formattazione bold, con un ciclo del tipo:

Dim a As Integer
Dim NomeControllo as string
For a=0 To persona.ControlCount-1
  If InStr(persona.Control(a).Name,"Check")>0 Then
    NomeControllo = persona.Control(a).Name
    NomeControllo=NomeControllo // punto di interruzione
  End If
Next

Al posto della terzultima riga di debug dovrei inserire qualcosa come:

persona.Control(a).bold =true // oppure
persona.Control(a).font.bold =true 

ma nessuna di queste opzioni risulta valida.
A questo punto a nulla è valsa la mia ricerca della gerarchia delle classi per capire come applicare questa proprietà non disponibile nell’inspector.
Avete qualche idea in proposito?
Grazie.

ciao, presumo “persona” sia una finestra o un container control.

io ho usato praticamente il tuo stesso codice:

for k as Integer = 0 to self.ControlCount-1
  dim kObj as Control = self.Control(k)
  If InStr(kObj.Name, "Check") > 0 Then
    CheckBox(kObj).Bold = True
  End If
next

e tutto funziona.
Ho messo questo codice dentro un pulsante, posto direttamente sulla finestra, unitamente a 3 checkbox.

Capito! Hai creato l’oggetto ad ogni ciclo e poi la proprietà bold l’hai assegnata ad ogni chekbox. Mi mancava il passaggio che hai fatto [CheckBox(kObj).Bold = True] perchè ritenevo di poterlo usare come: kObj.bold e non come hai fatto tu: CheckBox(kObj).Bold
Certo che ci vuole un po di fantasia per capirlo, poichè l’uso che ne facevo in VBA era del tutto diverso. Quando un oggetto è stato definito, non serve richiamare ancora che tipo di oggetto è!
Un grazie a te per la cortese e validissima risposta!

io uso kObj (ma si potrebbe evitare) per avere un nome più corto da gestire (tanto è solo un riferimento a un oggetto già esistente), al posto di portarmi sempre dietro ‘persona.Control(a)’.

Quello che ho fatto io, anteporre “CheckBox” all’oggetto serve a dire che quell’oggetto è di tipo CheckBox, altrimenti per lui è un semplice “Control” generico che, ovviamente, non espone quella proprietà (un Oval ad esempio, che è un Control, non ha la proprietà Bold).

ho mantenuto la tua verifica mediante il nome, anche se è una cosa che non mi piace. Io avrei utilizzato l’operatore “isA”. Ti allego esempio

for k as Integer = 0 to self.ControlCount-1
  dim kObj as Control = self.Control(k)
  if kObj isA CheckBox then
    CheckBox(kObj).Bold = True
  end if
next

Buona questa del “isA”, non l’avevo mai notata. Come ho accennato all’inizio, per un iniziato come me, non avere sotto mano la completa gerarchia dei controlli, non è certo una passeggiata. Si deve procedere per tentativi sperando di incappare nel metodo giusto

Direi che l’uso di “isA” in tal caso è IMPAREGGIABILE!
Ti sono grato della dritta, encomiabile!

1 Like

questione di farci la mano :wink:

un CheckBox è un Control (più precisamente “eredita da”), che a sua volta è un Variant, cioè un oggetto generico.
Control(k) restituisce un Control, ma tu cerchi solo gli oggetti di tipo (isA) CheckBox. Ti tornerà utile in altri ambiti, fidati :slight_smile:
ciao!

Una soluzione più veloce poteva essere subclassare la classe CheckBox chiamandola, ad esempio, BoldCheckBox, ed impostare la proprietà Bold a True. Nella finestra interessata utilizza questa sub-classe al posto di quella originale.

Rinnovo il mio grazie a te Ant (che suppongo sia Antonio) perchè imparare questo nuovo ambiente non è proprio facilissimo se non si tratta di un semplice “Hello World”.
Si deve continuamente provare, prendere appunti, e così via, anche perchè di manuali in italiano ben fatti non se ne trovano. Anhe anche la “Documentation 184” di oltre 20000 pagine è molto dispersiva e per trovare qualcosa si diventa matti…

Si hai ragione Nedi, è una buona soluzione che ultimamente avevo scartato

Anche perchè una sottoclasse la puoi utilizzare in tutte le finestre che vuoi, non hai codice da scrivere e da duplicare, ed infine puoi tranquillamente evitare problemi del tipo: in una finestra hai 10 check box, 9 devono essere Bold e 1 no. Per i 9 check box Bold usi la sottoclasse, per quello non Bold usi la classe nativa Check Box.

Avevo abbandonato l’idea delle sottoclassi perchè trovavo una certa difficoltà ad usarle.
Ad esempio, se provo a crearne una per un BevelButton, mi ritrovo la seconda pagina dell’inspector così presentata:
image
senza la possibilità di scegliere da un elenco le proprietà che mi servono
Invece in un bottone originale mi ritrovo ad esempio le proprietà backcolor e textcolor disponibili direttamente

Si, perchè questo è l’Inspector della classe e non di una sua istanza: se vuoi accedere alle sue proprietà e modificarne i valori di default devi cliccare col destro sulla sottoclasse nel Navigator e selezionare la voce “Inspector Behavior”. Ti farà vedere l’elenco delle proprietà: puoi deselezionare quelle che non vuoi che vengano visualizzate nelle istanze e modificare il valore di default. Se nel Navigator hai aggiunto qualche altra proprietà la vedrai qui. Il tutto, ripeto, sarà visibile nelle istanze che tu creerai.

Grazie Nedi! Ho imparato qualche cosa in più.

Di nulla! Quando hai bisogno, io sono qua!

Chiedo scusa Nedi ma ho un problema con l’inspector behavior. Ho creato una sottoclasse bevel button ed attribuito varie proprietà con la lista behavior. Quando importo una nuova istanza dell’oggetto nella window, nessuna delle proprietà impostate viene attivata.
image
Ecco alcune proprietà che ho impostato.
Certo sto dimenticando qualche cosa!

Non vedo le spunte a fianco delle proprietà…

Bella questa! Ci devono essere anche le spunte? Diciamo che se ci sono i posti, questi non sono certo visibili! Ora guardo…

vi è in effetti in prima colonna a sinistra il campo VISIBLE, ma questo non risulta editabile

Inspector_Behavior
Dovrebbe presentarsi così…