Newsgroup: it.comp.lang.visual-basic
Titolo: Intercettare un evento generico, a livello di form...

Faccio prima un esempio: La proprietà KeyPreview della Form consente di
intercettare i tasti negli eventi Key... della form, prima di scatenare gli
stessi eventi sul controllo che ha il fuoco.
Ora la mia domanda è questa: Esiste un modo per intercettare un evento
qualsiasi (per esempio il GotFocus, ma così per tutti gli eventi possibili)
a livello di Form e capire anche quale sia il controllo di competenza, prima
che l'evento si scateni sul controllo stesso?
Prima che me lo chiediate, spiego, brevemente, il perchè: Nel mio
applicativo, allo scopo di favorire una maggiore operatività, cambio il
colore di fondo del controllo/oggetto che assume il fuoco. Lo rimetto a
posto al LostFocus. Per fare questo devo inserire (ok, lo faccio in
automatico con un programma) una chiamata a una mia funzione nel GotFocus e
nel LostFocus di _ogni_ controllo e questo "pesa" un bel po'.
Se potessi avere una Sub Generic_GotFocus(control as object) che viene
"eccitata" a ogni GotFocus potrei, ben sapendo qual è il controllo di
competenza (control), fare tutto al suo interno giocando sul TypeOf, Name,
Index del control.
Beh, spero di essermi spiegato. Grazie.

che l'evento si scateni sul controllo stesso?
Se hai array di controlli puoi sfruttare l' argomento Index che ricevi 
ed applicare il codice al controllo indirizzato da tale indice.
Gia' questo ti solleverebbe un bel po' :-)
Se vuoi saperlo in assoluto, a prescindere dal controllo, allora
devi subclassare il form sostituendone la window procedure con
una tua, ma, considerati i disagi che ne avresti in ambiente di
sviluppo, la lascerei proprio come estrema possibilita'.
-- 
hth, hal


Ciao LoneWolf,
visto che parli di 'index' del control che problemi hai?
private sub controllo_GotFocus(Index as integer)
e a questo punto sai benissimo da solo cosa devi fare...
Perň.. mi pare troppo semplice, conoscendoti chissŕ cosa
stai architettando.. :-)))
Ciao
 valter


 stai architettando.. :-)))
Ciao Valter.
No, i miei controlli non sono, purtroppo, tutti indexati (non ho un'array di
controlli, se non in qualche caso in cui sono strato costretto per supero
del num.max di controlli in una form, pena una buona leggibilità), quindi
non posso sfruttare l'unico evento per ogni array, ma proprio volevo sapere
se si poteva intercettare un evento (generico e qualsiasi) a livello di
Form. La risposta di Hal mi risulta chiara a metà (come si fa a
subclassare?), ma tale, comunque (per le sue giuste osservazioni), da
rinunciarci.

 > stai architettando.. :-)))
PS: Niente, è già tutto fatto, ma volevo solo ridurre un po' di codice, come
scrivevo nel post iniziale.

rinunciarci.
Aspetta, c'e' ancora una possibilita' :-)
Crei una classe che contenga giusto due metodi, ad esempio Init() e Destroy().
Chiamiamola SmartTextBox
Option Explicit
Private WithEvents m_TB As VB.TextBox
Private Sub m_TB_GotFocus()
    m_TB.BackColor = vbYellow
End Sub
Private Sub m_TB_LostFocus()
    m_TB.BackColor = vbWindowBackground
End Sub
Public Sub Init(ByVal a_TextBox As VB.TextBox)
    Set m_TB = a_TextBox
End Sub
Public Sub Destroy()
    Set m_TB = Nothing
End Sub
Nel form:
Private m_Col As Collection
Private Sub Form_Load
	Dim ctl As Control, tb As TextBox
	Dim stb As SmartTextBox
	Set m_Col = New Collection
	For Each ctl In Me.Controls
		If TypeOf ctl Is VB.TextBox Then
			Set tb = ctl
			Set stb = New SmartTextBox
			stb.Init(tb)
			m_Col.Add stb
		End If
	Next ctl
End Sub
In Form_Unload:
Dim stb As SmartTextBox
While m_Col.Count
	Set stb = m_Col(m_Col.Count)
	stb.Destroy()
	Set stb = Nothing
	m_Col.Remove(m_Col.Count)
Wend
Set m_Col =  Nothing
That' s all :-)
Ho scritto direttamente nel newsreader, quindi occhio che ci possono
degli errori sintattici ...
-- 
hth, hal

 Lupo ha scritto:
Grazie anche qui, Hal. Proverň e ti farň sapere.

 automatico con un programma) .... --- cut ---
Mi ha incuriosito questa tua affermazione.
Cosa intendi dire ?
Che hai fatto un programma che scrive automaticamente le varie sub (con
relativo controllo) di gotFocus e LostFocus ??
Se si... saresti cosi' gentile da spiegare in che maniera lo hai realizzato
?
Grazie
ciao

 ha scritto nel messaggio
