Newsgroup: it.comp.lang.visual-basic
Titolo: Quesito su DLL

Ho realizzato un programma exe che richiama delle dll create da me in VB.
Adesso ho questo problema: le dll contengono delle form con griglie di dati
, facendo doppio click su una riga, mi si dovrebberero alimentare i TextBox
del programma che li ha richiesti.
In pratica la dll dovrà restituire dati all'exe e non so da dove
cominciare... chi mi da un suggerimento?
Grazie anticipatamente.

 ha scritto nel messaggio
news:MtKc8.2163$5e4.1...@news2.tin.it...
| Ho realizzato un programma exe che richiama delle dll create da me in VB.
| Adesso ho questo problema: le dll contengono delle form con griglie di
dati
| , facendo doppio click su una riga, mi si dovrebberero alimentare i
TextBox
| del programma che li ha richiesti.
questi dati sono statici o dinamici? mi spiego
meglio: la struttura della griglia e' sempre la stessa
o cambia di volta in volta?
se fosse nel primo caso non puoi esporre delle
proprieta'? o meglio magari inglobare una classe
nella dll...
all'exe non resta che fare
mioexe.txtCampo(0) = dll.propreita1
mioexe.txtCampo(1) = dll.propreita2
ecc...
oppure nel caso di + tabelle diverse con la classe
che si occupa del dialogo tra form-griglia ed
esportazione dati all'esterno
mioexe.txtCampo(1) = dll.cTabella1.propreitaABC
mioexe.txtCampo(21) = dll.cTabella2.propreita2
-- l'idea della classe messa cosi' fa pena cmq
   se hai capito non e' malaccio se la sistemi.
