Newsgroup: it.comp.lang.visual-basic
Titolo: CLASSI VISUALI

Ritengo sia interessante postare queste due righe a livello di NG e non di
risp pers., perche' ho notato che l'argomento sulla validazione dei dati e'
molto sentito. In un precedente messaggio, in 5 o 6 persone ci siamo
scambiati brevissimi pareri. Di seguito, per chiunque sia interessato, posto
una spiegazione + dettagliata di quello che intendevo dire con "Classi
visuali".
L'idea delle classi visuali nasce con VB5. Ed è un modo per ottenere una
forma di incapsulamento del codice di validazione, senza appesantire
oltremodo le applicazioni.
Tengo a precisare che il termine "CLASSE VISUALE", non è uffuciale, ma è un
controsenso verbale, che rende, pero', molto bene l'idea. D'altronde
sappiamo tutti che una classe non contiene elementi di interfaccia !!
Una classe visuale non è altro che una classe che rimappa verso l'esterno
tutte le proprietà e tutti i metodi di un controllo standard (ad esempio una
Textbox). Il bello è (ed è qui che ringrazio VB5) che si possono
intercettare gli eventi generati dalla Textbox "MAPPATA", di conseguenza si
possono gestire tali eventi come su una form. Infine, attraverso la Raise
posso notificare l'evento stesso, o eventualmente nuovi eventi,
all'applicazione "contenitore".
La tecnica delle classi visuali è fondata sulla possibilita' di poter
dichiarare nella sezione General della classe la seguente variabile:
Private WithEvents ctrlTextbox As TextBox
Al successivo ricaricamento del progetto che contiene la classe, forse anche
prima, vedrete che sulla finestra del codice, nella combo di sinistra,
apparira' la variabile ctrlTextbox e in quella di destra tutti gli eventi
standard di una textbox.
Occorre ricordarsi anche di implementare un metodo inizializza, della nostra
classe visuale, che, a runtime, fara' puntare la variabile ctrlTextbox su
una textbox reale, ad esempio Text1.
Public Sub Inizializza (ctrl AS Object)
   Set ctrlTextbox = ctrl
End Sub
I PRO: accentramento del codice di validazione in un solo componente.
Massima possibilità di riutilizzo. Pochissimo utilizzo di memoria e di
risorse, soprattutto rispetto ad un componente ActiveX progettato per fare
le stesse cosa.
I CONTRO: praticamente non esistono piu' le proprieta' a design time. Tutti
i settaggi delle proprieta' devono essere fatti a runtime. Quindi occorre
scrivere qualche riga di codice in piu'.
Ditemi che ne pensate.
CIAO
-----------------------------------------------------------------------
-----------------------------------------------------------------------
 Dini Daniele                   MailTo:
d.d...@esa-group.it
  Progettista Software
  Analista Programmatore
 ESA Software S.p.A.            
http://www.esa-group.it
 via Draghi, 39                 tel.: +39 541 368.111
 47900 Rimini (ITALY)           fax : +39 541 368.268
-----------------------------------------------------------------------
-----------------------------------------------------------------------

Quasi tutto giusto, ma una cosa non mi torna: perché dici che non esistono
più le proprietà a design time? Puoi tranquillamente continuare a lavorare
sul controllo (es.: textbox), modificandone le proprietà come facevi prima,
anche design-time, quindi modificare o intervenire semplicamente sulle
procedure di gestione dell'evento, all'interno della classe.
Inoltre c'è una piccola "noia": per ogni controllo inserito nel form, devi
dichiarare una nuova istanza della classe.... tuttavia, per molte situazioni
può essere utilissimo!
Ciao, Roberto

può essere utilissimo!
Infatti. Questa è la pecca: righe di codice in +. Ma le risorse richieste
sono molte di meno rispetto ad un ActiveX. Mi è capitato di progettare anche
form con oltre 200 controlli (ActiveX fatti in vb5, internamente, per
implementare funzionalita' non standard) ma accadeva che gia' due istanze
della form in questione facessero scattare l'errore di "Memoria
Insufficiente". Da quando ho progettato le CV il problema non si è + posto.
Non parliamo poi dei miglioramenti a livello di refresh delle form!!!!!
Daniele Dini

pienamente d'accordo, oltretutto hai il notevole vantaggio di non dover
distribuire nuove OCX ad ogni modifica o "bug" fissato, con tutti i problemi
che ne derivano (de-registrazione delle vecchie OCX, registrazione di quelle
nuove).
Roberto

Per chi vuole approfondire  l'argomento ,su una nota rivista del
settore,(non c'è molta scelta) nel numero di aprile, c'è un interessante
articolo sulle
classi visuali scrito da Balena.
Ciao
***************************************************
BERTI CARLO ************************************
Visual Basic & HTML *******************************
Http://www.lunet.it/offerte/berti
 ***********************
********************************************************

Ciao
Articolo MOLTO interessante. Complimenti a Balena!
Dini Daniele






all'applicazione "contenitore".
Quindi in teoria nei code-combo del form contenitore dovrei trovare
come minimo la classe ed i suoi eventi, cosa che non succede.
In sezione dichiarazioni del form contenitore ho scritto:
dim wMC as new MyClass
e dentro MyClass c'è:
Public Event Change()
Public Sub Qualsiasi()
   RaiseEvent Change
End Sub
Perchè dal form contenitore non riesco a vedere l'evento Change?
Grazie mille
Daniele

Perchč dal form contenitore non riesco a vedere l'evento Change?
Perche' devi dichiarare l'istanza con la clausola WithEvents. Es.:
Private WithEvents ctrlTextbox As TextBox
Vedrai che dopo funziona.
Nella form che utilizza una istanza della classe visuale per mappare un
controllo Textbox standard, devi dichiarare anche l'istanza stessa, con
WithEvents.
Daniele





Daniele





intercettare gli eventi generati dalla Textbox "MAPPATA", di conseguenza si
Il metodo è molto interessante, facevo una cosa simile utilizzando
qualche "magheggio" col vb416. Comunque, mi sembra che il concetto sia
più generico di "classe visuale": posso benissimo estendere le
funzionalità dell'oggetto "Timer", tanto per dirne uno non visuale, o
addirittura della mia classe myClass1 che a sua volta estende le
funzionalità di un textbox:
MYCLASSE2------------------
Option Explicit
Private WithEvents myClasse1 As Classe1
Private Sub myClasse1_Suggested(sugg As String)
    MsgBox "Questa classe non serve a nulla, solo a dimostrare come è
possibile mappare anche classi fatte da noi! :)"
End Sub
MYCLASSE1-----------------
Option Explicit
Private WithEvents myTextBox As TextBox
Event Suggested(sugg As String)
Property Set Controllo(ctrl As TextBox)
    Set myTextBox = ctrl
End Property
Private Sub myTextBox_KeyUp(KeyCode As Integer, Shift As Integer)
    <...>
    RaiseEvent Suggested("Test")
End Sub
--------------------------
MATRO
"La conoscenza non è mai molta, mano mano che
    si conosce ci si accorge di quanto si è ignoranti"
                                              L. Di Bella