VB
File di risorse, come utilizzarli

I file di risorse sono dei moduli che possono contenere elementi di varia natura: immagini, testo, suoni, ecc. Tali file possono essere manipolati attraverso l’editor di risorse che è un’aggiunta (Addin) di Visual Basic.

I file di risorse, di Visual Basic, hanno estensione .RES, per questo costituiscono dei file di risorse standard di Windows (manipolabili con un qualsiasi editor di risorse). Utilizzando i file di risorse il programmatore può occuparsi esclusivamente della gestione del codice e delegare a persone non esperte di programmazione, la gestione delle informazioni da integrare nell’applicazione. Per esempio quando si deve implementare un’applicazione che mostra informazioni in varie lingue, il programmatore potrà dedicarsi a come recuperare le informazioni e mostrarle, mentre l’esperto di lingue si potrà dedicare all’organizzazione degli elementi che costituiscono il file di risorse (che successivamente verrà integrato al resto dell’applicazione). Prima di cominciare a descrivere i concetti che tratteremo, specifichiamo che ad un’applicazione è possibile associare un solo file di risorse e che è possibile sostituire un file di risorse senza “ricompilare” il progetto. Di seguito elenchiamo i principali argomenti che illustreremo.

1. Vedremo come creare e modificare un file di risorse attraverso l’editor.
2. Vedremo come organizzare le risorse inserite in un file e come recuperarle da programma, attraverso le funzioni:
LoadResData, LoadResPicture, LoadResString.
3. Creeremo un’applicazione “multilingua”.
4. Descriveremo i controlli: CommandDialog e Animation.
5. Descriveremo l’istruzione Enum ed alcuni elementi dell’API.

L’editor di Risorse
Come accennato per creare e gestire i file di risorse, Visual Basic mette a disposizione un editor. Descriviamo come procedere per usarlo.

• Create un nuovo progetto .
• Inserite “Editor Risorse VB 6” da gestione aggiunte; quest’azione fa comparire una nuova icona sulla ToolBar dell’IDE (che bisogna cliccare per avviare l’editor).

L’editor presenta una ToolBar con una serie di comandi che permettono di compiere le seguenti azioni.
•Creare, aprire o salvare un file di risorse.
•Aggiungere risorse dei seguenti tipi:
Testo, Icona, Bitmap, Risorsa personalizzata (per esempio suono o video).
Dall’editor le risorse sono organizzate in un albero, ogni nodo raggruppa un certo tipo di risorsa. Nel file le risorse sono identificate attraverso un identificatore (Id) alfanumerico.. In particolare c’è il nodo tabella stringa (le risorse di tipo testo sono raggruppate in una tabella), il nodo icona ecc. ed i nodi di tipo Custom che possono essere personalizzati; per esempio nel nostro caso il nome del nodo Custom è stato rinominato come SUONI. Dopo che il file di risorse è stato creato per unirlo al progetto basta salvarlo. Questa operazione ha come effetto la creazione di una nuova cartella, nell’albero del progetto, di nome “Documenti Correlati”. In essa è, appunto, contenuto il file di risorse (nel nostro caso Progetto1.RES). Per familiarizzare con l’editor facciamo qualche semplice esempio. Supponiamo di voler inserire in un file di risorse una stringa e un suono. Per inserire la stringa, sulla toolbar dell’editor, selezioniamo l’icona modifica stringa, tale selezione farà comparire una tabella con due punti d’ingresso: ID e testo stringa. In Id si specifica la chiave che identifica la stringa mentre nell’altro campo si specifica il contenuto della stringa. Per inserire un suono, invece, bisogna utilizzare l’icona aggiungi risorsa personalizzata che fa comparire una finestra dalla quale è possibile selezionare il file sonoro. Naturalmente gli elementi (suoni, immagini, ecc.) inseriti in un file di risorse sono opportunamente convertiti in binario cosi da poter essere inclusi nell’applicazione. Dopo aver inserito le risorse ed averle individuate opportunamente con degli ID (per esempio ID 120 per la stringa e ID 130 per il suono), possiamo salvare il file di risorse attraverso il comando salva. Come è possibile recuperare queste risorse da programma? Basta utilizzare le istruzioni Visual Basic che tra poco descriveremo.

