Visual Basic Simple
Sviluppo di un controllo utente per effettuare collegamenti Internet
Sincronizza Indice
Sincronizza Indice
Scarica il progetto
Scarica il progetto
Scarica il testo dell'articolo
Testo dell'articolo
Stampa l'articolo
Stampa l'articolo
Ricerca personalizzata

Richiesta di: Mauro Scaini - 3 Novembre 2000
Difficoltà: 3 / 5

Questa volta proveremo a creare un nuovo controllo utente. L'esempio più semplice è sviluppare una label che cliccandoci sopra apre un indirizzo internet.

Per far questo all'interno di un progetto qualsiasi (meglio se uno standard EXE nuovo) inseriamo un controllo utente. Apriamo il menu Progetto e clicchiamo sulla voce Inserisci Controllo Utente . Ci verrà generato una specie di form vuoto, senza bordo. Quello è il nostro controllo. Per prima cosa cambiamone il nome e chiamiamolo Collegamento semplicemente impostando la proprietà Name. Cambiamo anche la proprietà AutoRedraw ed impostiamola a True, per evitare spiacevoli errori grafici; infatti se questa proprietà è impostata a True, il computer si occuperà di ridisegnare il controllo ogni volta che esso viene cambiato e noi non dovremo occuparcene più.

Dentro il nostro controllo Inseriamo una Label e chiamiamola EtichettaIndirizzo. Cambiamo subito lo stile ed il colore del carattere attraverso la proprietà Font e la proprietà ForeColor. Impostiamo per essa il classico blu in grassetto sottolineato utilizzato in quasi tutti i browser.
Per cui Font avrà come carattere l'MS Sans Serif in grassetto sottolineato a dimensione 8 e la proprietà ForeColor avrà come valore &H00FF0000&, cioè il blu preso dalla tavolozza.

Impostiamo anche la proprietà AutoSize a True per fare calcolare al computer la dimensione necessaria per il nostro testo. Impostiamo il testo d'essa attraverso la proprietà Caption e settiamola a Clicca per visitare il sito. Posizioniamo la Label in alto a sinistra, alle coordinate 0,0 in modo da non sprecare spazio inutile che non è utilizzato dalla Label.

Allo stesso scopo ridimensioniamo il nostro controllo Collegamento e diamogli la stessa dimensione della EtichettaIndirizzo. Questo può essere fatto visivamente o attraverso i valori delle proprietà Height e Width. Noi utilizzeremo questo secondo metodo. Il primo è facilmente applicabile ma meno preciso.

Per cui clicchiamo una volta su EtichettaIndirizzo e guardiamo i valori delle proprietà di grandezza:

  • Width = 2370
  • Height = 195

Nota: Questi valori in alcuni computer potrebbero essere diversi, perché l'utente può cambiare le impostazioni del computer dal Pannello di controllo di Windows.

Ora facciamo corrispondere le stesse grandezze al controllo Collegamento. Selezioniamo il controllo o cliccandoci su o scegliendolo dalla finestra delle proprietà. Impostiamo quindi la proprietà Width a 2400 (2370 + 30 per evitare di tagliare la scritta in alcuni punti), e la proprietà Height a 195. Ora i due oggetti dovrebbero corrispondere. L'unica pecca è che ora non possiamo più cliccare sopra il controllo, ma soltanto sulla sua label. Se volessimo cambiare qualcosa del controllo dovremmo scegliere Collegamento dalla finestra delle proprietà.

Abbandoniamo la finestra di progettazione ed andiamo al codice vero e proprio.

Dichiariamo una variabile privata visibile soltanto al controllo e invisibile a tutto il resto del progetto. Il suo nome sarà Indirizzo e dentro questa sarà memorizzato l'indirizzo a cui andare quando l'utente clicca sopra il nostro controllo. La dichiarazione di questa variabile sarà:

Private Indirizzo As String

Nella zona delle dichiarazioni inseriamo questa Declare API:

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Questa dichiarazione API permette l'uso della funzione ShellExecute, che corrisponde via codice al classico doppio click sopra un'icona qualunque. Utilizzeremo questa funzione per aprire il browser predefinito ed andare all'indirizzo voluto.

Ragioniamo ora intorno all'interfaccia... Quando il programmatore cambia il valore della Label EtichettaIndirizzo essa automaticamente prende la dimensione esatta minima per il testo contenuto, poiché la proprietà AutoSize è impostata a True. Ma così non avviene per il controllo Collegamento, perché non è disponibile la proprietà AutoSize per esso. Per cui se la label viene impostata ad una grandezza superiore a quella del controllo, una parte della label non sarà visibile. Per evitare questo facciamo in modo che ogni volta che la EtichettaIndirizzo cambia dimensione, anche il controllo Collegamento cambia la sua dimensione. Sfruttiamo l'evento Change della label EtichettaIndirizzo con:

  1. Private Sub EtichettaIndirizzo_Change()
  2.     UserControl.Width = EtichettaIndirizzo.Width + 30
  3.     UserControl.Height = EtichettaIndirizzo.Height
  4. End Sub

Quando l'utente clicca sopra la Label, che é l'unico oggetto cliccabile, in quanto la superficie del controllo è coperta da essa, deve essere chiamato il browser predefinito. Sfruttiamo la funzione API dichiarata prima:

  1. Private Sub EtichettaIndirizzo_Click()
  2.     ShellExecute 0, "open", Indirizzo, "", "", vbNormalFocus
  3. End Sub

La funzione appena vista dice al computer di aprire ("open") l'indirizzo contenuto nella variabile Indirizzo e mostrare la finestra in modalità normale (vbNormalFocus).

Ora bisogna fare in modo che la variabile interna Indirizzo prenda il valore che noi preferiamo. Essendo una variabile Private, non sarà possibile aver accesso dall'esterno del controllo. Per questo ci serviremo di una proprietà nuova, che chiameremo URL. Questa proprietà sarà di lettura e scrittura, per permetterne il cambiamento e la lettura del valore.

Prima di iniziare a scrivere le proprietà è importante chiarire il concetto di Borsa delle Proprietà detta PropertyBag. Tutte le proprietà di un controllo impostate in fase di progettazione devono essere memorizzate nella borsa delle proprietà, altrimenti il loro valore sarebbe perduto. Inoltre in fase di esecuzione tutti i valori delle proprietà devono essere estratti dalla borsa e memorizzati nelle loro proprietà. Vedremo più avanti come utilizzare la borsa delle proprietà.

Per definire la scrittura della proprietà URL scriviamo:

  1. Public Property Let URL(ByVal Nuovo_URL As String)
  2.     Indirizzo = Nuovo_URL
  3.     PropertyChanged "URL"
  4. End Property

La parola chiave Let identifica la scrittura della proprietà. Il parametro Stringa Nuovo_URL è il nuovo valore dato alla proprietà. Se noi scrivessimo:

URL = "http://www.sitomio.it"

Verrebbe chiamata la funzione che modifica la proprietà, cioè la Let URL e come parametro avrebbe "http://www.sitomio.it".
All'interno di questa abbiamo l'impostazione della variabile interna Indirizzo uguale al nuovo indirizzo dato alla proprietà.
Abbiamo anche una funzione che dice alla borsa delle proprietà che la proprietà URL è cambiata. Leggiamo infatti PropertyChanged "URL".
Ogni cambiamento di proprietà dovrebbe avere un'istruzione del genere.

Definiamo ora la lettura della proprietà URL, scrivendo:

  1. Property Get URL() As String
  2.     URL = Indirizzo
  3. End Property

Quest'istruzione molto semplice dice al computer che quando abbiamo bisogno di utilizzare la proprietà URL ci restituisca il valore della variabile Indirizzo.

Allo stesso modo dobbiamo permettere di cambiare la scritta all'interno della EtichettaIndirizzo, cioè la proprietà Caption. Ma la nostra label non sarà direttamente accessibile all'esterno del controllo, ragion per cui è necessario definire una nuova proprietà al controllo. Chiameremo questa nuova proprietà Caption, lo stesso nome della proprietà della label. Anche questa proprietà sarà di lettura e scrittura. Definiamo quindi:

  1. Public Property Let Caption(ByVal Nuova_Caption As String)
  2.     EtichettaIndirizzo.Caption = Nuova_Caption
  3.     PropertyChanged "Caption"
  4. End Property
  5. Public Property Get Caption() As String
  6.     Caption = EtichettaIndirizzo.Caption
  7. End Property

Queste istruzioni effettuano il mapping, cioè la corrispondenza della proprietà Caption del controllo con la proprietà Caption della Label EtichettaIndirizzo. Anche in questa proprietà abbiamo la notifica alla borsa delle proprietà del cambiamento della proprietà Caption.

