Connessione al database con Visual Basic NET? Lo trovi su Opentraining.it Visual Basic Italia
OCX in primo piano (a cura di Vito Perrotta):
Terza (ed ultima) lezione:

Completiamo il nostro OCX:
Riprendiamo la costruzione del nostro OCX. Va subito detto che l'utilità di un OCX, ovvero il valore aggiunto che tale OCX possiede rispetto all'oggetto standard di partenza, deve essere valutata molto attentamente. Infatti, se ci accingiamo a creare un OCX, le funzionalità di cui lo doteremo devono giustificare lo sforzo di codifica che dovremo sostenere. Prendiamo ad esempio il nostro ComboOCX. E' vero che siamo partiti da una ComboBox standard e quindi abbiamo "ereditato" tutti gli eventi della ComboBox. Questi, però, restano interni allo UserControl. In altre parole, quando scegliamo un Item del ComboOCX, l'evento cboBase_Click() rimarrà "imprigionato" dentro lo UserControl. A meno di non generare un evento di risposta verso l'esterno, verso, cioè, l'applicazione che sta utilizzando il nostro ComboOCX. Per di più, dovremo dotare il nostro ComboOCX di un metodo Additem che svolga la stessa funzione dell'Additem della ComboBox cboBase. In poche parole dobbiamo implementare l'interfaccia del nostro nuovo OCX. L'interfaccia di un oggetto, sia esso un OCX o un componente COM, è proprio l'insieme di Eventi, Metodi e Proprietà che tale oggetto possiede.

Proviamo a dotare il mostro ComboOCX del metodo Additem. Questo metodo, come è noto, permette di inserire un elemento nella lista relativa in una ComboBox e/o in una ListBox. I metodi, per gli OCX, sono delle normali Sub, pubbliche (altrimenti non potrebbero essere "viste" all'esterno). Inseriamo perciò nella finestra codice del nostro OCX queste istruzioni :

Public Sub Additem(sStringa As String)

cboBase.Additem sStringa

End Sub


Come possiamo vedere non abbbiamo fatto altro che ricarrozzare il metodo Additem della ComboBox originale cboBase. Visto che passeremo al metodo Additem delle semplici stringhe, il parametro

... (sStringa As String)

di cui dotiamo la sub basta allo scopo.

Chiudiamo la la progettazione dell'OCX e traferiamoci su frmStub. A questo punto il nostro OCX può esporre il metodi Additem. Inseriamo le seguenti istruzioni nella Form_Load :

Private Sub Form_Load()
ocxCombo1.AddItem 10
ocxCombo1.AddItem -15
ocxCombo1.AddItem 2
End Sub


Avremo sicuramente notato che queste istruzioni, una volta mandato in esecuzione il progetto, effettivamente inseriscono gli item desiderati. Ritorniamo alla finestra di progettazione dell'OCX. Inseriamo una proprietà Text in modo da permettere la "pulizia" della ….. cboBase.Text:

Public Property Get Text() As String
Text = cboBase.Text
End Property

Public Property Let Text(ByVal sNewValue As String)
mText = sNewValue
cboBase.Text = mText
End Property


Per poter ottenere il funzionamento corretto dobbiamo aver incluso questa riga nelle general dell'OCX :

Private mText As String


Passiamo al form frmStub. La Form_Load() potrebbe assumere questa forma

Private Sub Form_Load()
ocxCombo1.Text = ""
ocxCombo1.AddItem 10
ocxCombo1.AddItem -15
ocxCombo1.AddItem 2
End Sub


Ritorniamo al nostro OCX. Implementiamo la risposta all'evento Click() su cboBase. Abbiamo detto che per poter far questo dobbiamo generare una risposta verso l'esterno. Ecco cosa sono gli Eventi. Per prima cosa inseriamo nelle general questa dichiarazione :

Public Event Click()


Questo indica che è previsto un evento, di nome Click() che potrà essere generato durante l'applicazione. Nella procedura cboBase_Click() è il punto giusto perché questo si verifichi.

Private Sub cboBase_Click()
mText = cboBase.Text
RaiseEvent Click
End Sub


Otterremo il verificarsi di un evento Click dal nostro OCX verso l'esterno tutte le volte che avverrà l'evento Click sulla cboBase !! Con RaiseEvent "scateniamo" l'evento. Il risultato sarà anche che il nostro ocx, nel form che lo utilizza (frmStub) avrà una procedura Click in cui codificare le azioni del caso :

Private Sub ocxCombo1_Click()
Text1.Text = ocxCombo1.Text
End Sub


Passiamo ora alla parte più tecnica della lezione. Dotiamo il nostro OCX del metodo Resort che, riordina gli elementi della combo in base al loro valore numerico.

' Prima cosa le dichiarazioni nelle general :

' Definisce l'elemento di partenza degli array avente indice '1 e non 0
Option Base 1
' Il nostro array numerico per il sort
Private t(10000) As Integer
': Variabili per il sort
Dim nI As Integer
Dim nBuffer As Integer
Dim nScambi As Integer

'Rispolverando la prima lezione :
Public Sub Resort()
Dim nMaxItem As Long
nMaxItem = cboBase.ListCount
' Inizio Ciclo
Do
' Azzero gli scambi
nScambi = 0
' Passo a confrontare tutti gli
' elementi della tabella a coppie
For nI = 1 To UBound(t) - 1
If nI > nMaxItem - 1 Then Exit For
' Confronto l'ennesino con il successivo
If t(nI) > t(nI + 1) Then
' Se non sono consecutivi
' opero uno scambio di posto
' e incremento il contatore
' degli scambi

nScambi = nScambi + 1
nBuffer = t(nI)
t(nI) = t(nI + 1)
t(nI + 1) = nBuffer
End If

Next nI
' Alla fine della serie di confronti
' se non ho operato alcuno scambio
' la tabella è ordinata
If nScambi = 0 Then Exit Do
' altrimenti ricomincio
Loop

' Output del risultato
cboBase.Clear
For nI = 1 To nMaxItem
cboBase.Additem t(nI)
Next nI

End Sub


La chiamata al metodo Resort , nel frmStub è estremamente semplice :

ocxCombo1.Resort

Il progetto dell'OCX è terminato. Per renderlo utilizzabile da altre applicazioni bisogna generare il relativo file .ocx . Dal menu File di VB scegliere la voce Make ComboOCX.ocx (selezionare il progetto ComboOCX prima ).

Ancora una considerazione : abbiamo progettato e creato un OCX molto scarno. Di tutti i metodi eventi e proprietà della cboBase abbiamo esportato solo l'estrememente indispensabile all'uso. Potrebbe essere una buona esercitazione esportare anche quelle proprietà tipo Font, BackColor, ForeColor ecc. che completano ogni controllo standard. Quanto visto fino ad ora, però, ci ha permesso di conoscere un altro aspetto delle potenzialità della programmazione VB.

Grazie per l'attenzione.

Scarica qui l'esempio

Archivio lezioni OCX:
28.11.00
Lezione 1 (di Vito Perrotta)
1.12.00
Lezione 2 (di Vito Perrotta)
7.12.00
Lezione 3 (di Vito Perrotta)

Visual Basic Italia© copyright 2000 - tutti i diritti riservati
E-mail:
vbitalia@libero.it