L’Acchiappa Risorse
Visual Basic, per leggere il contenuto dei file di risorse, mette a disposizione tre funzioni.
1.LoadResString, restituisce una stringa di testo, la sintassi è la seguente:
LoadResString (indice), dove indice è obbligatorio è rappresenta un numero o una stringa (ID) che identifica la risorsa nella tabella delle stringhe. Nell’esempio di prima è il numero 120.
2.LoadResPicture, restituisce un’immagine bitmap, un’icona o un cursore. La sintassi è le seguente: LoadResPicture(indice, formato) dove indice è l’identificatore e formato è una costante che specifica il formato dei dati che restituisce. In particolare il formato può assumere i valori specificati nella Tab. 1.
Costante Valore Descrizione
VbResBitmap 0 Risorsa bitmap
VbResIcon 1 Risorsa icona
VbResCursor 2 Risorsa cursore
Tab. 1: Valori che si possono attribuire al parametro formato della Loadres Picture.
3.LoadResData, restituisce una matrice di Byte. Questa funzione viene utilizzata per caricare le risorse personalizzate per esempio file sonori, filmati ecc. La sintassi è la seguente: LoadResData (indice, formato) indice come al solito è l’identificatore, mentre formato può essere uno dei valori specificati nella Tab. 2
Impostazione Descrizione
1 Cursore
2 Bitmap
3 Icona
4 Menu
5 Finestra di Dialogo
6 Stringa
7 Directory di tipi di carattere
8 Tipo di carattere
9 Tabella tasti di scelta
10 Risorsa definita dall'utente
12 Cursore gruppo
14 Icona gruppo

Tab. 2: Valori per il parametro formato della LoadResData.

Noi illustreremo solo alcuni di questi valori. Per esempio se volessimo caricare la risorsa di tipo testo in una form dovremmo utilizzare la seguente istruzione:

LabelEsempio = LoadResString(120).

Per la risorsa di tipo file sonoro o file AVI le istruzioni da considerare sono più complesse, dato che bisogna capire come elaborare la matrice di byte che restituisce la funzione. A tal fine per i file sonori ci viene in aiuto l’API di Windows che fornisce la funzione sndPlaySound. Per gestire i file video (AVI) invece, utilizzeremo il controllo Animation (animazione) insieme al controllo CommonDialog (finestre di dialogo comuni).

SndPlaySound
Iimportare i seguenti elementi dalla libreria WINMM.DLL.

Public Declare Function sndPlaySound Lib “WINMM.DLL”
Alias “sndPlaySoundA” (lpszSoundName As Any,
ByVal uFlags As Long) As Long
Public Const SND_ASYNC = &H1    
‘ Produce suoni in modo asincrono
Public Const SND_NODEFAULT = &H2
‘ Non utilizza il suono predefinito
Public Const SND_MEMORY = &H4 
‘ lpszSoundName punta a un file di memoria


La sndPlaySound esegue un suono contenuto in un file sonoro, nel registro di sistema o nel file Win.ini. Noi siamo interessati al primo caso. La funzione ha due parametri, il primo è lpszSoundname che specifica il suono da eseguire; è di tipo Any quindi può accettare qualsiasi tipo, visto che Any disabilita il controllo del tipo. L’altro parametro è uFlags un flag che specifica come elaborare il suono, tale parametro ammette vari valori (combinabili), noi utilizziamo solo i valori: SND_ASYNC, SND_NODEFAULT, SND_MEMORY. Se il parametro uFlags è nullo l’esecuzione del suono è terminata.

 

Animation e CommonDialog
Il controllo Animation è contenuto nel file Mscomct2.ocx (che bisogna aggiungere al progetto).
Il controllo Animation permette di eseguire file AVI non dotati di suoni. I metodi, del controllo, che utilizzeremo sono: Play, Open e Close.

• Open, apre un file .avi per l’esecuzione, close lo chiude.
• Play, esegue un file .avi precedentemente caricato nel controllo Animation. Descriviamo solo la sintassi del metodo Play (le altre sono abbastanza semplici).

Animation1.Play [= ripetizione, inizio, fine].


Ripetizione specifica quante volte verrà eseguito il file. Inizio specifica il fotogramma iniziale, il valore massimo è 65535. Fine specifica il fotogramma finale anche in questo caso il valore massimo è 65535. Il controllo CommonDialog è contenuto nel file comdlg32.ocx. Esso mette a disposizione una serie di finestre per l’esecuzione di operazioni come: apertura e salvataggio di file, impostazione delle opzioni di stampa, selezione dei colori e dei tipi di carattere.

Metodo Finestra di dialogo visualizza
ShowOpen Apri
ShowSave Salva con nome
ShowColor Color
ShowFont Carattere
ShowPrinter Stampa o Opzioni di stampa
ShowHelp Attiva il motore della Guida

