ciao, ho gi letto la discussione sul forum generale, ma non riesco…
in pratica ho una webapp standalone che all’apertura deve far partire un timer (ogni minuto controllo l’ora, se coincide con i miei parametri, devo aggiornare il db)
all’inizio avevo messo il timer sulla webpage di apertura (login) ma non va bene, vorrei fosse inizializzato alla open della webapp (quindi senza aprire browser)
ho creato una property public nella app, che ho chiamato ImportTimer1 di tipo timer (il mio timer)
quando per nella open dichiaro
dim importTimer1 as importTimer
importTimer1.enabled=true
ritorna un nil object exception…
Ciao Ciro,
molta confusione.
Dichiarazione della variabile
Dim importTimer1 As ImportTimer -> dichiara importTimer1 del tipo importTimer ma non crea un’istanza della classse importTimer
Dim importTimer1 As New ImportTimer -> dichiara importTimer1 del tipo importTimer creando un’istanza della classse importTimer
Dim importTimer1 As importTimer = New ImportTimer -> esattamente come l’istruzione precedente.
Vita e visibilita’ della variabile
Avendo scritto “dim importTimer1” nel metodo open hai creato una variabile locale al metodo open che scomparira’ al termine del metodo open stesso e che non ha nulla a che vedere con la property della app.
Nel metodo open per creare il timer devi semplicemente scrivere:
importTimer1 = new Timer
in quanto importTimer1 e’ gia’ definita come proprieta’ della app ed e’ dichiarata di tipo Timer.
Saluti.
La spiegazione di Maurizio chiara.
Ciro, ora sei riuscito a implementarla?
grazie, innanzitutto auguri a tutti,
nel post pranzo natalizio ci provo e vi aggiorno…
non mi chiara per una cosa…
avendo definito io una classe importtimer con i suoi eventi (action) e metodi (la procedura di import che deve essere eseguita), vorrei che il timer che lancio alla open dell’app utilizzi proprio questi…
ciao
allora, ho provato a mettere nella open dell’app
importtimer1=new importtimer (mia classe con eventi - action - e parametri corretti)
per mi restituisce il seguente errore:
“control cannot be created because no session context is available. Create a websessioncontext obkect”
Ciao Ciro,
che tipo di Timer stai utilizzando?
Dal tipo di errore direi che stai utilizzando un WebTimer,
ma quando devi utilizzare un timer lato Server cio se deve partire all’open dell’app devi utilizzare un Timer non un WebTimer.
Esatto. Un webTimer gira sul client, a te serve un timer sul server, quindi un timer normale
avete ragione un web timer…
quindi lo definisco come timer e provo
grz
allora, adesso errori non ne d pi (ho definito il mio oggetto importtimer come timer e non webtimer),
dopo nella open dell’app ho messo
importtimer1=new importtimer
importtimer1.period = 60000
importtimer1.enabled = true
tuttavia, non sembra che faccia nulla. Ricordo che ho l’evento action definito in importtimer (non so come metterlo su importtimer1, non ne ho la possibilit) cosi come nei metodi ho la routine che deve aggiornare il db…
credo manchi l’ultimo tassello…
ricapitoliamo:
hai definito una propriet dell’app importtimer1 as importtimer? (altrimenti esce di scopo)
Non hai definito (anche) una variabile importtimer1 as importtimer (altrimenti assegni a questa e esce di scopo)
Nell’oggetto importtimer hai definito l’evento action (lo puoi implementare, non necessario che sia in una finestra/pagina, vuol dire che tutte le istanze richiamano lo stesso codice )?
allora:
ho definito un oggetto importtimer di tipo timer (per intenderci nell’albero a sx dove ci sono tutte le entit)
quest’oggetto ha eventi (action) e metodi (import_dati_db)
l’ho definito come trascinandolo dagli oggetti disponibili (non legato ad alcuna web page) selezionando il webtimer e poi cambiando nell’inspector a timer
per intenderci, il mio import timer sarebbe come il customtimer qui: (no customtimer1!)

