Newsgroup: it.comp.appl.access
Titolo: WithEvents e controlli di Access

Sto realizzando una classe per la gestione dei controlli delle form e mi 
sono accorto che per alcuni di questi controlli non supportano la gestione 
degli eventi.
Mi riferisco, ad esempio, ai controlli
    Access.OptionButton
    Access.Label
per i quali, se vengono dichiarati nella classe con la clausola WithEvents, 
si riceve il seguente errore:
    Errore di run-time '459':
    L'oggetto o la classe non supporta
    il gruppo di eventi
Il suddetto errore si verifica proprio nel momento in cui la variabile di 
istanza viene inizializzata.
Inutile dire che togliendo la clausola WithEvents il codice funziona tranquillamente, 
anche se, ovviamente, in questo modo non è possibile gestire i relativi eventi.
Quello che mi lascia perplesso è che i sopra citati controlli espongono degli 
eventi, quindi è strano che non siano dichiarabili variabili del tipo di 
quei controlli in unione con la clausola WithEvents.
Qualcuno è a conoscenza dei motivi che stanno alla base di questo comportamento?
Sapete dirmi dove posso trovare documentazione relativa ai vari oggetti dichiarabili 
tranquillamente con la clausola WithEvents? L'help di Access dice solamente 
che la presenza di quella clausola prevede che la variabile sia di tipo oggetto 
e deve essere un controllo ActiveX.
Ho anche letto la bella guida su WithEvents e RaiseEvent preparata da Marco 
Pizzamiglio per la CISA1.
Grazie a chi vorrà darmi una mano.
--
PBsoft di Gabriele Bertolucci
www.pbsoft.it
skype: pbsoftsolution

Gabriele Bertolucci ha scritto:









Le etichette associate sono un po' particolari, non hanno eventi come puoi
vedere dalla scheda delle proprietà. Staccale dai loro controlli associati
con un taglia-incolla e potrai usare withevents. Sugli OptionButton non ci
sono problemi, rivedi il codice forse hai fatto qualche errore.
Ciao.
-Marco-
-- 
namor at inwind punto it
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 sono problemi, rivedi il codice forse hai fatto qualche errore.
Ho verificato ulteriormente e mi sono accorto che gli OptionButton sono tanto 
particolari quanto le etichette, nel senso che se questi sono dentro un OptionGroup, 
allora non ricevono eventi, viceversa sì.
In questo caso, il problema che adesso sto cercando di risolvere è capire 
quando un OptionButton è figlio di un OptionGroup.
Purtroppo credevo di risolvere testando
    OptionButton.Parent.ControlType <> acOptionGroup
ma anche questo test genera lo stesso errore di runtime quando viene fatto 
su un OptionButton che non è figlio di un OptionGroup.
Hai qualche suggerimento?


Come ti ha detto Marco a parte le Label Associate che diventano come
BMP
gli altri controlli non hanno nessun problema.
Oltre la guida che ha fatto Marco nel mio sito trovi 3 Demo che possono
esserti d'aiuto:
http://www.mantuanet.it/alessandro.baraldi/
Sezione [GENERALS]
SEZIONE DI CONTROLLI AVANZATI
2.1 Classi ed Eventi Public di Classi
2.2 Validazione DataEntry(uso avanzato Classi)
2.3 Formattazione del DataEntry(uso semplice Classi)
Il Demo 2.2 è ad un livello forse troppo spinto(non per te, ma in
generale)
Ciao
@Alex

 Hai qualche suggerimento?
on error resume next
err.clear
---istruzione
if err.number <> 0 allora e' associato
on error goto 0
--
ac

> gli altri controlli non hanno nessun problema.
Purtroppo non č cosě.
Anche gli OptionButton che sono "figli" di un OptionGroup hanno lo stesso 
problema delle label associate.


 2.3 Formattazione del DataEntry(uso semplice Classi)
Ho scaricato con piacere queste demo e ne farò sicuramente punto di riferimento.
Purtroppo, relativamente al problema da me riscontrato, non ho potuto trovare 
ancora una soluzione.
Grazie ugualmente.


 --
In effetti pare proprio che non ci sia altra alternativa se non quella di 
intercettare l'errore che viene restituito, ma volevo evitarlo.
Grazie comunque per il suggerimento.


Gabriele Bertolucci ha scritto:


C'è un errore di fondo nella scelta del controllo da usare. Non ha senso
lavorare su proprietà ed eventi dei singoli pulsanti di un option group.
Se lo usi lo devi trattare come un unico controllo con un unico valore,
come di fatto è, ed usare gli eventi del gruppo di opzioni, non delle sue
singole voci.
Se ti serve proprio accedere singolarmente alle singole opzioni creati un
finto gruppo inserendo una serie di button in una cornice.


 di intercettare l'errore che viene restituito, ma volevo evitarlo.
sapevo che lo sapevi. Ritengo che certe volte, non sempre, usare la 
mazzetta da 5Kg (da 10 e' troppo) sia veloce sbrigativo e funzionale
;<)
Cmq penso che qualche altra alternativa c'e'
--
ac

 Cmq penso che qualche altra alternativa c'e'
