Newsgroup: it.comp.lang.visual-basic
Titolo: Una Procedura come Argomento ad una Funzione o Sub

Vorrei poter inserire una funzione od una routine(Sub) come argomento ad
un'altra funzione o Sub, in modo che oltre a tutto quello che fa la Sub o
Func posso anche richiamare una particolare sub o Func ad Argomento.

 Func posso anche richiamare una particolare sub o Func ad Argomento.
In vb non si puo'.
Sistemato questo, vediamo le eccezioni:
1) si puo' passare l' indirizzo di una funzione ad una dll funzionale (NON
activex) esterna tramite l' operatore AddressOf;
2) ci si puo' inventare un' interfaccia che deve essere implementata dal
chiamante e passata come parametro alla funzione;
Ricordo di ave visto dell' altro, ma lo ricordo un po' hard (mi pare che
lavorasse con la vtable).
Ciao
Aldo

 chiamante e passata come parametro alla funzione;
scusa Aldo, forse dico cavolate, ma se non erro esiste una funzione di VB6
di nome CallByName. mi pare di averla intravista nell'MSDN.
sapresti illuminarmi?
--
Fibia "Sakamoto" FBI
URL: 
www.geocities.com/fibiafbi
E-Mail: 
fibi...@hotmail.com
ICQ UIN 63586057
Membro #25 delle Brigate Takahashi Sez. Sud

sapresti illuminarmi?
Dunque, rispondo a tutti:
CallByName() serve per richiamare una funzione/sub di un modulo di classe
(quindi anche form e usercontrols), in pratica metodi e proprietà.
E si possono richiamare per nome.
Credo sia stata introdotta con vb6 (insieme a una serie di "porcherie" sul
genere).
E' possibile anche chiamare una funzione passando il puntatore (AddressOf)
come argomento di una funzione (e sfatiamo questa convinzione che VB non usa
i puntatori! :)).
Come si fa?
E' più facile dirlo che spiegarlo.
Riprendo un mio post sullo stesso argomento di qualche mese fa:
--------
domenica 3 settembre 2000 8.52
Re: [?] Passaggio di funzioni come argomento ad altre funzioni
Sembrerà strano ma _è_ possibile!
ti serve
Public Declare Function CallWindowProc Lib "user32" Alias
"CallWindowProcA"(ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg
As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Function GetProcAddress(ByVal lpFunction As long) As Long
    ' sembra inutile, ma va usata così per ottenere l'indirizzo di una
funzione/sub:
    ' PA = GetProcAddress(AddressOf MyFuncOrSub())
    GetProcAddress = lpFunction
End Function
Function MyFuncOrSub(ByVal nOprandOne As Long, ByVal nOprandTwo  As Long,
ByVal param3  As Long,
ByVal param4 As Long) As Long
    MyFuncOrSub = <Something>
End Function
'e ora richiamiamo la funzione tramite il suo indirizzo:
lpFunction = GetProcAddress(AddressOf MyFuncOrSub)
ResultOfMyFunc = CallWindowProc(lpFunction, param1, param2, param3, param4)
l'unico limite (veramente pesante) è che MyFuncOrSub deve stare in un
modulo.
Aggiungo: puoi usare solo 4 parametri long, quindi se vuoi passare qualcosa
di complesso puoi dotarti di VarPtr(), StrPtr() ecc. per passare i puntatori
a variabili/stringhe differenti o a strutture Type
Ciao

Func posso anche richiamare una particolare sub o Func ad Argomento.
Vedi post a Fibia FBI qui sotto.
Ciao

 Vedi post a Fibia FBI qui sotto.
beh, io ce l'ho sopra :))


 >sapresti illuminarmi?
Grazie mille ALDO :)))
ma Zanna e' il tuo secondo nick?


ma Zanna e' il tuo secondo nick?
eheh, credo tu stia sbagliando persona.
Io mi chiamo Fabio.
E zanna è il mio 1^ nick
Ciao

 E zanna è il mio 1^ nick
