L'oggetto di questa discussione può non apparire sufficientemente chiaro, ma vorrei gestire qualcosa del genere:
Il Click del mouse su un oggetto qualsiasi, all'interno di una Form (TextBox, ComboBox, Button, Panel, Frame,...) scatena l'evento MouseDown al momento della pressione di un pulsante del mouse. Allora, per intercettare Il click sul mouse su qualsiasi oggetto interno alla Form, piuttosto che scrivere una procedura Evento_MouseDown per ciascun oggetto della Form, verrebbe assai più comodo gestire l'evento dentro un'unica procedura Formx_MouseDown. Ho provato a scriverla, ma l'effetto ottenuto è che la procedura viene avviata solamente quando il mouse agisce su un punto vuoto della Form, se invece il click avviene su una "Label" la procedura Formx_MouseDown non viene assolutamente scedulata.
Per dirla molto brevemente: non funziona come l'evento KeyPress.
Ho cercato allora una qualche indicazione nella documentazione ufficiale di Gambas, ma non ho saputo trovare niente di facilmente gestibile, l'unica strada praticabile potrebbe essere quella di scrivere una procedura evento per ciascun oggetto della Form, compresa la Form stessa e richiamare poi una procedura Sub o Function contenente il codice occorrente, cioè:
Public Sub TextBox1_MouseDown()
MioEvento_MopuseDown
End
Public Sub Label1_MouseDown()
MioEvento_MopuseDown
End
Public Sub Form1_MouseDown()
MioEvento_MopuseDown
End
Private Sub MioEvento_MopuseDown()
Message.Info("Hai fatto Click col mouse")
End
Sarebbe bello poter dire a Gambas a livello generale, magari all'interno della procedura _new della Form stessa, al Click sul mouse esegui la Form_MouseDown. :-[
:ciao:
In gambas, gli eventi sono associati ad un singolo gestore, che può essere identificato dal nome dell'oggetto stesso, seguito dal tipo di evento, oppure dal nome del GROUP.
Tramite GROUP è possibile unificare gli eventi in un singolo gestore generale, relativo allo stesso oggetto parent di tutto (es. una Form).
Non è però possibile unificare anche il tipo di evento, come invece succede con altri linguaggi. Per cui l'evento Click(), ad esempio, può essere gestito da un solo metodo Click(), e non può venir mischiato con un evento DblClick(). Quindi, a prescindere da chi scatena l'evento, il metodo è sempre quello, ed è gestito internamente a gambas, per cui non è possibile modificarne la logica.
PUBLIC <gruppo>_<evento>()
END
Se più oggetti vengono associati allo stesso gruppo, lo stesso evento verrà gestito dallo stesso metodo. E' ovvio che poi all'interno del metodo si dovrà capire chi ha scatenato l'evento (se necessario), e in quesot caso viene a cecio la keywork LAST che, appunto, ritorna l'oggetto che ha scatenato l'evento.
Io proporrei una classe di questo genere :)
Event MouseDown(Obj As Object)
Private hObs As Observer[]
Public Sub _new(Parent As Window)
Dim Obs As Observer
Dim Ctrl As Control
hObs = New Observer[]
For Each Ctrl In Parent.Controls
Obs = New Observer(Ctrl) As "Event"
hObs.Add(Obs)
Next
End
Public Sub Event_MouseDown()
Raise MouseDown(Last)
End
In questo modo tutti gli oggetti del form che hanno un evento MouseDown vengono intercettati e inviati ad un unico evento generato dalla classe, lasciando comunque la possibilità di gestire separatamente gli eventi dei singoli oggetti del form.
Poi magari ho detto na strunz....... ata! :P
Se ho ben compreso quello che Picavbg vorrebbe ottenere è la gestione di un determinato evento indipendentemente dall'oggetto su cui viene compiuta l'azione. mantenendo l'esempio del MouseDown() una soluzione potrebbe esse la seguente:
1. associ a tutti gli oggetti contenuti nella form lo stesso gruppo (ad esempio "miogruppo")
2 Nella classe della form scrivi la sub:
Public Sub form_MouseDown()
Message("Premuto Mouse")
End
3 ed infine inserisci la sub:
Public Sub mygrp_MouseDown()
form_MouseDown()
End
I vostri accorati suggerimenti e ragionamenti mi commuovono tantisssimo. :'(
Vi ringrazio tutti, ma ho risolto a modo mio, senza disturbare la proprietà GROUP. Ho dovuto, ahimè, sbracciarmi e sfornare ben 38 procedure di tipo Oggetto_MouseDown, ma alla fine ce l'ho fatta. Conosco benissimo come funziona GROUP perchè l'ho già utilizzato nello stesso programma dentro un'altra Form. Qui, ribadisco il mio concetto: non ne vedo la necessità. Poi vorrei sapere come mai Gambas, nonostante la piramide disegnata da md9327, intercetti la pressione di un tasto qualsiasi della tastiera scatenando l'evento KeyPress della Form prima dello stesso tipo di evento gestito nella relativa procedura dell'oggetto possessore del focus in quel momento, come per es. una TextBox. A suo tempo ho scritto le seguenti due procedure:
Public Sub Form_KeyPress()
'---------------------------------------------
QualeTasto = New CheTasto($_Tasto) ' richiamo del modulo per limitare l'input ai soli dati numerici
Print "Evento Form_KeyPress --> tasto premuto= '" & QualeTasto.$_Como & "'"
Select Case QualeTasto.$_Como
Case "Invio"
Select Case $_contrAct
Case "OptNuovo"
OptNuovo.SetFocus
Case "OptVecchio"
OptVecchio.SetFocus
Case "RiprMovSel"
GriMovv.SetFocus
End Select
End Select
'.....bla.....bla.....bla
End
Public Sub MovDigOk_KeyPress()
QualeTasto = New CheTasto($_Tasto) ' richiamo del modulo per limitare l'input ai soli dati numerici
Print "Evento MovDigOk_KeyPress --> tasto premuto= '" & QualeTasto.$_Como & "'"
Select Case QualeTasto.$_Como
Case "Invio"
MovDigOk_Click()
End Select
End
L'effetto prodotto dal suddetto codice é
1) qualsiasi tasto premuto nella tastiera scatena un evento KeyPress, ma solo in due procedure "_KeyPress" esiste un comado Print e tutte le volte che ho premuto un tasto, fino al tasto INVIO sull'oggetto grafico Button da me denominato "MovDigOk" ho ottenuto le seguenti righe di Print nella Console di Gambas:
2) Esito della gestione "Evento KeyPress":
Evento Form_KeyPress --> tasto premuto= 'p'
Evento Form_KeyPress --> tasto premuto= 'r'
Evento Form_KeyPress --> tasto premuto= 'e'
Evento Form_KeyPress --> tasto premuto= 's'
Evento Form_KeyPress --> tasto premuto= 'a'
Focus sulla TextBox 'ImpMovDig'
Evento Form_KeyPress --> tasto premuto= '6'
Focus sulla TextBox 'SegnoEU'
Evento Form_KeyPress --> tasto premuto= 'u'
Evento Form_KeyPress --> tasto premuto= 'Tab-Avanti'
Focus sul Button 'MovDigOk'
Evento Form_KeyPress --> tasto premuto= 'v'
Evento Form_KeyPress --> tasto premuto= 'i'
Evento Form_KeyPress --> tasto premuto= 'Canc-crt-prec'
Evento Form_KeyPress --> tasto premuto= 'Canc-crt-prec'
Evento Form_KeyPress --> tasto premuto= 'Canc-crt-prec'
Evento Form_KeyPress --> tasto premuto= 'e'
Evento Form_KeyPress --> tasto premuto= 's'
Evento Form_KeyPress --> tasto premuto= 'c'
Evento Form_KeyPress --> tasto premuto= 'a'
Focus sulla TextBox 'ImpMovDig'
Evento Form_KeyPress --> tasto premuto= '1'
Evento Form_KeyPress --> tasto premuto= '1'
Focus sulla TextBox 'SegnoEU'
Evento Form_KeyPress --> tasto premuto= 'u'
Evento Form_KeyPress --> tasto premuto= 'Tab-Avanti'
Evento Form_KeyPress --> tasto premuto= 'Tab-Avanti'
Evento Form_KeyPress --> tasto premuto= 'Invio'
Evento Form_KeyPress --> tasto premuto= 'Tab-Avanti'
Evento Form_KeyPress --> tasto premuto= 'Invio'
Evento MovDigOk_KeyPress --> tasto premuto= 'Invio'
Come è ben visibile dalle Print ottenute, L'evento Form_KeyPress è stato sempre scatenato, a prescindere dall'oggetto avente il Focus al momento della pressione del tasto, ma anche quando, ho premuto il tasto 'INVIO' col focus attivo sul pulsante MovDigOk, relativamente al quale ho scritto una procedura KeyPress; infatti la riga di Print è stata prodotta due volte, la prima al momento della cattura dell'evento KeyPress a livello di Form, la seconda al momento della cattura dell'evento KeyPress a livello dell'oggetto MovDigOk, interno alla Form.
Ho voluto rimarcare la rilevazione dell'evento KeyPress da parte di Gambas, perchè riguarda sempre oggetti grafici di Gambas e viene gestito sempre dentro la classe Form che a me da l'impressione di un "supervisore facente parte".
A questo punto il ragionamento che faccio da semplice utente non esperto di Gambas è: Il diverso comportamento di Gambas relativamente alla periferica esterna "Tastiera" e relativamente alla periferica esterna "Mouse" può essere voluto, ma bisognerebbe farsi spiegare perchè, oppure c'è un vero e proprio bug in Gambas. Se si tratta di un bug, e questo solo il mago M...erlino lo sa, andrebbe apportata la dovuta correzione. Ciò spiegherebbe meglio il mio rifiuto ad utilizzare un metodo (group), sprecato secondo me per il tipo di impiego a cui dovrei spingerlo forzatamente.
Spero di avere ancor più chiarito il mio ragionamento, poco tecnico, se vogliamo, ma rivolto sicuramente all'utente.
:D :ciao:
gran parte degli eventi vengono comunque intercettati dalla form, e quindi puoi agire di conseguenza.
Se è vero che gran parte degli eventi vengono intercettati prima dello stesso evento nella sfera di trattamento dentro le procedure dell'oggetto figlio, quali sono gli altri eventi che subiscono la stessa sorte dell'evento KeyPress? La documentazione ufficiale di Gambas non riporta indicazioni in merito. Io ho cercato quella relativamente a KeyPress che ho letto da qualche parte a suo tempo, ma non ho trovato proprio niente. Forse non ne sono stato capace io.
Se non inserisci anche un metodo per l'oggetto figlio, la cosa termina nella form.
Rimanendo all'esempio dell'evento KeyPress che è quello su cui possiamo ragionare, perchè è l'unico che ho potuto realmente provare, se scriviamo due procedure evento: Form_KeyPress e OggettoFiglio_KeyPress, è certo che verranno esguite entrambe, prima, come già ampiamente discusso e provato, la procedura Form_KeyPress e dopo la procedura OggettoFiglio_KeyPress. Supponiamo infatti che la prima delle due emetta il messaggio n.1, mentre la seconda emetta il messaggio n.2, ecco descritte qui sotto le due procedure:
Public Sub Form_KeyPress()
'---------------------------------------------
Message.Info("Questo messaggio n.1 è stato prodotto dentro la procedura 'Form_KeyPress'")
End
Public Sub DescrMoDigTxt_KeyPress()
'-------------------------------------------
Message.Info("Questo messaggio n.2 è stato prodotto dentro la procedura 'DescrMoDigTxt_KeyPress'")
End
Ho provato, per riprova di quanto affermato sopra, ed ho ottenuto in sequenza, l'emissione dei due messaggi, prima il messaggio n.1 e poi il messaggio n.2.
Quindi possiamo concludere che,
- in caso di presenza di procedura evento KeyPress solamente nell'insieme delle procedure proprie della Form, l'evento KeyPress viene intercettato dalla Form_KeyPress;
- in caso di presenza di procedura evento KeyPress solamente nell'insieme delle procedure proprie di un OggettoFiglio, l'evento KeyPress viene intercettato dalla OggettoFiglio_KeyPress;
- in caso di presenza di procedura evento KeyPress sia nell'insieme delle procedure proprie della Form che in quelle proprie di un OggettoFiglio, l'evento KeyPress viene intercettato due volte, la prima dalla Form_KeyPress e la seconda dalla OggettoFiglio_KeyPress.
Sarebbe bello e comodo poter ottenere lo stesso effetto per altri eventi, come per. Es.: MouseDown. Sarebbe anche utile ottenere una descrizione dettagliata in merito ai criteri di intercettazione di alcuni eventi particolari nella struttura logica di Gambas come quelli oggetto di questa discussione.
:ciao: