Newsgroup: it.comp.lang.visual-basic
Titolo: Controlli activex e DoEvent

Sono ancora nella fase di stesura di sub e function, per ora non ho ancora
impostato la nuova classe del controllo che gestira' il tutto.
Adesso pero' mi trovo a dover progettare certi aspetti del futuro controllo
per poter impostare il tutto nel modo migliore.
Il problema e' che questo controllo avra' dei metodi che potrebbero
richiedere un tempo di elaborazione considerevole (alcuni minuti in certi
casi)
L'idea di avere un controllo che blocca tutto durante l'esecuzione non mi
piace molto e allora pensavo correre al riparo con alcuni accorgimenti.
Una proprieta' che mostra la percentuale di lavoro in corso, un metodo
.break per permettere all'applicazione di interrompere l'esecuzione in
corso, e poi chiamate a doevent per dare la possibilita' di gestire gli
elementi sopra descritti.
Solo che adesso ho qualche dubbio.
Funzionera' doevent in un controllo? Gestisce gli eventi  del form
contenitore o solo quelli del controllo stesso?
Avevo anche pensato di usare un approccio diverso: una sorta di funzione
callback che il controllo avrebbe chiamato ad intervalli regolari durante
l'elaborazione.
Da quello che ho capito pero' non e' possibile avere un proprieta contenente
un addressof di una funzione.
O forse si puo' averla ma poi non posso usarla.
Non so che fare, cosa mi consigliate?
Pensavo anche alla generazione di un evento al posto della callback ma non
vorrei fosse una cosa troppo complicata.
Poi ho anche pensato sull'opportunita' di creare un exe activex piuttosto
che un controllo.
Qualcuno puo' dirmi se un exe ActiveX funziona in modo asincrono rispetto
all'applicazione client?
Ossia se nel form io ho una chiamata del metodo come questa:
call DbxManager.SearchText(OE_SEARCH_SUBJECT, MexSearch)
il controllo passa alla riga successiva subito mentre il controllo con un
task a parte fa la sua elaborazione?
E se non e' cosi' allora che differenza c'e' tra controlli e exe activex?
Qualcuno puo' darmi qualche consiglio?
grazie
Paolo B.

 piace molto e allora pensavo correre al riparo con alcuni accorgimenti.
[SNIP]
Ciao Paolo,
la cosa piu' semplice dovrebbe proprio essere la creazione di un evento, in
questo modo puoi gestire in un colpo solo sia l'avanzamento del tuo processo
che eventualmente l'interruzione forzata da parte del client del tuo
controllo; nota che questo va fatto sia con un controllo ActiveX sia con un
eseguibile ActiveX, in quanto l'esecuzione dei metodi e' di norma sincrona.
l'implementazione di un metodo sincrono ma con evento di notifica non e'
nemmeno troppo complicata, ad esempio:
'Il controllo utente
'il primo e' l'evento di avanzamento, il secondo quello di completamento;
'nota nel primo il parametro ByRef, che servira' al client nel caso voglia
'segnalare l'interruzione prematura
Public Event OnProgress(ByVal Percentage As Long, ByRef Cancel As Boolean)
Public Event OnComplete(ByVal Percentage As Long, ByVal Cancelled As
Boolean)
Public Sub LongMethod()
Dim i As Long, FlagCancel As Boolean
Dim dummy As Single
For i = 1 To 100000
    dummy = Timer   'una qualunque operazione
    If i Mod 1000 = 0 Then
        'ogni 1000 iterazioni notifichiamo l'avanzamento
        RaiseEvent OnProgress(i \ 1000, FlagCancel)
    End If
    'se il client ha modificato il flag allora usciamo subito
    If FlagCancel Then Exit For
Next
'notifichiamo il completamento specificando la ragione
'(Cancelled) e il punto raggiunto
RaiseEvent OnComplete(i \ 1000, FlagCancel)
End Sub
'nell'applicazione client:
'una form con un Command, una ProgressBar
'e un'istanza del tuo controllo
Private Sub Command1_Click()
ProgressBar1.Min = 0
ProgressBar1.Max = 100
ProgressBar1.Value = 0
UserControl1.LongMethod
End Sub
Private Sub UserControl1_OnComplete _
 (ByVal Percentage As Long, ByVal Cancelled As Boolean)
If Cancelled Then
    MsgBox "processo interrotto al " & Percentage & "%"
Else
    MsgBox "processo completato"
End If
End Sub
Private Sub UserControl1_OnProgress _
 (ByVal Percentage As Long, Cancel As Boolean)
ProgressBar1.Value = Percentage
DoEvents
'rimuovi il commento per simulare un'interruzione
'If Percentage = 83 Then Cancel = True
End Sub
se poi volessi rendere il metodo iniziale asincrono dovresti spostare la
procedura in un controllo o una funzione timer (API SetTimer) in modo da
uscire subito da LongMethod ed eseguire la procedura reale alcuni istanti
dopo; il metodo di notifica ad eventi rimane comunque invariato.
Vedi un po' se ne ricavi qualcosa...
Ciao
--
Luca Dormio
luca....@tin.it


Ti ringrazio davvero di cuore, ho salvato tutto e mi servira' sicuramente.
ciao e grazie ancora
Paolo B.