Autore Topic: Creazione eventi  (Letto 1283 volte)

Offline guiodic

  • Gamberetto
  • *
  • Post: 11
    • Mostra profilo
    • http://guiodic.wordpress.com/
Creazione eventi
« il: 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?

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Creazione eventi
« Risposta #1 il: 20 Febbraio 2009, 13:02:59 »
scrivi semplicemente

Codice: [Seleziona]
cinquanta()

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Creazione eventi
« Risposta #2 il: 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

Offline guiodic

  • Gamberetto
  • *
  • Post: 11
    • Mostra profilo
    • http://guiodic.wordpress.com/
Re: Creazione eventi
« Risposta #3 il: 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 ...

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Creazione eventi
« Risposta #4 il: 20 Febbraio 2009, 17:03:52 »
Guardate che io non stavo scherzando...era la mia risposta vera quella...

funziona giusto?

Offline guiodic

  • Gamberetto
  • *
  • Post: 11
    • Mostra profilo
    • http://guiodic.wordpress.com/
Re: Creazione eventi
« Risposta #5 il: 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...

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Creazione eventi
« Risposta #6 il: 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!!

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Creazione eventi
« Risposta #7 il: 21 Febbraio 2009, 00:27:06 »
Effettivamente sembra che la gestione degli eventi sia al momento limitata agli oggetti (grafici?) precostituiti di Gambas.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Creazione eventi
« Risposta #8 il: 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.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Creazione eventi
« Risposta #9 il: 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 !
« Ultima modifica: 10 Marzo 2012, 16:24:52 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »