Toolbox Visual Basic
Presentiamo in questa sezione, per i programmatori in Visual Basic, versioni 5 o 6, strumenti idonei ad ottimizzare le loro applicazioni in termini di efficacia e funzionalità: si tratta di esempi di codici e di routines accompagnati da indicazioni sul loro funzionamento e sul loro utilizzo all'interno di un programma.
Il materiale messo a disposizione è totalmente gratuito e di libero utilizzo. Se questo codice viene redistribuito altrove si dovrà però citarne l'autore e la fonte.
Sezione Utility
RunDll32
A cosa serve e come funziona questo codice
Questo codice spiega il modo per utilizzare, tramite Visual Basic, l'utility di sistema RUNDLL32.exe. Questo importante file, che si trova
nella cartella di Windows, si occupa della gestione di molte funzioni del sistema operativo quali, ad esempio, l'apertura di alcune finestre
di dialogo (connessioni alla rete, stampanti, schermo), la chiusura di Windows, l'accesso alle applet ("piccoli programmi") del Pannello di
Controllo, ecc.
Utilizzando, quindi, le potenzialità di questa utility, saremo in grado di dare all'utilizzatore del nostro programma, la possibilità di
modificare e/o personalizzare, tramite le applet del "Pannello di Controllo", le impostazioni necessarie al corretto funzionamento della
nostra applicazione.
Il funzionamento del codice, tra l'altro molto semplice, sfrutta la stessa tecnica utilizzata da Windows (Explorer) per richiamare i files
CPL (le applet del pannello di controllo, appunto). La stringa, infatti, è composta dal nome dell'utility Rundll32 seguita dalla libreria
shell32.dll e, a seguire, i dati da passare alla funzione API Control_RunDLL, ovvero il nome, senza necessità di specificare il percorso,
dell'applet da richiamare e, opzionalmente, se si vuole specificare anche il numero di pagina, un secondo parametro non utilizzato ed un
terzo che indicherà il numero della pagina da richiamare (vedi esempi e note più sotto).
Quando e perchè usare questo codice
Questo codice, che si "limita" a descrivere come utilizzare RunDll32.exe relativamente per richiamare alcune applet del "Pannello di
Controllo", può essere usato, all'interno della nostra applicazione, per consentire all'utente la visualizzazione e/o la modifica dei dati di
sistema.
Avvertenze e suggerimenti
L'elenco delle applet e gli esempi più sotto riportati sono compatibili con tutte le versioni di Windows (Win95,Win98,ME, NT, 2000 e XP).
apre il "Pannello di Controllo"
Nota. Alcune applet del pannello di controllo contengono più pagine (schede) selezionabili attraverso un tab control. Volendo, possiamo
specificare quale pagina aprire modificando il codice proposto più sopra, in questo modo:
Call Shell("rundll32 shell32,Control_RunDLL")
apre il pannello "Accesso Facilitato"
Call Shell("rundll32 shell32,Control_RunDLL access.cpl")
apre il pannello "Installazione Applicazioni"
Call Shell("rundll32 shell32,Control_RunDLL appwiz.cpl")
apre il pannello "Proprietà dello schermo"
Call Shell("rundll32 shell32,Control_RunDLL desk.cpl")
apre il pannello "Proprietà Internet" (dipende dalla versione di I.E.)
Call Shell("rundll32 shell32,Control_RunDLL inetcpl.cpl")
apre il pannello "Impostazioni Internazionali"
Call Shell("rundll32 shell32,Control_RunDLL intl.cpl")
apre il pannello "Proprietà del mouse"
Call Shell("rundll32 shell32,Control_RunDLL main.cpl")
apre il pannello "Proprietà della tastiera"
Call Shell("rundll32 shell32,Control_RunDLL main.cpl @1")
apre il pannello "Proprietà Suoni e Multimedia"
Call Shell("rundll32 shell32,Control_RunDLL mmsys.cpl")
apre il pannello "Proprietà del Modem"
Call Shell("rundll32 shell32,Control_RunDLL modem.cpl")
apre il pannello "Proprietà del Sistema"
Call Shell("rundll32 shell32,Control_RunDLL sysdm.cpl")
apre il pannello "Proprietà Data e Ora"
Call Shell("rundll32 shell32,Control_RunDLL TimeDate.cpl")
Call Shell("rundll32 shell32,Control_RunDLL nome_applet.cpl,,n")
dove 'nome_applet' è il nome dell'applet che intendiamo visualizzare e 'n' rappresenta il numero del pannello da aprire,
esempio:
Call Shell("rundll32 shell32,Control_RunDLL desk.cpl,,1")
viene aperta, in Windows XP, la finestra "Proprietà schermo" alla pagina "Screen Saver".
Esempio di utilizzo
Nell'esempio che segue immaginiamo di voler far modificare all'utilizzatore le impostazioni dello schermo per adattarle alla nostra
applicazione. Ecco come richiamare l'applet preposta a questa funzione:
Private Sub VisualizzaProprietàDelloSchermo()
Con questa sub verrà visualizzata la finestra "Proprietà dello Schermo" con attiva la pagina iniziale (che, nel caso di Windows XP, è la
pagina "Temi") se, invece, vogliamo che la finestra venga aperta in una determinata pagina, esempio la pagina delle impostazioni, dovremo
usare il seguente codice:
Call Shell("rundll32 shell32,Control_RunDLL desk.cpl")
End Sub
Private Sub VisualizzaProprietàDelloSchermo()
Call Shell("rundll32 shell32,Control_RunDLL desk.cpl,,4") (*)
End Sub
(*) I numeri delle pagine da aprire possono variare in funzione della versione di Windows in uso.
Sleep
A cosa serve e come funziona questo codice
Questa funzione serve per impostare una breve pausa o un tempo di attesa all'interno di una nostra routine.
La funzione API (Application Programming Interface) Sleep utilizzata deve essere richiamata passando come argomento dwMilliseconds
(long) il tempo di attesa espresso in millisecondi (la funzione non prevede nessun valore di ritorno).
Quando e perchè usare questo codice
Questa funzione può essere utilizzata, anche in sostituzione del controllo "Timer", ogni qualvolta ci sia la necessità di impostare un tempo
di attesa, soprattutto se molto breve, durante l'esecuzione del nostro codice. L'utilizzo di questa funzione, al contrario dell'utilizzo del
Timer o della funzione Delay, consente l'impostazione di tempi "brevi" estremamente precisi.
Avvertenze e suggerimenti
L'utilizzo di questa funzione dovrebbe essere riservato solo per impostare pause molto brevi (inferiori al secondo) in quanto, la nostra
applicazione verrà bloccata per tutto il tempo della pausa, impedendo anche eventuali aggiornamenti grafici e qualunque altra elaborazione di
codice. Se si ha la necessità di impostare tempi di attesa "lunghi" conviene utilizzare la funzione Delay oppure un controllo Timer.
'Dichiarazione della funzione API (sostituire Private con Public in funzione delle necessità)
Esempio di utilizzo
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Nell'esempio che segue ipotizziamo di voler visualizzare, in un controllo label, un messaggio animato nel quale venga visualizzata, con una
certa gradualità, la parola "Ciao". Ecco come utilizzare la funzione Sleep.
Private Sub AnimazioneDiBenvenuto()
With Label1
.Caption = "C"
.Refresh 'forza l'aggiornamento della Label
Sleep 150 'imposta una pausa di 150 millisecondi
.Caption = Label1.Caption & "i"
.Refresh
Sleep 150 'imposta una pausa di 150 millisecondi
.Caption = Label1.Caption & "a"
.Refresh
Sleep 150 'imposta una pausa di 150 millisecondi
.Caption = Label1.Caption & "o"
.Refresh
End With
End Sub
Funzione GetKeyState
A cosa serve e come funziona questo codice
Questo codice serve per verificare se il tasto "blocca maiuscole" è premuto oppure no.
La funzione API (Application Programming Interface) GetKeyState utilizzata deve essere richiamata passando come argomento nVirtKey
, il codice del tasto da verificare che, nel nostro caso, è: vbKeyCapital.
Quando e perchè usare questo codice
Questa funzione può essere usata in tutti quei casi in cui interessa sapere se il nostro utilizzatore ha il tasto blocca maiuscole premuto
oppure no.
Avvertenze e suggerimenti
Sostituendo la costante vbKeyCapital con vbKeyNumlock è possibile eseguire la stessa verifica, di cui sopra, riferita però al
tasto Blocco Numerico (del tastierino numerico)
'Dichiarazione della funzione API (sostituire Private con Public in funzione delle necessità)
Esempio di utilizzo
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Long
Nell'esempio che segue si ipotizza di voler verificare se il pulsante Blocca Maiuscole è premuto.
Ecco come richiamare e utilizzare la funzione GetKeyState:
If (GetKeyState(vbKeyCapital)) Then
Nota: sostituendo (GetKeyState(vbKeyCapital)) con (GetKeyState(vbKeyNumlock)) viene eseguita la stessa verifica per la posizione del
tastierino numerico.
'il tasto blocca maiuscole è attivo
'qui l'eventuale codice da elaborare di conseguenza
Else
'il tasto blocca maiuscole NON è attivo
'qui l'eventuale codice da elaborare di conseguenza
End If
Delay
A cosa serve e come funziona questo codice
Questo codice serve per impostare una breve pausa o tempo di attesa.
La subroutine deve essere richiamata passando obbligatoriamente come argomento Second (long) il tempo (in secondi) della pausa
desiderata e come argomento, opzionale, Refresh (booleano), True o False rispettivamente per consentire o NON consentire, durante la
pausa, l'esecuzione e l'elaborazione di altri eventi.
Quando e perchè usare questo codice
Questa subroutine può essere utilizzata, anche in sostituzione del controllo "Timer", ogni qualvolta ci sia la necessità di impostare un
tempo di attesa o una determinata temporizzazione, durante l'esecuzione del nostro codice (visualizzazione di messaggi, di form "splash"
ecc.).
Avvertenze e suggerimenti
Se invochiamo la routine con l'argomento "Refresh" False l'aggiornamento della nostra applicazione verrà bloccato per tutto il tempo della
pausa, impedendo anche eventuali aggiornamenti grafici e qualunque altra elaborazione di codice.
Rispetto alle routine che utilizzano la funzione "Timer", quella proposta assicura un funzionamento corretto anche nei periodi a "cavallo"
della mezzanotte.
Sub Delay(ByVal Second As Long, Optional ByVal Refresh As Boolean = True)
Esempio di utilizzo
Dim Start As Date
'memorizza la data e l’ora correnti
Start = Now
'inizia il loop
Do
'se Refresh = True, trasferisce il controllo al sistema operativo
'in modo da consentire l'elaborazione di eventuali eventi
If Refresh Then DoEvents
'ripete l'istruzione finchè non è trascorso il numero di secondi richiesti
Loop Until DateDiff("s", Start, Now) >= Second
End Sub
Nell'esempio che segue ipotizziamo di voler visualizzare, temporaneamente, un messaggio contenuto in un normalissimo controllo "Label".
Ecco come utilizzare la routine di temporizzazione:
Private Sub MostraMessaggio()
lblMessaggio.Visible = True 'visualizza il controllo Label
Delay 10 'imposta un tempo di attesa di dieci secondi
lblMessaggio.Visible = False 'nasconde il controllo Label
End Sub
Funzione PrinterExist
A cosa serve e come funziona questo codice
Questo codice serve per verificare se nel sistema in cui è presente la nostra applicazione, è installata una stampante. La funzione, che
utilizza la proprietà DeviceName dell'oggetto Printer per recuperare il nome della stampante installata, restituisce True
, nel caso venga rilevata la presenza di almeno una stampante, False, in caso contrario.
Quando e perchè usare questo codice
Questa funzione deve essere usata quando, all'interno del nostro codice, prevediamo una procedura di stampa. La verifica della presenza di
una stampante, infatti, ci consente di abilitare o disabilitare tale procedura al fine di evitare errori.
Avvertenze e suggerimenti
Anche se può sembrare anacronistico, non è assolutamente certo che in tutti i sistemi sia sempre installata una stampante, quindi, è buona
norma eseguire sempre una verifica preliminare.
Attenzione: questa funzione verifica che nel sistema sia installata almeno una stampante ma NON ne verifica anche la disponibilità!
Private Function PrinterExist() As Boolean
Esempio di utilizzo
'in caso di errore continua l'elaborazione del codice
On Error Resume Next
'variabile che riceve il nome della stampante
Dim sPrinter As String
'legge il nome della periferica (stampante)
sPrinter = Printer.DeviceName
'Nel caso non ci siano stampanti installate nel sistema in uso,
'verrà generato un errore (errore gestito dalla funzione stessa).
If Err.Number Then 'nessuna stampante installata
'inserire qui un eventuale messaggio di errore o di avviso
PrinterExist = False
Else 'è stata rilevata una stampante installata
PrinterExist = True
End If
End Function
Nell'esempio che segue ipotizziamo di voler abilitare un ipotetico pulsante di stampa solo se nel sistema rileviamo la presenza di una
stampante.
Ecco come richiamare la funzione PrinterExist:
cmdPrint.Enabled = PrinterExist
Funzione SendEmail
A cosa serve e come funziona questo codice
Questa funzione serve per predisporre l'invio di un messaggio di posta elettronica.
La funzione, che utilizza l'API (Application Programming Interface) ShellExecute , deve essere richiamata passando obbligatoriamente
come argomento sTo (string) l'indirizzo al quale si desidera inviare la mail e come argomenti (tutti opzionali) sCc, sCcn,
sSubject, sBody (String), rispettivamente: l'indirizzo e-mail al quale si desidera inviare la mail in copia, l'indirizzo e-mail al quale
si desidera inviare la mail in copia carbone (nascosta), l'oggetto della mail e, infine, il testo della mail.
Quando e perchè usare questo codice
Questa funzione può essere usata, ad esempio, quando vogliamo che, attraverso un link al nostro (o a qualunque altro) indirizzo di posta
elettronica, venga predisposto automaticamente un messaggio con le opportune intestazioni e, all'occorrenza, parzialmente compilato.
Avvertenze e suggerimenti
Utilizzando questa funzione in associazione ad un link di posta elettronica presente in un vostro programma, potrete inserire automaticamente
tutte le informazioni utili per identificare il programma stesso e dare, quindi, una risposta appropriata (vedi esempio).
'Dichiarazione della funzione API (sostituire Private con Public in funzione delle necessità)
Esempio di utilizzo
Private Declare Function ShellExecute Lib "SHELL32" 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
Private Function SendEmail(sTo As String, _
Optional sCc As String, _
Optional sCcn As String, _
Optional sSubject As String, _
Optional sBody As String)
'Stringa dei parametri
Dim sCommand As String
'visualizza la finestra del programma di posta elettronica attivato, alle dimensioni normali
Const SW_SHOWNORMAL = 1
sCommand = "mailto:" & sTo 'indirizzo del destinatario (obbligatorio)
sCommand = sCommand & "?cc=" & sCc 'indirizzo in copia (opzionale)
sCommand = sCommand & "&bcc=" & sCcn 'indirizzo in copia nascosta (opzionale)
sCommand = sCommand & "&subject=" & sSubject 'oggetto (opzionale)
sCommand = sCommand & "&body=" & sBody 'testo della mail (opzionale)
'la funzione ShellExecute usa l'interprete dei comandi per lanciare (o aprire) un file o un programma.
'in questo caso, ShellExecute, viene utilizzata per lanciare automaticamente il client di posta predefinito
ShellExecute Me.hwnd, "open", sCommand, vbNullString, vbNullString, SW_SHOWNORMAL
End Function
Ecco come utilizzare e richiamare la funzione SendMail:
ipotizziamo che la Sub InviaEmail sia associata ad un controllo Label dove abbiamo inserito il nostro indirizzo di posta
Private Sub lblInviaEmail_Click()
Dim sNomeProgramma As String
'leggo il nome del programma
sNomeProgramma = App.EXEName
'costruisco una stringa con il nome del programma e la versione
sNomeProgramma = sNomeProgramma & " Versione " & App.Major & "." & App.Minor
'richiamo la funzione utilizzando solo i campi sTo (indirizzo del destinatario)
'sSubject (soggetto della mail) e sBody (testo del corpo della mail)
SendEmail "MioIndirizzo@MioProvider.it", , , sNomeProgramma, "Richiesta di informazioni"
End Sub