VB6 - Richiamare classi interne al codice di un programma mediante l'o...

giovedì 15 novembre 2012 - 10.23
Tag Elenco Tags  VBScript

Osiride80 Profilo | Newbie

Ciao a tutti,
Ho creato un programma in grado di leggere file vbs esterni grazie all'oggetto scriptcontrol, e ho bisogno di richiamare delle classi interne al programma.

Facendo un banale esempio.. ipotizzando di avere una classe ObjAuto, nel codice interno del programma scriverò:

Script.AddObject "Auto", ObjAuto, True

dove Auto, all'interno del codice è già stato valorizzato nelle sue proprietà.

Ho inserito poi un richtextcontrol, in cui a programma avviato, passerò le istruzioni digitate in vbs tramite queste istruzioni:

With ActiveForm
.Script.AddCode .RtfScript.Text
.Script.Run "Main"
End With

Fino qui tutto bene, avvio il mio programma per digitare le mie istruzioni vbs, come ad esempio:

sub Main()
msgbox Auto.velocità
end sub

dove magari mi viene stampato.. 90 km/h

ora arriva LA MIA DOMANDA..

In un codice vb creo l'oggetto Auto cosi..

Dim Auto as ObjAuto
Set Auto = new ObjAuto

così potro anche creare un oggetto Auto1, Auto2 ecc..

Per fare la stessa cosa scrivendo codice vbs a programma avviato come devo fare? Mi spiego meglio..
Avendo aggiunto allo scriptcontrol l'oggetto Auto (a programma avviato e nella finestra vbs predisposta) protrò usarlo immediatamente come già esposto prima:

sub Main()
msgbox Auto.velocità
end sub

MA ricevo un errore nel caso in cui volessi creare un nuovo oggetto Auto con le seguenti istruzioni:

sub Main()
dim Auto1
set Auto1 = CreateObject("ObjAuto")
end sub

comparendo il messaggio: Il componente ActiveX non può creare l'oggetto: 'ObjAuto'

Allacciandomi a quando chiesto devo chiedere ancora una seconda cosa. L'oggetto Auto aggiunto allo scriptcontrol è stato preventivamente istanziato nel codice interno del programma per il quale è stata allocata della memoria, quindi reso immediatamente disponibile per essere richiamato da istruzioni vbs (a programma avviato). C'è invece un modo per istanziare l'oggetto da istruzioni vbs, in modo da allocarne memoria solo quando necessario e in tal modo poter anche dichiarare più oggetti Auto come chiedevo prima?

Spero di essere stato abbastanza chiaro nella spiegazione e ringrazio chi mi potrà aiutare.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

RISOLUZIONE DEL PROBLEMA TROVATA!

Visto che non me ne sto con le mani in mano e non mi arrendo, ma cerco di realizzare anche le cose che all'apprenza mi sembra di non riuscire a fare.. il problema si risolve agilmente creando una dll con gli oggetti che servono. La dll deve essere registrata tramite il comando regsvr32 "percorso della dll" da esegui.

Si aggiunge la dll come riferimento al progetto che si sta creando.

Mettiamo il caso che abbiamo creato una dll di nome Miadll.dll al cui interno c'è una classe MioOggetto che contiene le proprietà Get/Let per scrittura e lettura del del dato all'interno dell'oggetto.

Avviando il progetto a cui abbiamo aggiunto il controllo scriptcontrol.. dando per scontato che ci sia una textbox multilinea o un richtextbox, in cui digitare del codice vbscript, e un pulsante da premere per avviare il codice digitato, SI PUO' creare e distruggere l'oggetto che vogliamo usare (quello che fa riferimento alla nostra dll), cosa che non può avvenire se si aggiunge un oggetto da codice all'oggetto scriptcontrolo tramite l'istruzione AddObject. Quindi a questo punto è possibile procedere come si fa per un qualsiasi oggetto che si vuole creare e distruggere.

CREAZIONE OGGETTO

dim MioOggetto
set MioOggetto = CreateObject("Miadll.MioOggetto")

DISTRUZIONE OGGETTO

Set MioOggetto = Nothing

Questa è una cosa direi parecchio utile quando c'è bisogno di creare più istanze di un oggetto che ci possono servire per gli usi più disparati e che non si possono creare utilizzando un oggetto già creato da codice di un progetto vb e aggiunto allo scripcontrol mediante listruzione AddObject.

PROBLEMA RISOLTO.. se nessuno ha intenzione di aggiugere altro la discussione si può considerare chiusa.

Un saluto a tutti gli utenti!




Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5