news:4aYx8.90815$SR5.2...@twister1.libero.it...

Beh, la cosa è molto più semplice di come può apparire: Semplifico: In tutti
gli eventi GotFocus (ma vale per molti altri eventi) io devo inserire una
serie di istruzioni, di fatto solo una Call EVENTO_GOT(controllo).
Per non doverlo scrivere a mano, apro in input il file .FRM, come file di
testo e cerco i vari controlli (duplica un file .FRM con estensione TXT e
aprilo, vedrai che la sintassi è molto semplice) e, in funzione del loro
tipo, genero (su un file di appoggio aperto in output, sempre come testo)
cioè creo lo istruzioni Private Sub controllo_GotFocus.... e le mie
istruzioni, poi End Sub. Il tutto per tutti gli eventi di tutti i controlli
che mi interessano. Quello che ottengo è il file FRM integrato con le mie
istruzioni. Cancello l'originale e lo rinomino in .FRM. Il gioco è fatto. E'
come se avessi inserito (per tutti i controlli e tutti gli eventi) le
istruzioni "a manina", ma così non me ne scordo manco una. Non so se sono
stato chiaro?

 ha scritto nel messaggio
news:riYx8.90848$SR5.2...@twister1.libero.it...
PS: Sempre a proposito della sintassi e struttura di un file FRM, un intero
progetto VB si potrebbe scrivere con il Blocco Note. A parte il rischio di
errori, le lungaggini e, naturalmente tutte le funzioni che l'interfaccia
grafica di sviluppo (IDE) consente, questo è assolutamente vero.

  Non so se sono stato chiaro?
Direi chiarissimo e , sopratutto, velocissimo (9 minuti dopo il mio post!!).
:-)
Grazie mille
Ciao

grafica di sviluppo (IDE) consente, questo è assolutamente vero.
E soprattutto molto comodo quando occorre sostituire / aggiornare controlli.
Con Find+Replace tramite un buon text editor si evitano tediosi click e controclick
attraverso l' interfaccia grafica :-)
-- 
ciao, hal
.... noto con piacere che in questi giorni sei particolarmente dinamico sul ng :-)

 Aspetta, c'e' ancora una possibilita' :-)
Hal, ho applicato quello che mi hai indicato  funziona egregiamente.
Ho fatto qualche ... modifica, giusto per capire meglio. ;-)
Vedi (con tutto comodo, ovviamente) se ho scritto cavolate.
Ho solo un dubbio sulla Destroy (ho messo dei commenti nella stessa)
Grazie infinite, Hal. Mi hai fatto un grande regalo!
'Nella Form Gestione_Eventi_F.frm
'================================
'Creare un paio di TextBox
'Creare un paio di CommandButton (Stile Grafico)
'Creare un CommandButton con nome Fine (Stile Grafico)
'Per altri eventuali controlli non vengono gestiti eventi
Private m_Col As Collection
Private Sub Form_Load()
    Dim ctl As Control              'Controllo generico per "Each"
    Dim ge As Gestione_Eventi_C     'Riferimento alla classe
'       Definisce e carica la Collection
'       dei controlli della Form
'       Inizializza i controlli della form
    Set m_Col = New Collection
    For Each ctl In Me.Controls
        Set ge = New Gestione_Eventi_C
        Call ge.Init(ctl)
        m_Col.Add ge
    Next ctl
End Sub
Private Sub Fine_Click()
    Unload Me
End Sub
Private Sub Form_Unload(Cancel As Integer)
'       Distrugge tutti gli oggetti
'       della Collection e la stessa
    Dim ge As Gestione_Eventi_C     'Riferimento alla classe
    While m_Col.Count
        Set ge = m_Col(m_Col.Count)
        Call ge.Destroy
        Set ge = Nothing
        m_Col.Remove (m_Col.Count)
    Wend
    Set m_Col = Nothing
End Sub
'Nel modulo di classe Gestione_Eventi_C.cls
'==========================================
Option Explicit
Private WithEvents m_TB As VB.TextBox
Private WithEvents m_CB As VB.CommandButton
'   Inizializza l'oggetto
Public Sub Init(oggetto As Object)
    If TypeOf oggetto Is TextBox Then Set m_TB = oggetto
    If TypeOf oggetto Is CommandButton Then Set m_CB = oggetto
End Sub
'   Distrugge l'oggetto
Public Sub Destroy()
'==========================================================
'       Qui non mi e' chiaro: Siccome la Destroy viene
'       richiamata in un ciclo, per tante volte quanti sono
'       i controlli inizializzati nella Collection,
'       non sarebbe sufficiente chiamare questa Sub
'       una volta sola per distruggere m_TB e m_CB?
'==========================================================
    Set m_TB = Nothing
    Set m_CB = Nothing
End Sub
'   GotFocus su TextBox
Private Sub m_TB_GotFocus()
    Call o_got(m_TB)
End Sub
'   LostFocus su TextBox
Private Sub m_TB_LostFocus()
    Call o_lost(m_TB)
End Sub
'   GotFocus su CommandButton
Private Sub m_CB_GotFocus()
    Call o_got(m_CB)
End Sub
'   LostFocus su CommandButton
Private Sub m_CB_LostFocus()
    Call o_lost(m_CB)
End Sub
'   Click su CommandButton
Private Sub m_CB_Click()
    Beep
End Sub
'   GotFocus su oggetto generico
Sub o_got(oggetto As Object)
    If TypeOf oggetto Is TextBox Then
        oggetto.BackColor = vbRed
        oggetto.ForeColor = vbYellow
    End If
    If TypeOf oggetto Is CommandButton Then
        oggetto.BackColor = vbGreen
        oggetto.FontBold = True
        oggetto.FontItalic = True
    End If
End Sub
'   LostFocus su oggetto generico
Sub o_lost(oggetto As Object)
    oggetto.BackColor = vbWindowBackground
    If TypeOf oggetto Is TextBox Then oggetto.ForeColor = vbBlack
    If TypeOf oggetto Is CommandButton Then
        oggetto.FontBold = False
        oggetto.FontItalic = False
    End If
End Sub

End Sub
Non mi e' chiaro quello che chiedi, ma mi sembra corretto quello che fai ;-)
-- 
ciao, hal

 sviluppo, la lascerei proprio come estrema possibilita'.
A proposito di disagi dovuti al subclassing, avevo sentito che qualche anno
fa la MS aveva rilasciato una DLL da implementare nei progetti per risolvere
i problemi di crash dovuti al SubClassing. Qualcuno di voi l' ha mai provata
?
Ciao
Michele

Spero che questi tre aricoli ti possono aiutare
http://www.visual-basic.it/uploads/articoli/tecnici/Wrapper1.htm
http://www.visual-basic.it/uploads/articoli/tecnici/Wrapper2.htm
http://www.visual-basic.it/uploads/articoli/tecnici/Wrapper3.htm
Ciao L'Oriundo

 dovuti al SubClassing. Qualcuno di voi l' ha mai provata ?
La dll di cui parli, molto utile, serve per poter eseguire il
debug di un programma nel quale è stato effettuato il
subclassing di una finestra. Una volta effettuato il debug, il
codice relativo a questa dll va eliminato dal progetto.
La dll in questione è dbgwproc.dll, vista nei riferimenti come
Debug Object for AddressOf Subclassing.
Ciao.
--
BSD is for UNIX-lovers -- linux is for Windows-haters.

 Non mi e' chiaro quello che chiedi, ma mi sembra corretto quello che fai
;-)
Ho fatto due prove e, effettivamente, nel ciclo di Destroy (da Form_Unload)
trova m_TB o m_CB<>Nothing, ma non capisco perchè.
Ho anche verificato questo: Se prevedo _anche_ il classico evento nella
form, si verifica prima questo e poi quello gestito dalla classe e mi sta
benissimo (in alcuni casi devo fare delle cose prima di altre), ma non ho
trovato documentazione in merito a tale comportamento. Ti risulta, ovvero è
logico/costante e ci posso contare o può essere solo un caso? Grazie ancora.

 ha scritto nel messaggio
news:aa9ub3$2vt$1...@newsreader.mailgate.org...
Grazie!

"H.P.L." ha scritto nel messaggio


Quella in: 
http://msdn.microsoft.com/vbasic/downloads/components/controls.asp
 ,
giusto ?
Leggendo questo 3ad, ho scoperto che io ne ho una con lo stesso nome
e lo stesso funzionamento, ma non è la stessa.
La scaricai da qualche parte tempo fa, da un sito su VB che diceva che
era della MS, e ora scopro che invece nelle proprietà c'è:
    "Matthew Curland writing for  Addison-Wesley Professional Publishing"
     "Advanced Visual Basic 6: Power Techniques for Everyday Programs
    Addison-Wesley, July 2000  ISBN:0-201-70712-8
 
http://www.PowerVB.com
  May 29, 2000"
    "You have a license to use this file only if you have a copy of
    the book. You may not redistribute this file."
La versione è 1.00.089, mentre quella M$ è 1.00.
Immagino che sia più o meno la stessa cosa, ma... se qualcuno ha
il libro, si parla di eventuali differenze ?
Bye, G.

logico/costante e ci posso contare o può essere solo un caso? Grazie ancora.
E' un caso e puo' variare anche sulla stessa macchina, figuriamoci con un 
un ambiente hardware/software diverso.
-- 
ciao, hal

il libro, si parla di eventuali differenze ?
La versione M$ supporta "solo" 100 sottoclassi concorrenti, mentre
quella del guru dell' ole non ha questa limitazione.
-- 
ciao, hal

 proprietà c'è:
[cut]
Uno dei due ha copiato...
