Access: il Re è nudo (o almeno trasparente)

Tempo fa avevo sentito il bisogno di ravvivare le mie maschere Access, sempre uguali, smorte, amorfe, piatte: in una parola, tristi. Mi ero tuttavia arenato constatando che, al di là di qualche bella immaginetta di sfondo, più di tanto non si poteva fare; perfino i pulsanti di comando possono contenere soltanto o testo o icona, alternativamente! certo, XP aveva cambiato l'aspetto dei controlli, rendendoli più gradevoli, ma mi rodevo il fegato per le splendide applicazioni che VB consentiva di creare. Ma casualmente, come spesso accade, mi sono imbattuto qualche giorno fa in un gradevole progettino, e voglio qui ora, per chi come me ne sente l'esigenza, condividere una tecnica interessante e semplice per applicare l'effetto di (semi)trasparenza ai controlli e ai report di Access (il progetto è di Maurizio Facciuti di Accessgroup.it). Si tratta di un paio di API e di un semplice accorgimento: rendere la maschera desiderata (o il report) di tipo Popup prima di chiamare la funzioncina che qui vi illustro:

Private Const GWL_EXSTYLE = -20
Private Const LWA_COLORKEY = 1
Private Const LWA_ALPHA = 2
Private Const WS_EX_LAYERED = &H80000

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal cKey As Long, ByVal bAlpha As Long, ByVal dwFlags As Long) As Long

Sub RendiTrasparente(hwnd As Long, tVal As Integer)

   Call SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) Or WS_EX_LAYERED)
    Call SetLayeredWindowAttributes(hwnd, 0, (255 * tVal) / 100, LWA_ALPHA)
End Sub

Private Sub Form_Open(Cancel As Integer)

    RendiTrasparente Me.hwnd, 50   '0 del tutto trasparente, 100 opaco
End Sub

Basta incollare questo codice nell'IDE del VBA di Access, nella sezione della Maschera (o del Report: in tal caso occorre modificare opportunamente la Sub che si occupa dell'apertura: Report_Open) desiderati. All'apertura si noterà subito l'effetto di trasparenza impostato nella chiamata (0: del tutto trasparente, 100: del tutto opaco).

Vi sono soltanto alcune cosette da tener presente:

1) non ho testato il codice per revisioni di Access precedenti alla 2002 (Access XP), ma dovrebbe funzionare senza problemi (forse, fino ad Access 2000 compreso, l'oggetto Report non espone la proprietà Popup)

2) i controlli espandibili (combobox, listbox, lo stesso DTPicker), finchè sono contratti restano in trasparenza, ma una volta espansi diventano opachi : o(

3) non ho trovato il modo (forse non si può) di regolare la trasparenza di un singolo controllo all'interno di una maschera. Quindi, o tutti, o nessuno :o)

Le prospettive di implementazione mi sembrano interessanti comunque, pur con queste limitazioni, almeno per solleticare un pochino la fantasia nella costruzione di quegli orrendi Pannelli comandi preimpostati!! :o)

Una semplice gestione delle presenze. Con Excel

Uno dei miei primi esercizi, coronati dal maggior successo nel mio piccolo ufficio, è stato lo sviluppo (in Excel) di una semplice gestione delle presenze (intese come registrazione degli orari di entrata/uscita e calcolo dello straordinario, del recupero, delle ferie, malattie, permessi vari, ecc.).

Siccome il modellino è cresciuto, si è espanso in funzioni e ha raccolto il consenso di diversi colleghi, anche di profili professionali diversi, ho deciso tempo fa di riscriverlo. E ne è venuto fuori un lavoretto discreto, essenziale, che fa il suo lavoro.

Ora, per rompere il ghiaccio con questo blog, ho pensato di condividere la mia esperienza... 'programmatoria' con chi si sente interessato o soltanto incuriosito.

Il foglietto Excel è composto da un foglio di dati generali, invisibile all'utente, più dodici sottofogli (ma va? uno per ogi mese dell'anno? :o) ) e fa uno uso moderato di VBA e di funzioni definite dall'utente, richiamate nei fogli all'occorrenza. Ci sono così funzioni specifiche per il calcolo dello straordinario, del recupero, dell'orario minimo di uscita, ecc.

Avendo tempo e voglia (perchè no, se ne nascerà uno scambio con qualcuno?) si potrebbe abbellire ulteriormente, (ab)usando delle opzioni di convalida dei dati, delle formattazioni condizionali, e di quant'altro Excel metta a disposizione.

Qualcuno raccoglie il mio invito? :o) Contattatemi in privato al mio indirizzo .

Edit agosto 2016: questo articolo ha suscitato nel tempo molto interesse. E nel tempo il modellino si è ampliato. Eccone ora scaricabile una copia funzionante: clicca qui.