Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: guiodic - 20 Febbraio 2009, 08:34:08

Titolo: Creazione eventi
Inserito da: guiodic - 20 Febbraio 2009, 08:34:08
Salve, mi sono imbattuto in una difficolatà riguardo la creazione di eventi in una classe.

faccio un esempio

Codice: [Seleziona]

'Gambas class file

'NOME: ESEMPIO

EXPORT

EVENT cinquanta()

PUBLIC SUB Conta()
  DIM i as INTEGER

  FOR i=1 TO 100
    WAIT 1
    if i=50 THEN RAISE cinquanta
  NEXT

END



Poi in Fmain..

Codice: [Seleziona]
PUBLIC es AS ESEMPIO

PUBLIC SUB MAIN()

  es = NEW ESEMPIO as "es"
  es.Conta()

END

PUBLIC SUB es_cinquanta()

 PRINT "Sono arrivato a Cinquanta"

END


ma es_cinquanta() non viene mai eseguita.... neppure chiamandola esempio_cinquanta...

Che cosa sbaglio?
Titolo: Re: Creazione eventi
Inserito da: Ceskho - 20 Febbraio 2009, 13:02:59
scrivi semplicemente

Codice: [Seleziona]
cinquanta()
Titolo: Re: Creazione eventi
Inserito da: md9327 - 20 Febbraio 2009, 14:56:29
Ehehehe, la risposta di ceskho è sicuramente di una semplictà unica, e funziona anche... :-)

Scherzi a parte, l'amico guiodic ha provato ad utilizzare la sintassi EVENT, e quindi la dichiarazione di una funzione evento, come descritto nella doc di Gambas.
La cosa non ha funzionato, perchè in effetti non si è ancora ben capito come debba essere utilizzata (altro esempio di scarsa documentazione...). E' parecchio che ci provo anche io e, nonostante abbia letto anche i sorgenti in C++ di Gambas, non sono riuscito a venirne a capo. Anche nel forum ufficiale on ho trovato alcun riferimento.
L'unico Raise che funziona è quello della classe statica Error, ma è un'altro paio di maniche.

Ritornando alla soluzione, ti consiglio di seguire quella di ceskho!

Bye
Titolo: Re: Creazione eventi
Inserito da: guiodic - 20 Febbraio 2009, 17:01:55
tra l'altro ho anche visto dei sorgenti dove si faceva così... boh...
Forse può essere creato un evento solo in corrispondenza di eventi di oggetti appartenenti a classi già nel linguaggio... non so.

comunque ovviamente quella di cesko è simpatica ...

Ho provato pure a richiamare una sub di FMain dalla classe (a sua volta richiamata da Fmain), non sembra che Gambas la pigli bene ...
Titolo: Re: Creazione eventi
Inserito da: Ceskho - 20 Febbraio 2009, 17:03:52
Guardate che io non stavo scherzando...era la mia risposta vera quella...

funziona giusto?
Titolo: Re: Creazione eventi
Inserito da: guiodic - 20 Febbraio 2009, 17:30:47
Nel caso semplice forse sì.

Ma nel mio programma no, se provo a mettere al posto di RAISE evento qualcosa tipo

FMain.Cinquanta()

mi dice che l'oggetto ESEMPIO è nullo...
Titolo: Re: Creazione eventi
Inserito da: Ceskho - 20 Febbraio 2009, 17:32:10
Infatti non devi scrivere nulla prima. Devi dare il comando semplice.

cinquanta()

e poi non dovrebbe essere conta() ad essere richiamato? Boh!!
Titolo: Re: Creazione eventi
Inserito da: leo72 - 21 Febbraio 2009, 00:27:06
Effettivamente sembra che la gestione degli eventi sia al momento limitata agli oggetti (grafici?) precostituiti di Gambas.
Titolo: Re: Creazione eventi
Inserito da: md9327 - 23 Febbraio 2009, 10:52:33
Infatti, nelle mie precedenti prove, ero riuscito a scrivere qualcosa, senza errori di compilazione ma, semplicemente non funzionava...

Nella doc, la sintassi sembra molto semplice, anche se il piccolo esempio riportato non dice proprio nulla (era meglio che non mettevano proprio...).
Eppure, non funge...

Comunque, a parte il fatto che gestire eventi creati ad-hoc può essere molto utile, per ora quello che funziona è la chiamata diretta di un metodo.
Titolo: Re: Creazione eventi
Inserito da: vuott - 10 Marzo 2012, 05:56:25
Poiché è passato molto tempo (dal 2009 !) dall'inserzione di questo messaggio, e poiché può essere ancora oggetto di lettura da parte degli utenti di questo forum, ed affinché non si generino dubbi ed incertezze sul funzionamento di Event e Raise, vorrei semplicemente segnalare che ora nell'esempio fatto da guiodic la sollevazione dell'evento funziona regolarmente.

Ho un po' modificato l'esempio di guiodic come segue:

Scriveremo nella classe principale FMain.Class:
Codice: [Seleziona]
' Gambas class file

Public es As ESEMPIO

Public Sub Form_Open()

  es = New ESEMPIO As "es"

' viene chiamata la sub-routine 'conta' nella classe secondaria "ESEMPIO.class":
  es.Conta()

End


' se sollevato l'Evento "cinquanta" nella classe secondaria,
' si scatena questa sub-routine, e le viene passato un valore Integer:
Public Sub es_cinquanta(num As Integer)

 Print "Sono arrivato a " &  num & " !"

End


nella classe secondaria "ESEMPIO.Class":
Codice: [Seleziona]
Export

' viene dichiarato l'Evento ed assegnato il nome "cinquanta"
' ed un parametro Integer:
Event cinquanta(ev As Integer)

Public Sub Conta()
  Dim i As Integer

  For i = 1 To 100
    Wait 1
    Print i

' se la variabile i = 50, allora viene sollevato l'Evento,
' che scatenerà la sub-routine "es_cinquanta(num As Integer)"
' presente nella classe principale, e le passa il valore di "i":
     If i = 50 Then Raise cinquanta(i)
  Next

End

In console avremo:

Sono arrivato a 50 !