Creazione di un evento

lunedì 15 marzo 2010 - 13.17

boc_babi Profilo | Junior Member

Buongiorno,
volevo sapere se è possibile creare un evento per una routine da me creata.

Per esempio, vorrei che la Sub Contatore() mi generasse un evento al raggiungimento di un certo valore di "cnt". Questo è solo un esempio per capire se c'è la possibilità o meno. E' logico che potrei settare una variabile a TRUE al raggiungimento di tale valore, ma non mi servirebbe a capire quanto sopra.

Private Sub Contatore()
...
If Var = True Then
cnt += 1
End If
...
...
End Sub

E' inoltre possibile che la Sub Contatore() sia perennemente richiamata ? Se si, come faccio a richiamarla in continuazione senza fare uso di timer ?

Grazie, BOC

AntCiar Profilo | Expert

Ciao.

Per creare un evento basta fare

Public Event EventoContatore()

nella tua classe. Nelle parentesi puoi eventualmente anche passare dei valori come fai con una normale sub.

Poi devi dichiararti un metodo delegato del tipo:

Private Function delegatoEventoContatore() .... End Function

(Se nella dichiarazione dell'evento passi dei parametri, devi usare la stessa firma in questo metodo)

Per metterti in ascolto dell'evento basta scrivere:

AddHandler EventoContatore, subEventoContatore()

Poi nel tuo codice quando devi invocare l'evento basta scrivere:

RaiseEvent EventoContatore()


Per quanto riguarda il secondo quesito, o lasci il timer oppure metti tutto in un ciclo while. Questa seconda opzione potrebbe mandarti in overflow lo stack delle chiamate. Io preferirei utilizzare il timer.

Ciao
Cristian Barca

boc_babi Profilo | Junior Member

Grazie della risposta Cristian.

Quindi non è possibile creare una Sub come potrebbe essere quella del click di un pulsante (quì sotto), che in teoria tiene sempre monitorato il fatto che venga premuto o meno il pulsante ?

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
...
End Sub

Scusa ma sono un pò confuso ....

Ciao e grazie ancora, BOC

AntCiar Profilo | Expert

Ciao.

Certo che si può fare. Si tratta della

Private Function delegatoEventoContatore()
....
End Function

scritta nel mio messaggio.

Se il tuo evento è creato in una classe specifica, allora quando la usi utilizza il suffisso WithEvent oltre a public o private.

Esempio:


public Class MyClass

public event MioEvento()

end Class






public class Form1

public WithEvents mc1 as MyClass = new MyClass ()


private sub MV() Handles MyClass .MioEvento
.........
end sub

end class


ciao
Cristian Barca

boc_babi Profilo | Junior Member

Scusa ma sono un pò tardo; spero tu abbia ancora un attimo di pazienza:

Il codice quì sotto è tratto dall'MSDN

Sub TestEvents() Dim Obj As New Class1 ' Associate an event handler with an event. AddHandler Obj.Ev_Event, AddressOf EventHandler ' Call the method to raise the event. Obj.CauseSomeEvent() ' Stop handling events. RemoveHandler Obj.Ev_Event, AddressOf EventHandler ' This event will not be handled. Obj.CauseSomeEvent() End Sub Sub EventHandler() ' Handle the event. MsgBox("EventHandler caught event.") End Sub Public Class Class1 ' Declare an event. Public Event Ev_Event() Sub CauseSomeEvent() ' Raise an event. RaiseEvent Ev_Event() End Sub End Class

Effettivamente il codice genera un evento, ma devo in continuazione richiamare la Sub TestEvents()

Quello che vorrei è che la Sub TestEvents() non debba essere in continuazione richiamata, ma vorrei che venisse richiamata automaticamente quando l'evento viene scatenato.

E' possibile ?

Grazie in anticipo

AntCiar Profilo | Expert

Ciao.

La tua domanda prevede il SI/NO come risposta.

Penso che tu non hai afferrato bene il concetto di evento e del codice che hai postato. In pratica dentro una classe tu puoi crearti un evento che serve a far capire a chi "sta in ascolto" che è successa una determinata cosa.


Public Class Class1 ' Declare an event. Public Event Ev_Event() ''Dichiarazione dell'evento Sub CauseSomeEvent() ' Raise an event. RaiseEvent Ev_Event() ''Invocazione dell'evento End Sub End Class

In questa classe praticamente la Sub 'CauseSomeEvent' quando viene richiamata scatena l'evento 'Ev_Event'. Ora questo evento può essere ascoltato da una, due, N ascoltatori oppure da nessuno.

Nella tua classe utilizzi una istanza di 'Class1'. Dopo che hai dichiarato l'oggetto di tipo 'Class1' ti metti in ascolto del suo evento 'Ev_Event', dicendogli di utilizzare la TUA sub chiamata 'EventHandler' quando Class1 scatena l'evento 'EV_Event' (ti sei messo in ascolto dell'evento)

Sub TestEvents()
Dichiari e inizializzi un oggetto di tipo Class1
Dim Obj As New Class1

' ti metti in ascolto dell'evento e gli dici quale delle tue sub deve utilizzare quando si scatena l'evento (in gergo tecnico stai definendo un delegato)
AddHandler Obj.Ev_Event, AddressOf EventHandler

A questo punto quando la Class1 scatena l'evento 'Ev_Event' il codice andrà ad eseguire quello che c'è nella tua sub definita come delegato.
La chiamata che segue serve a far scatenare l'evento. Se esegui passo passo mettendo un punto di interruzione sulla sub 'EventHandler' vedrai che l'esecuzione del codice si sposta nella sub subito dopo invocata la linea seguente. L'evento in questo caso lo scateni tu stesso richiamando la linea di codice che segue ma nulla ti vieta che l'evento lo possa scatenare la class1 stessa. Ad esempio se in class1 metti un timer che dopo due minuti dall'inizializzazione invoca l'evento, la tua applicazione resta ferma edopo due minuti ti entra nella sub "EventHandler".
Obj.CauseSomeEvent()

' Qui rimuovi l'ascolto dell'evento. Lo devi fare ogni qualvolta vuoi che nonostante l'evento in Class1 si scatena, tu non vuoi ripercussioni nella tua classe
RemoveHandler Obj.Ev_Event, AddressOf EventHandler End Sub Sub EventHandler() ' Handle the event. MsgBox("EventHandler caught event.") End Sub

Alla luce di questo e soprattuto del codice che hai scritto nella tua applicazione e al comportamento che deve avere, trai l'opportuna risposta.
ciao ciao
Cristian Barca

boc_babi Profilo | Junior Member

Che dire ? E' sufficiente un grazie ?
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