Scrittura di Shell in VB6.0 (Seconda Parte)
Andrea Raimondi  rainaple@tin.it
Terza parte

Avvertimento:sebbene nel corso della nostra programmazione useremo anche caratteristiche di VB6 molto del codice potrà girare anche su VB4.0 o VB5.0
Tutto il codice scritto in questo contesto è stato attentamente verificato

Interfaccia utente, alcune semplici scelte

Dobbiamo scegliere alcuni dettagli che rendano sempre chiara la funzionalità della Shell con cui l'utente si trova a confronto
Quando Microsoft ha scelto l'icona del Floppy Disk come elemento della Toolbar per File->Salva ha fatto si che l'utente riconoscesse la funzione unica di quel pulsante
Questo è parte integrante della funzionalità di una Shell, l'interfaccia
In VB6.0 impostando la proprietà Style dei CommandButton ad 1 possiamo associare un'icona o un colore di sfondo al pulsante, l'effetto è estremamente attraente e professionale, pertanto scegliamo una segnaletica univoca di icone e colori
In VB6 ci sono icone del traffico, scegliamo ad esempio

Ognuno può creare le sue convenzioni, ma una decina di impostazioni potrebbero risultare troppo difficili da seguire per tutti ( utenti e programmatori )
Diciamo poi ad esempio che alcuni cambiamenti nello stato della Shell potrebbero cambiare il grado di pericolo di una operazione ( Poniamo 2 diversi condizioni:

in una shell dove è indispensabile avere almeno 1 account attivo la (2) è molto pericolosa )
Come fare?
Definire delle costanti di PERICOLO e creare la ApplyDangerLevel() come segue:
Const DANGER_MAXIMUM%=1
Const DANGER_MEDIUM%=2
Const DANGER_MINIMUM%=3
Public Sub ApplyDangerLevel(cmd As CommandButton, level As Integer)
Select Case level
Case DANGER_MAXIMUM
cmd.Picture=LoadPicture("highlevel.ico")
cmd.BackColor=RGB(255,0,0)
Case DANGER_MEDIUM
cmd.Picture=LoadPicture("mediumlevel.ico")
cmd.BackColor=RGB(0,255,0)
Case DANGER_MINIMUM
cmd.Picture=LoadPicture("lowlevel.ico")
cmd.BackColor=RGB(0,255,0)
End Select
End Sub
"highlevel.ico" "mediumlevel.ico" "lowlevel.ico" sono nomi fittizzi per 3 immagini con semafori o altri segnali indicatori di pericolo
RGB(red,green,blue) crea un colore basandosi sui valori di Rosso, Verde e Blu
Per usare questa sub si suppone che (cmd.Style=1 )=True, altrimenti nessuna impostazione avrà valore
Un'altra scelta importante è lo stile dei dialoghi ( termine di VC++ che in VB potremmo tradurre con "Finestre di dialogo a scelta obbligatoria" o modali ( termine questo di diretta derivazione VC++ dove CDialog ( immaginatelo come un Form ) dispone del metodo DoModal() ( simile a Show 1 ) )
Ad esempio in un dialogo con i 3 pulsanti "Salva" "Esci" "Annulla" ed una casella di testo preceduta dalla Label "Inserire qui un dato pericoloso:" come avvisare l'utente che scrivere "DISTRUGGI" e poi cliccare ( o clickare, se si preferisce ) su Salva rimuoverà WIN.COM?
Una scelta è mostrare una MsgBox che dica "Attenzione: Questa è una scelta potenzialmente distruttiva, vuoi veramente proseguire?" con sotto due pulsanti Si e No
Un'altra scelta è mostrare un'icona di pericolo in fondo al form e mostrare il ToolTip "Cliccare per ottenere informazioni sugli elementi di pericolo nel dialogo", oppure mostrare in una etichetta tali elementi
O ancora avvisare l'utente quando la casella di testo prende il focus con una MsgBox "Attenzione: inserire DISTRUGGI in questa casella di testo e poi cliccare su Salva distruggerà un file indispensabile per Windows"
Altre scelte sono riservate alla creatività di ogni programmatore, ma sempre e comunque seguire una direzione in tutta la Shell, questo permetterà di identificare sempre certi elementi e trovare presto la propria direzione nell'uso del prodotto

Desktop: tutte le icone sono lì

In ogni Shell che si rispetti c'è una finestra detta Desktop dove le funzioni della Shell o dei file da noi scelti sono attivabili con 1 o 2 click del mouse ( eventi Click() e DblClick() )
Per attivare certe icone di default basta usare delle Image o PictureBox caricando a Run-Time o a Design-Time le icone, il discorso si fa più complesso per icone custom, si potrebbe usare un IMAGE_INFO, crearne un array ridimensionabile ( Dim Icons() As IMAGE_INFO e poi Redim Icons(n To n' ) ) e riempirlo in base ai dati contenuti in un file o in una directory ( un Dir() ricorsivo )
Il punto è il riempimento dello schermo e la posizione delle icone, tutti problemi facilmente risolvibili
Proviamo:
Dim IconsHeight%
Dim IconsWidth%
Dim Last_Top%
Dim Last_Left%
Public Function GetNewTop%()

End Function
Public Function GetNewLeft%()

End Function
Queste funzioni permettono di sapere quali devono essere il top ed il left per ogni icona aggiunta
Sapendo che ogni icona occupa IconsHeight+7 e IconsWidth+7 possiamo sapere quante icone si possono inserire
Public Function IconsNumberInHeight%()

End Function
Public Function IconsNumberInWidth%()

End Function
Con anche un -1 di arrotondamento sicuro possiamo sapere quante icone vanno nello schermo
Diciamo di avere
Screen.Height=3000
IconsWidth=40
Screen.Width=4000
IconsHeight=60
Per Height avremo 3000/60 e per Width 4000/40
Height=39 e Width=99
Abbiamo 39 icone per linea in verticale per un totale di 99 linee in orizzontale, in totale 3861 icone, per essere sicuri di non incorrere in errori sottraiamo 50 icone da questo valore e avremo 3811 icone totali
Certo, questo valore è superiore a quello di moltissimi schermi, uno schermo a 14" arriva a malapena a 60 icone ( ho contato quelle del mio Desktop che è quasi pieno e sono 55 )
Tralasciando questi aspetti pratici sappiate che il metodo funziona e sta a voi applicarlo ai vostri Desktop
Il modo migliore poi per associare ad una icona personalizzata una funzione?
Tag
E non sto scherzando, ogni controllo ha una proprietà .Tag, associandola ad un nome di file EXE ( un meccanismo più fine potrebbe prevedere un meccanismo come quello dei CLSID di Windows per lanciare il Pannello di Controllo della Shell o il File Manager associato specificando una stringa come [@CTRL] o [@FILEMAN], un altro formato potrebbe essere @CPANEL@ o ancora &PANEL&, io personalmente perferisco il primo, ma a ciascuno la sua scelta, ricordate che un carattere di controllo quale § o @ è indispensabile per sapere se parliamo di un file eseguibile o di una funzionalità interna della shell potremmo scrivere nel Click(Index%) della matrice di controlli )
Shell Icons(Index%).Tag
Basta, funzionerà sempre se il file eseguibile è presente, altrimenti lancerà un eccezione e terminerà, a voi usare le istruzioni On Error GoTo ( ne potrei parlare in futuro, ma ora restiamo nel Desktop invece di aprire la Guida in Linea )
Le icone di sistema: esse non hanno nessun testo sotto come quelle di Windows 95, e mentre alle icone di programmi si può associare .ToolTipText come il nome del file che aprono quelle di sistema...?
O associamo ad esse un ToolTip di default o usiamo un elemento di IMAGE_INFO, da mostrare in fondo al desktop come stringa di guida, tra le due soluzioni la più immediata è .ToolTipText, ma la seconda permette di eliminare i lunghi periodi d'attesa ( lunghi relativamente ) per mostrare subito ( o quasi ) la guida sul comando di sistema

Speravo di parlare stavolta anche delle impostazioni di sistema ( leggi Pannello di Controllo ), ma credo che di questo argomento si parlerà nella prossima sezione della serie
Nel frattempo abbiamo parlato di un elemento fondamentale di ogni shell, il Desktop