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:
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
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
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…
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:
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.
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.
Ecco alcune proprietà che ho impostato.
Certo sto dimenticando qualche cosa!