Newsgroup: it.comp.lang.visual-basic
Titolo: Aiuto per sviluppo OCX OptionButton

Salve,
scusate se non sono stato esplicativo nel subject, ma avevo difficoltà
a sintetizzare la mia richiesta.
Sto sviluppando un ocx (OptionSh) , praticamente è finito ma mi ha
bloccato un problema che non riesco a risolvere.
Ecco il problema: se imposto la prorpietà OptionSh.Value = true tutti
gli altri controlli OptionSh compresi in un contenitore (un Form, un
Frame, una PictureBox etc etc)  dovranno settare la proprietà Value a
False (anche percè ne deve cambiare l'asoetto esteriore).
Ho pensato di usare un ciclo For each.....Next ma......
non so come riferirmi ad un controllo, in fase di progettazione
ovviamente, per modificarne la proprietà Value.
Insomma, sperando di essermi fatto capire, qualcuno ha una idea
(magari postando un pezzo di codice) di come modificare a false le
proprietà di tutti i controlli quando ne modifico una qualsiai a true?
Grazie
Robin

 proprietà di tutti i controlli quando ne modifico una qualsiai a true?
Dim ctl As Object
 For Each ctl In UserControl.Controls
   ctl.Visible = False
Next ctl
Ciao

> proprietą di tutti i controlli quando ne modifico una qualsiai a true?


 wrote:


Ma così non te lo fa su tutti?
Credo volesse farlo su tutti meno che su quello cliccato.
Mi sa che si dovrebbe controllare il name del controllo cliccato e
fare il ciclo proposto....
Cmq devo provare...
Ciao
Aran

 ha scritto nel messaggio
news:ahlhp9$5bd$1...@fe2.cs.interbusiness.it...

Ma così cambi le impostazioni dei controlli all'interno dello UserControl.
Secondo me lui vuole modificare i controlli 'gemelli' di quello a cui viene
cambiata la proprietà.
Occorre quindi fare riferimento al contenitore dello UserControl,
utilizzando la proprietà Extender del controllo.
A questo punto, si può fare riferimento alla collection Controls del
Container, facendo un for each, e verificando, per ogni controllo della
collection, che:
1) Il controllo sia di tipo OptionSh
2) Che il controllo non sia quello che sta agendo
Ovviamente occorre fare attenzione a ciò che gli usercontrol fanno sugli
altri quando viene impostata la loro proprietà a False, altrimenti si
scatena una catena di eventi.
Ciao
Alberto

 Ciao Robin
Secondo me è una cosa che ti conviene fare dal form.
Io creerei una matrice di controlli, poi quando una proprietà viene
modificata scorro tutti i controlli ocn un loop e imposto la proprietà a
false o true, a seconda dei casi, su tutti gli elementi tranne quello che è
stato modificato dall'utente.
Ciao

 2) Che il controllo non sia quello che sta agendo
Ma quanto non si smette mai di imparare!
Giuro che pensavo non fosse possibile...
Che stupido!
Ciao

 Giuro che pensavo non fosse possibile...
Piccolo esempio:
Cliccando un commandbutton dello UserControl, tutti i commandbutton del form
contenitore vengono visualizzati o nascosti.
Private Sub Command1_Click()
    Dim CTL As Object
    For Each CTL In UserControl.Extender.Parent.Controls
        If TypeName(CTL) = "CommandButton" Then CTL.Visible = Not
CTL.Visible
    Next CTL
End Sub
Esiste tuttavia una grossa serie di problemi nell'utilizzo di extender.
Nell'esempio sopra, per citare un classico, se l'OCX viene utilizzato in
contenitori che non espongono la proprietà Controls, occorre intercettare
l'errore.
Del resto, quello che Robin vuole fare è una cosa 'estrema', nel senso che
vuole cambiare la proprietà di un oggetto che sta eseguendo per conto suo,
che potrebbe essere in un contenitore che non consente collegamenti fra due
OCX, che ci potrebbero essere problematiche nel contenitore stesso al
variare di questa proprietà.
In linea di principio, uno UserControl non dovrebbe mai intervenire su altri
elementi dell'insieme Contenitore+Controlli, che non siano se stesso. Quando
ciò è assolutamente necessario, occorre predisporre il codice per
l'intercettazione degli errori che potrebbero dipendere dal tipo di
contenitore.
Ciao
Alberto