Mmmmm.......
Anche secondo Marco, che č intervenuto in questo thread, pare che non ci 
siano alternative.


 un finto gruppo inserendo una serie di button in una cornice.
Questo andrebbe bene se considerassi solamente le applicazioni che sono fatte 
da me.
Io, però, sto cercando di creare una piccola classe che mi permetta di definire 
esternamente degli SKIN (banali, semplici quanto vuoi) per poi applicarli 
alle form a runtime.
Mi piacerebbe riuscire nel mio intento per poi creare una libreria da passare 
anche agli altri del gruppo :-)


Ritengo che tu stia facendo un errore di fondo...!
In Access quando estisci Eventi non li gestisci sui singoli
controlli all'interno dell'OptionGroup, ma gestisci l'OptionGroup
stesso...!!!!
Quindi prova a partire da li dichiarando WithEvents l'OptionGroup....!
@Alex

Stai però facendo confusione....!
Ho capito benissimo il tuo intento ma tu devi partire da un approccio
corretto e non sbagliato..!
Ora se vedi i singoli controlli come Classi tutto ti deve funzionare, e
le
formatazioni grafiche devono andare, cosa ben diversa è per
gli eventi....!
Per questo devi discriminare se un controllo è un controllo associato
o meno, perchè se è un Associato, come nel caso della Label oppure
degli OptionButton inseriti nell'OptionGroup non dovrai istanziare una
Classe con WithEvents...!
Seconda cosa io ti consiglio di crearti per questo una classe dedicata
per ogni ControlType ed una proprio per quei controlli Associati che
non
generano Eventi...!!!
Credo invece che tu abbia tentato di crearti un'unica classe con dentro
dichiarati indiscriminatamente WithEvents i ControlType....!
Se vuoi fare una cosa come mi pare di aver capito, devi scordarti le
cose
semplici, e dare un'occhiata al mio demo complesso....!
Devi delegare il tutto ad una Classe(Madre) che poi gestirà le
Classi(Figlio)
o per Ereditarietà o per Polimorfismo....!
Andiamo sul sottile.........
Saluti
@Alex

 Quindi prova a partire da li dichiarando WithEvents l'OptionGroup....!
Infatti ho fatto cosě.
p.s.: grazie mille per i tuoi consigli


     OptionGroup.SpecialEffect = 0  ' piatto





Per cambiare l'aspetto dei singoli elementi via codice puoi farlo
direttamente:
  me.opzione10.specialeffect=...
o con un ciclo sull'insieme controls del gruppo:
  Dim ctl As Control
  For Each ctl In Me.gruppoopzione.Controls
    Debug.Print ctl.Name
  Next


 Andiamo sul sottile.........
A parte l'ereditarietà ed il polimorfismo, ho fatto proprio come dici. Ho 
una classe che si prende in carico la gestione della form e provvede ad istanziare 
le relative classi per i controlli.
Nelle form vere e proprie devo solo mettere il codice necessario per istanziare 
la classe form.


 Next
Nelle classi non ho il Me.


 Andiamo sul sottile.........
Aggiungo una cosa al precedente mio post.
Visto che hai tirato fuori ereditarietà e polimorfismo, sai dirmi se, come 
e qual'è il riferimento corretto per esporre una proprietà in una classe 
e renderla visibile anche alle classi instanziate da quella classe?


 Nelle classi non ho il Me.
Però sicuramente definirai un oggetto che punta al gruppo di opzioni, e
quindi puoi usare il suo insieme controls.


Approfitto della tua presenza in questo thread per chiederti se sai come 
poter aggiungere una proprietą in una classe, in modo tale che questa sia 
visibile anche alle classi da essa generate.
Mi spiego meglio.
Ho una classe form che istanzia una classe control.
Io vorrei aggiungere una proprietą pippo (in sola lettura) alla classe form, 
in modo che le classi control istanziate da essa possano utilizzare tale 
proprietą.
Sai se č possibile.


 
Io lo faccio implementando il Parent.
set oC = new myClass
set oC.Parent = me
xpippo = oC.dammiPippo
--
ac
---myclass
dim oPar as object
Property Set Parent(pX as variant)
	set oPar = pX
end Property
Property Get Parent() pX as variant
	set Parent = oPar
end Property
dammiPippo   (come property o function fa lo stesso)
dammiPippo = parent.pippo
end quello che e'

 Sai se è possibile.
Per creare una nuova proprietà usi le Property Let e Get, vedi help.
Nel tuo caso solo la Get così la proprietà sarà di sola lettura.
Per esempio nel codice della maschera:
  Property Get ciao() As String
      ciao = "Nuova proprietà 'ciao'."
  End Property
La puoi richiamare dai vari controlli sfruttando la proprietà parent, che
è già definita in tutti i controlli per accedere alla maschera che ha
istanziato la classe
  msgbox me.textbox10.parent.ciao
o la puoi richiamare da una classe generica di tipo control, alla quale
però deve essere assegnato un riferimento a un controllo con Set
  dim ctl as new control
  set ctl=me.textbox20
  msgbox ctl.parent.ciao