Tab. 3: Metodi e tipi di finestra visualizzata dal controllo Common Dialog

Il controllo inoltre permette di visualizzare la Guida in linea, utilizzando il motore della guida di Windows. In altre parole il controllo è l’intermediario tra Visual Basic e la DLL Commdlg.dll di Windows che, appunto, fornisce gli elementi da visualizzare. Nella Tab. 3 sono elencati i metodi del controllo e il tipo di finestra visualizzata. Noi utilizzeremo il metodo ShowOpen che visualizza la finestra per aprire dei file. Il tipo di file da selezionare si specifica attraverso il metodo Filter, del quale descriviamo brevemente la sintassi.

CommonDialog.Filter [= descrizione1 |filtro1
|descrizione2 |filtro2...]


Descrizione specifica il tipo di file per esempio AVI. Filtro specifica l’estensione dei file da selezionare. Per separare i valori di descrizione e filtro deve essere usato il simbolo pipe “| “ (ASCII 124). Allora nel nostro caso scriveremo:

CommonDialog1.Filter = “avi (*.avi)|*.avi”


dove la descrizione è: avi (*.avi) e viene mostrata nella casella di riepilogo “tipo file” della finestra di dialogo.

Applicazione Poliglotta
Ora descriviamo come usare i vari elementi introdotti. A tal fine creiamo un’applicazione che gestisce risorse (messaggi, suoni e filmati, …) in varie lingue. Nell’applicazione prevedremo la possibilità di selezionare la lingua d’interesse e in base ad essa personalizzare una form. La personalizzazione consisterà nel caricamento degli elementi necessari dal file di risorse. In particolare l’applicazione funziona nel modo seguente. Dopo aver selezionato la lingua, in un combobox vengono inserite le

filerisorsefig2.jpg (13732 byte)
Fig. 2: Mostra come organizzare le varie risorse nel file.

etichette “video” e “suono” (espressi nella lingua scelta), in un textbox viene mostrato un messaggio, mentre in una picturebox viene caricata la bandiera della nazione in cui la lingua è parlata. Se sul combobox verrà selezionata l’etichetta “suono” sarà eseguita una risorsa sonora mentre se verrà selezionata l’etichetta “video” verrà aperta una finestra che permetterà di selezionare un file AVI. Inoltre sulla form sono previste delle label che permettono di avviare o stoppare il suono o il file AVI. Per creare l’applicazione procedere nel modo seguente. Creare un nuovo progetto nel quale inserire una form, un modulo e un file di risorse. Sulla form inserire i seguenti elementi: una Picturebox, che mostrerà la bandiera; due OptionButton, che permetteranno di selezionare la lingua; una label, per l’etichetta del combo; un ComboBox, che conterrà due valori che permetteranno di selezionare l’elemento da eseguire (Video oppure Suono), un RichTextBox (o un textbox multilinea) che conterrà un messaggio; un controllo Animation e un controllo CommandDialog che serviranno per mostrare i file AVI. Tra i file del vostro computer cercate i suoni, i file Avi e le icone da mostrare sulla form e sistemateli in una directory facilmente selezionabile. Costruite il file di Risorse con le indicazioni seguenti e osservando la Fig. 2. Per il momento pensiamo di gestire solo due lingue: inglese ed italiano. Nel file di risorse allora bisogna prevedere: l’immagine della bandiera italiana e di quella inglese, le stringhe video e suono (in inglese ed in italiano), le stringhe inizio e fine, le stringe per l’etichetta che specifica il ruolo del combobox, le stringhe per il corpo del messaggio, una icona per il mouse da mostrare quando il mouse è sulle label controllano dei file sonori e AVI. Per recuperare le risorse organizziamo i loro ID nel modo seguente. Le risorse in italiano le facciamo iniziare dall’Id 100, quelle in inglese dall’Id 200, mentre per capire in quale posizione si trovano le etichette del combo, i cursori, i suoni ecc. utilizziamo i valori specificati nel tipo enum che introdurremo tra poco. Ricordiamo che il tipo enum serve per dichiarare delle variabili di enumerazione; la sintassi è semplice ed immediata, basta racchiudere tra le parole chiavi Enum ed End Enum le stringhe da numerare. Allora nel modulo (.BAS) del progetto inseriamo la definizione delle costanti e le funzioni dell’API che permettono di eseguire i file sonori.

 
Option Explicit
Public Const SetItaliano = 100
Public Const SetInglese = 200
Public Enum Risorse
combo = 1
comandi = 10
tipo = 20
icone = 30
frase = 40
Cursore = 50
suoni = 60
End Enum
Public Id As Long
Global SuonoB() As Byte
Sub InizioSuono(ByVal Id As Integer)
SuonoB = LoadResData(Id, “Suoni”)
sndPlaySound SuonoB(0), SND_ASYNC Or SND_NODE
FAULT Or SND_MEMORY
End Sub
Sub FineSuono()
    sndPlaySound ByVal vbNullString, 0&