Albe devo dire che ci sei vicino, hai capito grosso modo il mio
problema che tento di spisgare ulteriormente, se mi permette.
Visto che programmate in VB create un nuovo progetto normale e
inserite all'interno
1) un Frame1 con tre Option1- Option2- Option3
2) Una picture con dentro tre Option4- Option5- Option6
3) Liberi sul Form Option7- Option8- Option9
4)Su un Altro frame2 o su picture2: Option10(0)- Option10(1)-
Option10(2) (Option con Indici)
Orbene, sia in fase di progettazione sia in fase di RunTime se
attivate a true una Prop. Value di uno dei tre pulsanti di qualunque
gruppo le altre in automatico vengono settate a false, e cosa più
importante se viene cambiata a true la proprietà di un Option di un
gruppo, vengono interessati solo gli altri due dello stesso gruppo che
cambiano a false ma gli altri delgi altri gruppi non vengono toccati.
In ultima analisi per ogni gruppo solo un Option può essere true e
tutti gli altri devono essere false.
Ora io sono a questo punto: riesco a settare a true la proprietà value
con un ciclo simile a quello sotto  solo che ho due problemi.
Private Sub Command1_Click()
    Dim CTL As OptionSh
    For Each CTL In Parent.Controls
	if CTL.name <> Extender.Name then
	   Ctl.Value = false
	end if	
    Next CTL
End Sub
1) Non riesco a far fare il ciclo limitato ai soli controlli di un
gruppo (es. frame o picture o Form) ma il controllo avviene per tutti
i controlli contenutti in tutto il form. 
2) Dato che controllo la propr. NAME nel caso di controlli con indice
tutti i controlli vengono settati a true in quanto pur essendo diversi
hanno lo stesso nome (almeno il nome Extender è uguale: sembrerà
strano) 
In ogni caso mi serve un controllo option che sia Flat e che possa
colorarsi a tipo Shadow (procedure che ho già scritto) e quindi devo
ricreare un vero e proprio OptionButton ma flat, stavolta.
Ciao e scusate la prolissità
Robin


 ha scritto nel messaggio
news:518uju8uht1arngio...@4ax.com...

... A quest'ora senza provare suggerisco di modificare il tuo ciclo testando
oltre che il NAME anche la proprietà INDEX che lo usercontrol dovrebbe
esporre
e quindi ciclare con eventuali controlli di errori per settare
a false quello non attivo
Acia

 strano)
1) Per ogni controllo, verifica che 
CTL.Parent.Name
 sia uguale al name del
form, o del frame, ecc...
2) Credo basti testare CTL.Index
Ciao
Alberto

 ricreare un vero e proprio OptionButton ma flat, stavolta.
Non sono al corrente di tutte le necessità del tuo applicativo, ma sei
sicuro che con un OptionButton normale non si riesca a fare quello che ti
serva?
Sfruttando Style, Appearance, Picture e Enabled, ci si gioca parecchio.
Ciao
Alberto


Un Option Flat button mi serve per creare un'interfaccia omogenea nel
mio programma, visto che ho dei controlli, creati da me e che do
volentieri, anche il sorgente (leggi qualche post fa: Ripropongo i
miei controlli free) .
Per cui mi serviva ricreare degli optionButton personalizzati simili a
FlatButton da me creati.
Comunque ho risolto:
1) Cerco il contenitore, come?  
	Dim Ctl as Object, Contenitore as string
	Contenitore = Ctl.Container   (Semplice no? :-))
 
2) Ricavo per ogni controllo l'Handle e lo confronto con quello
extender facile no? (dopo ore di prove però)
Se il contenitore del CTL è uguale  a quello Extender allora si tratta
dello stesso contenitore del Option su cui ho cliccato, se poi l'Hwnd
del CTL è uguale all'Hwnd dell'extender allora si tratta dello stesso
pulsante, quindi a tutti quelli che hanno un Hwnd diverso do
Value=false.
Spero di essermi spiegato.
Se interessa il codice (che non ho sottomano perchè sono su un altro
pc) posso spedirlo.
Ciao
Robin