Newsgroup: it.comp.lang.visual-basic
Titolo: Istanziare OCX a runtime

Ciao a tutti,
vorrei sapere se è possibile istanziare un OCX a runtime.
Cioè vorrei non metterlo nei riferimenti del progetto, e poi caricarlo con
una ruotine di gestione errore.
Questo perchè svariati clienti non hanno l'ocx installato, quindi volevo
tentare di caricarlo solo per chi lo vuole. E anche fare un pacchettino di
installazione diventerebbe complicato, non tutti gli utenti sono
Administrator.
Si può fare una cosa del genere?
Dim o As Object
Set o = CreateObject("controlresizer.ocx")
L'ocx in questione è per il resize delle form, e farebbe tutto automatico.
Così mi da errore "Il componente ActiveX non può creare l'oggetto."
Non basta mica metterlo in App.Path vero?
Grazie a tutti

 Set o = CreateObject("controlresizer.ocx")
Innanzitutto non hai passato un parametro corretto a CreateObject.
Avrebbe dovuto essere il ProgID della classe da creare, ossia qualcosa del tipo
<nomelibreria>.<nomeclasse> (es. "ADODB.Recordset").
Seconda cosa, se devi creare un *controllo* a runtime, CreateObject non è la
funzione giusta.
In un form, dovresti usare Controls.Add <ProgID>, <Nome controllo>[,
<Container>]
Dai un'occhiata qui:
http://support.microsoft.com/kb/q190670/
Bye
Raf
-----------------------------------------------------
Funk: cooler than the other side of the pillow.

 <Container>]
Nel frattempo ho trovato la funzione giusta, come hai poi indicato :)
 Set Res = Controls.Add("controlresizer.autoresizer", "ResX", Me)
Unica cosa questo componente fa un popup, quando viene attivato in fase di
progettazione. Facendo cosě lo fa anche da eseguibile...
Ora smanetto un pochino :)
Tnx

 Non basta mica metterlo in App.Path vero?
No, l'ocx deve essere sicuramente registrato.
Comunque è meglio attivare un filtro nel codice, non nel sistema.
Anche se presente nei riferimenti l'ocx viene cercato solo nel momento in 
cui si fa accesso a una delle sue classi.
Il sistema della CreateObject va bene nel caso di plugin che possono esserci 
o no sul sistema, oppure se devi sorpassare alcuni problemi di compatibilità 
binaria.
Ciao 

 binaria.
 Set Res = Controls.Add("controlresizer.autoresizer", "ResX", Me)
Questo fungeva, ma faceva un popup come in fase di progettazione, e non
andava bene :)
Ora ho tirato giù la classe che c'è sul sito comune, e pare funzionare
bene.
La sto adattando per le SSTAB (casi nei quali non funge), e per fare un
minimo di resize dei font.
Sembra funzioni in maniera analoga all'OCX, come risultato grafico.
Comunque non sono grandi modifiche, per l'SSTAB è tipo
If .Left < 0 Then m_Controls(i).OriginalLeft = .Left + 75000    
Infatti la SSTAB sposta la Left di -75000 rispetto alla left reale, dei
panel non visualizzati. Uso 0, ma magari è meglio mettere un valore
inferiore se uno sposta oggetti fuori dalla form volutamente...
Ora volevo fare un algoritmo di FontResize.
Per ora ho usato la % di variazione della Width
.Font.Size = m_Controls(i).OriginalFontSize * WidthChange
Ma se i progetti sono a 800*600, oltre un certo valore è bene non crescere,
basta impostare una variabile MaxSize o roba simile. Trall'altro ora non
tiene conto della variazione di altezza, ma mi può andar bene :)