nel caso la struttura sia invece dinamica al momento
non mi viene in mente un bel niente :(

dimenticavo... devi generare anche un evento, ok!?

Innanzi tutto grazie per la risposta.
Forse mi sono spiegato male, ma è la Dll che deve restituire valori alla
form del progetto EXE (se si può fare)
Non devo essere io che dall'exe leggo le proprietà della classe sulla Dll
(così lo avevo già fatto, esattamente come l'esempio che mi hai proposto)
Ciao.
"Fustino di Dixan" <acer...@penguinAtWork.it> ha scritto nel messaggio
news:a4vtsq$25lt$1...@phobos.ibnetwork.net...


 ha scritto nel messaggio
news:tcLc8.2338$3s4....@news1.tin.it...
| Innanzi tutto grazie per la risposta.
| Forse mi sono spiegato male, ma è la Dll che deve restituire valori alla
| form del progetto EXE (se si può fare)
| Non devo essere io che dall'exe leggo le proprietà della classe sulla Dll
| (così lo avevo già fatto, esattamente come l'esempio che mi hai proposto)
umh, allora chiedo scusa.
ma la dll da chi e' instanziata? dall'exe no?
io non sono molto ferrato ma sel sul doppioclick
della tua dll generi un evento al tuo exe basta
farsi le sue cose li dentro: leggi le proprieta' e
buttale dove ti servono.
non capisco come faccia una dll a buttare dei dati
in un form di cui non conosce nulla anche perche'
e' figlia...
non so aiutarti :(

 ha scritto nel messaggio
news:MtKc8.2163$5e4.1...@news2.tin.it...

Immagino che tu sottintenda "senza che si chiuda la finestra", altrimenti la
soluzione e' banale.
Per fare una cosa del genere devi definire un evento nella classe pubblica
che gia' utilizzi come interfaccia tra l'eseguibile e la dll
Passo 1:
Supponendo che le finestre della dll siano invocate dall'exe attraverso un
metodo ShowForm(), devi assicurarti che queste ultime ricevano l'istanza
corrente della classe (il perche' lo vediamo dopo).
Per fare cio' il metodo deve somigliare a questo:
Public Sub ShowForm()
Dim DLLForm As Form1
Set DLLForm=New Form1
Set DLLForm.ObjParent = Me
DLLForm.Show vbModal
End Sub
devi aggiungere di conseguenza la property ObjParent in Form1, quindi nelle
dichiarazioni generali usa
Private m_ObjParent As MyClass
e, sempre nella finestra, definisci una property
Public Property Set ObjCaller(obj As MyClass)
Set m_ObjParent = obj
End Property
Passo 2: definire un evento di notifica
Nelle "general" della classe dichiara
Public Event Notify (ByVal strData As String)
e aggiungi anche un metodo, che serve alle finestre *interne* per segnalare
un aggiornamento al programma *esterno*
Friend Sub SendNotification (ByVal strData As String)
'Friend dovrebbe essere sufficiente, dato che il
'metodo viene invocato solo da moduli della dll, ma anche
'public va bene
RaiseEvent Notify(strData) 'scateniamo l'evento sul client
End Sub
Passo 3: scateniamo le notifiche nelle finestre della DLL
In tutte le form della DLL, adattate come al passo 1, ogni volta che hai
bisogno di innescare il meccanismo di notifica esegui semplicemente
m_ObjParent.SendNotification "<le informazioni che vuoi>"
e l'evento Notify verra' scatenato sull'istanza corrente.
Passo 4: adattare i client
Le modifiche alla DLL sono finite, ora pero' ci serve che i programmi client
gestiscano l'evento di notifica suddetto.
Nella form di partenza, dichiara quindi un istanza della classe nella
sezione generale (questo e' necessario, non funziona con istanze interne a
routine) abilitando la gestione dei suoi eventi.
'nota la parola chiave WithEvents
Private WithEvents MyObject As DLL.MyClass
vedrai che nella finestra dell'editor di codice, nel combo degli oggetti e'
apparso MyObject, selezionando il quale trovi il nostro evento Notify... ti
appare cosi':
Private Sub MyObject_Notify(ByVal strData As String)
tutto quello che devi fare e' scrivere il codice relativo; ora attivando le
form della dll con MyObject.ShowForm(), ogni volta che quest'ultima usera'
internamente il metodo SendNotification, verra' attivato l'evento qui sopra,
con i dati richiesti nel parametro strData
A questo punto forse hai capito il perche' del primo step; il meccanismo
funziona a dovere se le due finestre, quella del client e quella interna
alla dll, hanno accesso alla medesima istanza di oggetto, in modo che la
notifica scatenata da un lato corrisponda all'evento gestito dall'altro.
Buon lavoro
P.S. se ora mi dici "ma a me andava bene anche che si chiudesse chiudesse la
form" mi impicco con il filo del mouse...
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

"Luca Dormio" <lucaFaV...@tinFaVa.it> ha scritto nel messaggio
news:a509lg$6ro$1...@fe1.cs.interbusiness.it...
|
[ Tante belle cose ]
...
eh, molto in dettaglio ma e' quello che +o- intendevo
dire nel "mio linguaggio NONItaliano" :)
CIAUZZZZZZZ

Grazie per il codice che mi hai postato, appena ho 2 minuti provo il tutto e
ti faccio sapere. Però mi hai messo addosso una curiosità... se la finestra
si deve chiudere  (non ti impiccare!!!) cosa cambia nel codice e perchè?
Ciao, Vincenzo

 ha scritto nel messaggio
news:VBQc8.245$_u5....@news1.tin.it...

credo nulla di sostanziale ma allora il giochetto
per passare *parola* con il raiseevent e la classe
a me sembra sprecato... questo per l'esperienza che
ho io. posso anche sbagliarmi.

 ha scritto nel messaggio
news:VBQc8.245$_u5....@news1.tin.it...

Troppo darti, sto gia' penzolando nel vuoto... ;-)
In questo caso, pur essendo del tutto valido il discorso fatto sopra, puoi
pero' risolvere molto piu' semplicemente, se la tua form e' modale (e lo e'
per forza visto che la chiami da una dll)...
Si riduce tutto a questo:
Nella finestra, laddove prima uscivi con un 'Unload Me', fai in modo di
uscire con 'Hide', il metodo della classe diventa:
Public Function ShowForm() As String 'ora e' una funzione
Dim DLLForm As Form1
Set DLLForm=New Form1
DLLForm.Show vbModal
ShowForm = DLLForm.<controllo>.<property>
'Dove <controllo> e' la tua griglia con i dati da restituire e <property>
'e' la proprieta' con quello che ti serve
'Siccome la form e' stata solo nascosta, la scarichiamo adesso
Unload DLLForm
Set DLLForm = Nothing
End Function
La differenza e' che prima il codice della DLL era bloccato sull'istruzione
DLLForm.Show e il codice dell'EXE sulla chiamata al metodo ShowForm... non
potevi eseguire nessun aggiornamento se non tramite un evento asincrono; in
questo caso invece il codice rientra quando chiudi il form, puoi restituire
il valore come risultato della funzione e il programma chiamante lo riceve
per l'appunto con un semplice
Result = MyObject.ShowForm()
Ciao