nell’evento open dell’app, ho creato un oggetto importtimer1 che vorrei facesse le cose di importtimer
importtimer1 una property con visibilit public (ha l’icona con un cubo blu), non ci sono variabili che si chiamano importtimer1
sempre nella open dell’app ho impostato il periodo e fatto partire il timer (enabled=true)
Ok
Hai dichiarato che customTimer (usando l’immagine come esempio) una classe che deriva da Timer.
Bene
Ora con il tasto destro aggiungi l’handler per action (nella classe) esattamente come quando lo fai per l’istanza nella finestra (come faresti su customTimer1)
E allo stesso modo metodi e propriet della classe.
(non essendoci il triangolo deduco che non hai creato nulla di queste cose, altrimenti posta l’immagine della classe importTimer)
bene, sono riuscito a fare degli screenshot della situazione reale, in modo che sia più chiaro…
oggetto importtimer dichiarato, con i suoi metodi e proprietà ed evento action

property importtimer1 public dichiarata nell’app

evento open dell’app

Mi sembra tutto ok
presumo che nell’action dell’oggetto ci sia la chiamata al metodo import
Come fai a dire che non viene chiamato?
Per verificare puoi mettere un period più basso e invece che richiamare import chiami system.debuglog “TimerAction”
Lanci l’applicazione dall’ide vedi se nel panel dei log appare la chiamata.
Se appare (come come deve fare) la scritta TimerAction vuol dire che la chiamata la fa e il problema è altrove. Altrimenti c’è qualcosa di strano
ciao Antonio, niente non fa mai l’evento action
suppongo il pannello cui tu ti riferisci quello dei messages…cmq non appare nulla (a parte miaapp.exe launched)
a questo punto ci sar qualche altro problema…
cmq questo quello che avevo messo nell’action in origine
Dim orario,OraSync1,OraSync2 as string
'Dim db As New MySQLCommunityServer
Dim db As New MSSQLServerDatabase
db.Host =RipaB2B.host // or just the IP if using the default instance
'db.port = 3306
db.DatabaseName = RipaB2B.dbnm
db.UserName = RipaB2B.user // or "Domain\\UserID for trusted domain accounts
db.Password = RipaB2B.pass
If db.Connect Then
'Dim ps As MYSQLPreparedStatement
Dim ps As MSSQLServerPreparedStatement
Dim stringa_sql as string
Dim rs As RecordSet
stringa_sql = "select OraSync1,OraSync2 from parametri where IdParam='EMMECI'"
ps = db.Prepare(stringa_sql)
rs=ps.SQLSelect
if rs <> Nil Then
While Not rs.EOF
OraSync1=rs.IdxField(1).StringValue
OraSync2=rs.IdxField(2).StringValue
rs.MoveNext
Wend
rs.Close
end if
Dim d As New Date
if d.Hour < 10 then
orario="0"+Str(d.Hour)
else
orario=Str(d.Hour)
end if
orario=orario+":"
if d.Minute < 10 then
orario=orario+"0"+Str(d.Minute)
else
orario=orario+Str(d.Minute)
end if
'msgbox(orario.ToText)
if orario=OraSync1 or orario=OraSync2 then
'me.Enabled=false
Import
'me.Enabled=true
'msgbox(orario.ToText)
end if
Else
MsgBox("Connection error:" + db.ErrorMessage)
End If
manca una cosa fondamentale…
ImportTimer1.period=60000
ImportTimer1.mode=Timer.ModeMultiple //Altrimenti off di default
…
Poi nella procedura chiamata devi cambiare qualcosa…
I msgbox non vanno bene. A chi li mostri se stai lavorando a livello di app?
Magari metti un system.debuglog per leggere il messaggio e usa un flag per poter vedere lato utente web lo stato
in realt li uso per fare debug, infatti sono commentati
facevo cosi anche per vfp visto il poco feeling con il debug di serie…
Si immagino e mi ricordo…
In ogni caso qui, almeno in debug utilissimo, Poi nella realt dipende dal Sistema operativo e per semplicit mi creo un mio file di log vicino all’applicazione (o nel primo luogo scrivibile disponibile)
Comunque indicando il mode al timer risolvi tutto.
purtroppo non si verifica l’evento
provato lanciando app dal run dell’ide (no build)
pu essere qualcosa legato a come stato creato importtimer? io ho trascinato il timer dalla library e poi ho modificato la propriet super da webtimer a timer