End Sub


Notate che combo=1 indica, che le etichette del combo hanno un offset di 1 rispetto al punto d’inizio (al SetItaliano, …). Le procedure InizioSuono e FineSuono servono ad eseguire o terminare un file sonoro attraverso la sndPlaySound, notate che viene usata la LoadResData per caricare la risorsa Suono il cui identificatore è specificato con il parametro Id. Il suono è caricato in un array di byte. Adesso passiamo ad implementare la form. Innanzitutto rinominate i suoi elementi nel modo seguente: OptionIta, OptionIng, ComboTipo e LabelTipo (il combo che permette di selezionare il tipo di elemento), LabelStart e LabelStop (le label per controllare i suoni e i video), Body (il Textbox che permette di visionare il testo del messaggio); PictureTop (la picture che mostra la bandiera). Nella form e nei suoi elementi inserite il seguente codice.

Private Sub Form_Load()
Opzioni
End Sub


Nella Form_Load richiamiamo la procedura Opzioni che permette di capire quale lingua è selezionata (di default considerate l’italiano).

Private Sub Opzioni()
If OptionIng = True Then
   Id = SetInglese
End If
If OptionIta = True Then
   Id = SetItaliano
End If
Rinfresca
End Sub


La “Opzioni” setta la variabile Id sulla lingua scelta e fa il refresh della form.

Private Sub Rinfresca()
Me.ComboTipo.Clear
Me.ComboTipo.AddItem LoadResString(Id + combo)
Me.ComboTipo.AddItem LoadResString(Id + combo + 1)
LabelTipo = LoadResString(Id + tipo)
PictureTop = LoadResPicture(Id + icone, vbResIcon)
LabelStart = “”; LabelStop = “”
Body = LoadResString(Id + frase)
End Sub


La Rinfresca imposta il combo e la sua label, mostra la bandiera nella PictureTop, ripulisce le label di comando e carica il messaggio. Naturalmente nei due Option_Click inseriamo il seguente codice.

Private Sub OptionIng_Click()
Opzioni
End Sub
Private Sub OptionIta_Click()
Opzioni
End Sub
 

In ComboTipo_Click prevediamo il seguente codice che permette di settare le label con le quali si controlla l’elemento selezionato (Video o Suono).

Private Sub ComboTipo_Click()
If ComboTipo.Text <> “” Then
LabelStart = LoadResString(Id + comandi)
LabelStart.BackColor = &H8000000D
LabelStart.ForeColor = &H8000000E
LabelStart.Alignment = 2
ImpostaCursore LabelStart
LabelStop = LoadResString(Id + comandi + 1)
LabelStop.BackColor = &H8000000D
LabelStop.ForeColor = &H8000000E
LabelStop.Alignment = 2
ImpostaCursore LabelStop
End If
End Sub

Nella procedura precedente è usata la ImpostaCursore che setta l’immagine specificata nel file di risorse. Sub ImpostaCursore(label As label) With label .MousePointer = 99 .MouseIcon = LoadResPicture(Cursore, vbResCursor) End With End Sub

Per le label di comando prevediamo il seguente codice.

Private Sub LabelStart_Click()
If LabelStart.Caption <> “” Then
  Select Case ComboTipo.ListIndex
  Case combo - 1
   Animation1.Visible = True
   videoon
  Case combo
   InizioSuono Id + suoni
  End Select
End If
End Sub
Private Sub LabelStop_Click()
If LabelStart.Caption <> “” Then
Select Case ComboTipo.ListIndex
  Case combo - 1
    Animation1.Stop
    Animation1.Visible = False
  Case combo
    FineSuono
End Select
End If
End Sub

La procedura LabelStart_Click in base al valore del combotipo eseguirà un suono o un file AVI. Per quest’ultimo è prevista la procedura videoon che utilizza i controlli Animation e CommonDialog.

Sub videoon()
   If CommonDialog1.FileName = “” Then
     With CommonDialog1
      .Filter = “avi (*.avi)|*.avi”
      .ShowOpen
     End With
   End If
    If CommonDialog1.FileName <> “” Then
   With Animation1
      .Open CommonDialog1.FileName
      .Play
   End With
   End If
End Sub