Non l'hai capita...
avevo chiesto aiuto ad Aldo ma hai risposto tu. :))


avevo chiesto aiuto ad Aldo ma hai risposto tu. :))
eh, oggi non sto molto bene.
E comunque capisco poco già di mio :)
Ciao

 avevo chiesto aiuto ad Aldo ma hai risposto tu. :))
D'altra parte e' stato un bene, perche' non avevo mai pensato al giochetto
suggerito da Zanna. A essere onesto, l' ho guardato alla svelta, ma non l'
ho capito bene. Stasera faro' un po di prove.
Ciao
Aldo

genere).
si tratta di un'interfaccia OLE non precedentemente supportata (evidentemente
cercavano di far sembrare il Visual Basic qualcosa di solido e coerente -
c'ho messo un anno a capire che in realta' tutte le chiamate di funzioni
interne venivano fatte in quel modo barbaro che e' la CallByName...)

activex) esterna tramite l' operatore AddressOf;
modo sporco di fare un lavoro sporco: con CallWindowProc si puo' chiamare una
funzione che ha un massimo di quattro parametri
La dichiarazione che consiglio io personalmente e':
Declare Function CallByRef Alias "CallWindowProc" Lib "user32" _
( _
ByVal lpPrevWndFunc As Long, _
hWnd as Any, _
Msg as Any, _
wParam as Any, _
lParam as Any _
) As Long
la funzione da chiamare avra' questa forma:
Function myFunc( _
hWnd as Long, _
Msg as Long, _
wParam as Long, _
lParam as Long _
) as Long
End Function
l'As Any permette di passare alla funzione qualsiasi tipo di dato. Alla
funzione arriveranno solo i primi 4 byte (un Long occupa 4 byte). Per
recuperare gli altri (*se* ce n'e' altri), dovrete usare CopyMemory:
Function myFunc( _
hWnd as Long, _
Msg as Long, _
wParam as Long, _
lParam as Long _
) as Long
'Msg contiene in realta' non un long ma una struttura RECT (potrebbe anche
'essere, no? Il fatto che lo passiamo per riferimento ci assicura di
'stare lavorando sull'originale, e non su una copia su cui e' stato forzato
'il troncamento al quarto byte)
Dim myRect as RECT
'CopyMemory accetta tre parametri: indirizzo della destinazione, indirizzo
'della sorgente e numero di byte da copiare. In ogni caso sarebbe un'idea
'migliore passare il numero di byte come primo o secondo parametro di myFunc,
'ossia come wParam o lParam. Nel nostro caso siamo sicuri che si tratti di un
'RECT, quindi usiamo la lunghezza in byte della destinazione
CopyMemory VarPtr(myRect), VarPtr(Msg), Len(myRect)
End Function
...
Non e' possibile ricevere stringhe da programmi C/C++ in questo modo, non
direttamente. Esisteva una funzione in grado di convertire una stringa C/C++
(ossia, un semplice array di byte - si fa coincidere la fine della stringa
con il primo carattere ascii nullo incontrato - in VB il valore della
costante VbNullChar) in una stringa VB (ossia una stringa C/C++ con un
header, contenente essenzialmente un descrittore di 4 o piu' byte indicante la
lunghezza), ma sinceramente non so piu' dove la vidi
Come vedete comunque e' una brutta forzatura. Evitate di fare queste cose in
VB. Al massimo imparate un pochino di C/C++/Fortran/Delphi/Pascal e fatevi
una dll che lo faccia al posto del vostro programma

 ho capito bene. Stasera faro' un po di prove.
sull'MSDN c'e' un bellissimo articolo con qualche esempio,
purtroppo non funziona con VB5 :(((


 E comunque capisco poco già di mio :)
come tutti i programmatori...:))


 Func posso anche richiamare una particolare sub o Func ad Argomento.
se usi VB6 puoi usare CallByName
Ciao
Faber

 activex) esterna tramite l' operatore AddressOf;
non è proprio esatto... se la funzione che vuoi chiamare ha 4 argomenti
Long, puoi usare CallWindowProc
Ciao
Faber