Qui il nostro lavoro può giungere alla fine. Ci mancano soltanto le due operazioni citate prima, cioè l'estrazione dei dati dalla borsa delle proprietà e la loro memorizzazione.
L'operazione di lettura dalla borsa viene effettuata quando si lancia l'esecuzione del programma. La lettura dalla borsa viene effettuata mediante l'evento ReadProperties dell'oggetto UserControl.

Selezioniamo tale evento e scriviamo:

  1. Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
  2.     EtichettaIndirizzo.Caption = PropBag.ReadProperty("Caption")
  3.     Indirizzo = PropBag.ReadProperty("URL")
  4. End Sub

Il parametro PropBag è la borsa delle proprietà del nostro controllo. Ce la fornisce in automatico l'evento ReadProperties.
La seconda riga imposta inizialmente la Caption di EtichettaIndirizzo uguale alla proprietà Caption del nostro controllo Collegamento.
La terza invece inizializza la variabile interna Indirizzo al valore della proprietà URL.

Sviluppiamo ora l'operazione di scrittura delle proprietà nella borsa, che avviene nel momento in cui termina la fase di esecuzione e si ritorna alla fase di progettazione.

  1. Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
  2.     PropBag.WriteProperty "Caption", EtichettaIndirizzo.Caption
  3.     PropBag.WriteProperty "URL", Indirizzo
  4. End Sub

Quest'operazione potrà sembrare molto sciocca, ma Visual Basic non ricorda il contenuto di alcune proprietà impostate in fase di progettazione all'uscita dell'esecuzione del programma. Dobbiamo quindi riscrivere tali valori nella borsa delle proprietà.

Tecnicamente il nostro controllo Collegamento è finito qui.
Ma vogliamo aggiungere un'ulteriore funzione di controllo. Vogliamo impedire che durante la fase di progettazione si deformi il nostro controllo, ingrandendolo o rimpicciolendolo oltre la dimensione della nostra Caption. Facciamo in modo che ogni volta che il controllo viene ridimensionato, in automatico vengano reimpostate le dimensioni esatte, annullando quindi il ridimensionamento. Sfruttiamo l'evento Resize dell'oggetto UserControl.

  1. Private Sub UserControl_Resize()
  2.     UserControl.Width = EtichettaIndirizzo.Width + 30
  3.     UserControl.Height = EtichettaIndirizzo.Height
  4. End Sub

Avremmo anche potuto richiamare la funzione EtichettaIndirizzo_Change, che effettua la medesima operazione, ma abbiamo voluto semplificare il codice.

Il nostro controllo finisce qui. Passiamo ora alla prova sopra un form. Prima di poterlo utilizzare, tuttavia, è necessario chiudere la finestra di progettazione del controllo.
Se abbiamo già un form nel progetto usiamo quello, altrimenti inseriamone uno nuovo.
Ora che la finestra di progettazione del controllo è chiusa possiamo notare nella casella degli strumenti un nuovo controllo . Quello è appunto il nostro controllo.

Inseriamone uno sopra il form, impostiamo le proprietà Caption e URL, eseguiamo il progetto e vedremo realizzati i nostri sforzi.

Se volessimo sfruttare questo controllo in un altro progetto possiamo utilizzare la voce Inserisci Controllo Utente dal menu Progetto. Lì selezionare la voce esistente e cercarsi la cartella dove è salvato il nostro controllo.

Possiamo estendere il nostro controllo inserendo nuove proprietà, cambiando il puntatore del mouse a forma di manina quando l'utente posiziona il mouse sopra il nostro controllo, fare in modo che ogni controllo possa cambiare il colore del testo, e tante altre cose, sempre tenendo sott'occhio una cosa: la Borsa delle Proprietà.

Per facilitare l'utilizzo del nostro controllo potremo anche creare una pagina delle proprietà dove sono raccolte le proprietà del controllo. La generazione di una pagina delle proprietà verrà affrontata in un'altra sezione.

Una versione più completa di questo controllo utente è l'FBI Hyperlink reperibile nella sezione Controlli utente.

Fibia FBI
4 Novembre 2000

Scarica il progetto
Scarica il progetto
Scarica il testo dell'articolo
Scarica il testo dell'articolo
Stampa l'articolo
Stampa l'articolo
Torna all'introduzione delle Richieste dei lettori