Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Guida al Visual Basic .NET - Il Namespace My

Guida al Visual Basic .NET

Capitolo 106° - Il Namespace My

<< Precedente Prossimo >>


Il namespace My è una novità di Visual Basic 2005: è stato introdotto per fornire un accesso facilitato a classi del framework utili usate molto spesso, diminuendo così il codice necessario e di conseguenza in tempo impiegato a scriverlo. My contiene oggetti singleton aggiornati durante la creazione dell'applicazione nell'ambiente di sviluppo: ad esempio My.Settings viene popolato con le risorse e le impostazioni aggiunte dall'utente, oppure i membri di My.Forms sono aggiunti ogniqualvolta viene aggiunto un form all'applicazione e costituiscono una scorciatoia per richiamarli senza definirne altre istanze. Ecco una panoramica dei membri di My:

  • My.Application : espone informazioni sull'applicazione corrente, da dove sia stata lanciata, quale utente la stia utilizzando e con quali permessi e le informazioni assembly quali versione e cultura
  • My.Computer : permette un'interazione rapida e veloce con le periferiche del computer quali mouse e tastiera, con il filesystem, con la memoria, con i formati audio e video e permette di gestire le porte seriali e la stampante
  • My.Forms : espone una proprietà per ogni form definito, corrispondente alla sua istanza di default
  • My.Resources : contiene oggetti che fanno da wrapper a ciascuna risorse utilizzata nel progetto e referenziata esplicitamente
  • My.Settings : ogni proprietà corrisponde ad un'impostazione definita nei Settings del progetto. Un oggetto può essere di qualsiasi tipo supportato e può avere scopo differente a seconda che venga usato dall'utente o dal programma
  • My.User : restituisce informazioni sull'utente che sya usando il computer
  • My.WebServices : permette di usare servizi web e richiamare metodi web senza dovere scrivere lo stesso codice più volte

 

My.Application

Ecco una lista dei membri più significativi di questo oggetto:

  • ApplicationContext : restituisce il contesto applicativo in cui viene eseguito il programma, tramite cui si può ottenere il Main Form
  • CommandLineArgs : restituisce una lista in sola lettura a tipizzazione forte di stringhe contenente tutti gli argomenti passati da console al programma. Ond'evitare confusione, per chi provenisse da altri linguaggi, il primo argomento non è il nome del programma stesso ma proprio il primo argomento che viene dopo la dichiarazione dell'applicazione
  • Culture : restituisce un oggetto CultureInfo che permette di avere informazioni sulla cultura corrente, in particolare il modo in cui vengono formattati valori e date
  • Deployment : restituisce un oggetto ApplicationDeployment che permette di scaricare e aggiornare il programma scaricando i nuovi files da internet. L'uso di questo oggetto verrà trattato in un altro momento, benchè nel momento in cui scrivo, un capitolo al riguardo non sia ancora stato inserito nell'indice della guida
  • Info : restituisce un oggetto AssemblyInfo che consente di visualizzare le informazioni sul programma, quali titolo, versione, autore, società, descrizione ecc... Queste impostazioni possono essere fornite al compilatore tramite Designer o tramite codice, ma anche questo punto verrà trattato in seguito
  • Log : restituisce un oggetto Log del namespace VisualBasic.Logging, i cui metodi permettono di interagire con i file di log, scrivendo messaggi o report di errori riscontrati a run-time
  • OpenForms : se il progetto corrente è una Windows Application, ottiene una collezione di tutti i form aperti
  • SaveMySettingsOnExit : se il progetto corrente è una Windows Application, determina qualora tutti i campi della classe My.Settings debbano essere automaticamente salvati prima dell'uscita dal programma
  • DoEvents : se il progetto corrente è una Windows Application, processa tutti i messaggi windows in coda. Questo permette che gli eventi siano generati e opportunamente gestiti anche durante lo svolgimento di una procedura particolarmente lunga (come quella di ricerca dei file), oppure che la grafica del form venga correttamente aggiornata, impendendo all'applicazione di assumere un aspetto che verrebbe altrimenti interpretato dall'utente come "bloccato". Sebbene sia molto comodo usare DoEvents in casi del genere, i principi Microsoft suggeriscono invece di utilizzare un controllo BackgroundWorker oppure un thread separato creato manualmente
  • GetEnvironmentVariable(S) : restituisce il valore della variabile d'ambiente di nome S. Le variabili d'ambiente sono create, usate e gestite dal sistema operativo e contengono informazioni sulle directory, sui file e sui dettagli tecnici dell'hardware e del software. È possibile ottenere in questo modo, ma anche attraverso la classe System.Environment. Non è sicuro modificare alcune di esse, come ad esempio, la cartella di Windows
  • Run(C()) : avvia una nuova istanza di questa applicazione passandole gli argomenti definiti nell'array di stringhe C()

Fra le altre cose, questa classe espone anche degli eventi interessanti: Startup e Shutdown vengono lanciati rispettivamente quando l'applicazione viene aperta o chiusa, ma possono facilmente essere sostituiti dai più semplici FormLoad e FormClosing; interessanti sono invece gli eventi StartupNextInstance, lanciato quando viene avviata un'altra istanza dell'applicazione, UnhandledException, generato ogniqualvolta si riscontra un errore non gestito (e quindi utilissimo per non far apparire la famosa messagebox di errore critico) e NetworkAvaiabilityChanged, che riporta un cambiamento nello stato di usabilità della rete (ossia quando ci si connette o disconnette). Gestire correttamente tali eventi non può che portare benefici alla solidità e all'efficienza del programma.

My.Computer

Ad eccezione di Name, che restituisce il nome del computer, tutte le altre proprietà esposte sono oggetti figli i quali a loro volta mettono a disposizione altre funzionalità: in questo namespace vengono riassunti i metodi più utili sul piano dell'audio, del filesystem, del registro di sistema e del recupero informazioni. Ecco una lista di quasi tutte le proprietà (Ports è stata tralasciata poichè raramente usata, mentre Registry non verrà analizzato, per ovvi motivi):

  • Audio
  • Play(S, M) : esegue un suono memorizzato in un file Audio Wave (*.wav), definito dal percorso S. È possibile specificare anche, nell'overload, le modalità con cui avviene la riproduzione. Esse sono espresse da un enumeratore a tre valori: Background (musica di sottofondo), BackgroundLoop (la musica viene ripetuta all'infinito, fino a quando non la si ferma manualmente), WaitUntilComplete (aspetta che tutto il file sia riprodotto prima di passare all'istruzione successiva). Ad ogni modo, per la costruzione di un Media Player è assai meglio ricorrere all'aiuto delle librerie DirectX.AudioVideoPlayback
  • PlaySystemSound(S) : esegue un suono di default di Windows, definito dall'enumeratore S di tipo System.Media.SystemSound. I valori riportati sono quasi gli stessi dell'enumeratore che definisce le icone della MessageBox: infatti i suoni in questione non sono altro che quelli riprodotti all'apparire di una MessageBox
  • Stop : interrompe l'esecuzione di un suono in background

Clipboard (gli appunti)

  • Clear : pulisce la clipboard, annullando qualsiasi suo contenuto
  • Contains... : le funzioni che iniziano per "Contains" determinano quale tipo di dato contengano gli appunti, se immagini, suoni, files, testo o altro
  • Get... : le funzioni che iniziano con "Get" restituiscono il contenuto della clipboard secondo i vari formati
  • Set... : allo stesso modo, le funzioni Set impostano il contenuto della clipboard secondo i vari formati

Clock

  • LocalTime : restituisce la data e l'ora corrente memorizzate sul computer
  • TickCound : restituisce il numero di tick passati dall'accesione del computer. Un tick corrisponde a un milionesimo di secondo, ma questa proprietà, stranamente, restituisce il risultato in millisecondi

FileSystem

  • CopyDirectory(S, D, O) : nel suo primo overload, questa procedura copia la directory indicata da S nella directory D; se D non esiste viene creata; se esiste e O (Overwrite) = True, viene sovrascritta
  • CopyDirectory(S, D, Show, Cancel) : nel suo secondo overload, copia la directory da S a D; Show è un valore che indica se visualizzare la finestra di copia predefinita di windows, mentre Cancel specifica se è possibile annullare l'operazione tramite tale finestra
  • CopyFile(S, D, ...) : copia un file da S a D. Presenta overload uguali a quelli sopra descritti
  • CreateDirectory(D) : crea una nuova directory secondo il percorso D fornito
  • CurrentDirectory : la directory corrente
  • DeleteDirectory(D, F) : elimina una cartella D, specificando tramite F, se si debba generare un'eccezione qualora la cartella non sia vuota
  • DeleteDirectory(D, Show, Recycle, Cancel) : elimina la cartella D, eventualmente visualizzando la finestra di dialogo di windows; è possibile specificare se eliminare completamente la cartella o se mandarla nel cestino con Recycle, mentre Cancel indica se sia o meno concessa all'utente la possibilità di annullare l'operazione
  • DeleteFile(F, ...) : elimina il file F. Presenta overload uguali a quelli sopra descritti
  • DirectoryExists(P) / FileExists(P) : determinano se il file o la cartella P esistano o meno
  • Drives : restituisce una collezione in sola lettura a tipizzazione forte di DriveInfo contenente informazioni sui vari drives disponibili
  • FindInFiles(P, S, Case, Recurse) : restituisce una collezione in sola lettura a tipizzazione forte di String contenente i nomi di tutti i files trovati. P è la cartella in cui cercare, S è la parola da cercare nel file, Case indica se la ricerca è case sensitive oppure no, mentre Recurse indica se analizzare anche le sottodirectory
  • GetDriveInfo(P) / GetDirectoryInfo(P) / GetFileInfo(P) : restituiscono informazioni sul percorso specificato
  • GetDirectories(P, R) / GetFiles(P, R) : restituiscono rispettivamente le cartelle e i files presenti nella directory P, eventualmente agendo ricorsivamente se R = True
  • GetName(P) : restituisce il nome del file o della cartella (la sua ultima parte)
  • GetParentPath(P) : restituisce la cartella che si trova a livello superiore rispetto al file o alla directory P
  • GetTempFileName : crea un nuovo file nella cartella temporanea del computer, vuoto, e ne restituisce il percorso
  • MoveDirectory : esattamente come CopyDirectory, solo che la cartella di partenza viene rimossa
  • MoveFile : come sopra
  • OpenTextFieldParser(P, W()) : apre un parser di file di testo sul file P. Questo oggetto legge i valori in esso contenuti seguendo le direttive specificate nel ParamArray W. Se si tratta di dati a larghezza fissa, W specifica le larghezza dei dati; se si tratta di dati separati da caratteri speciali, W specifica quei caratteri
  • ReadAllBytes / ReadAllText : leggono tutti i bytes o tutto il testo del file specificato e li/lo restituisce/ono
  • RenameDirectory(P, N) / RenameFile(P, N) : rinominano il file o la directory P con un nuovo nome N (solo il nome, non tutto il percorso)
  • SpecialDirectories : restituisce un oggetto le cui proprietà indicano il percorso delle cartelle speciali, come i documenti, le immagini, la cartella temporanea, i video, eccetera...
  • WriteAllText / WriteAllBytes : scrivono tutto il testo o tutti i bytes dati all'interno del file specificato

Info

  • AvaiablePhysicalMemory : l'ammontare di memoria fisica libera sul computer, in bytes
  • OSFullName : il nome completo del sistema operativo
  • OSPlatform : identifica la piattaforma del sistema operativo
  • TotalPhysicalMemory : l'ammontare totale di memoria fisica del computer, in bytes

Keyboard

  • AltKeyDown, CtrlKeyDown, ShiftKeyDown : restituiscono True se Alt, Ctrl o Shift risultano premuto nell'istante in cui la funzione viene richiamata
  • CapsLock, NumLock, ScrollLock : restituiscono True se sono attivi CpasLock, NumLock o ScrollLock
  • SendKeys(K, W) : simula la pressione del tasto K sulla finestra attiva, opzionalmente aspettando finchè tale messaggio non venga processato (W = True)

Mouse

  • ButtonsSwapped : determina se i pulsanti destro e sinistro risultano scambiati
  • WheelExists : determina se il mouse sia dotato di rotellina
  • WheelScrollLines : determina di quante linee si debba scorrere quando la rottelina venga ruotata di una tacca

Network

  • DownloadFile(S, D) : scarica il file S sul computer, salvandolo come D. È possibile specificare come terzo e quarto parametro un nome utente e una password nel caso il server in questione ne richieda uno. Il quinto parametro, se presente, specifica se visualizzare la finestra di dialogo di default di windows; il sesto indica l'opzionale timeout di connessione. Il settimo specifica se sovrascrivere un file esistente e il settimo se sia possibile annullare l'operazione. Tutti i parametri dopo il secondo sono opzionali e forniti dagli overloads della funzione
  • IsAvaiable : determina se il computer sia connesso o meno a una rete
  • Ping(IP, Timeout) : esegue un'operazione di Ping sul server IP (Ip può essere un Ip valido o un Dns). Il ping serve per controllare se il server sia attivo: viene inviato un pacchetto di bytes di controllo; se risponde, significa che è online e funzionante, altrimenti ci sono dei problemi. Si può specificare opzionalmente un Timeout di millisecondi trascorso il quale non si prosegua oltre nell'operazione di Ping
  • UploadFile : carica il file su un server. I parametri sono gli stessi di DownloadFile

Screen

  • AltScreen : restituisce un array di tutti i dislapy del sistema
  • BitsPerPixel : il numero di bit associati ad un unico pixel in memoria
  • Bounds : restituisce un oggetto Rectangle contenente le dimensioni dello schermo
  • DeviceName : il nome del device associato allo schermo
  • PrimaryScreen : lo schermo primario
  • WorkingArea : l'area di lavoro

 

My.User

Espone poche proprietà, la più importante delle quali è Name, che restituisce il nome dell'utente attualmente loggato. Ci sono altre funzioni come IsInRole che permettono anche di definire il ruolo dell'utente (ad esempio Amministratore o Proprietario, oppure un diverso stato se appartiene a un dato gruppo di computer).

My.Resources

È un contenitore in grado di immagazzinare qualsiasi file o risorsa: immagini, video, suoni, file di dati, di testo, stringhe e altro ancora. Tutto quello che viene immesso nell'applicazione attraverso questo wrapper è inglobato nell'assembly finale, mentre durante lo sviluppo del software, tali file vengono temporaneamente salvati nella cartella Resources del progetto. È possibile aggiungere una nuova risorsa dalle proprietà del progetto (Nome progetto->Click col destro->Properties), come mostrato in questa immagine:

MyResources1.jpg
Tramite il menù in alto a sinistra nella finestra delle risorse si può scegliere quale tipo di dati aggiungere: la lista al centro visualizza risorse per tipo, quindi in una volta saranno visibili solo stringhe, solo immagini, solo suoni, eccetera... Il pulsante a fianco, "Add Resource" permette di aggiungere una risorsa di quel tipo; le altre sottovoci presenti sono delle scorciatoie per risorse usate spesso come stringhe, immagini o file di testo. Una volta aggiunta una risorsa tramite il designer, il compilatore riscrive automaticamente tutto il codice nascosto di My.Resources, rendendo disponibili come proprietà tutti i dati immessi. A seconda del tipo specificato, tale proprietà sarà restituita in maniera differente:

  • Stringhe e file di testo vengono restituiti come String
  • Le immagini vengono restituite come System.Drawing.Bitmap
  • I suoi vengono restituiti come System.IO.UnmanagedMemoryStream
  • Le icone vengono restituite come System.Drawing.Icon
  • I file di altro tipo vengono restituiti come array di bytes

 

My.Settings

Per mezzo di questo oggetto è possibile salvare le impostazioni dell'applicazione che devono permanere tra due sessioni distinte. I settaggi vengono salvati can il supporto dell'XML e della serializzazione in una cartella dal nome chilomentrico all'interno della directory dell'utente corrente. Il nome è stabilito usando le informazioni dell'assembly e il suo strong name. All'avvio, tutti i campi vengono automaticamente impostati dal programma, che si preoccupa prima del caricamento del form, di recuperare il file XML e leggerne il contenuto. In questo risiede la comodità di My.Settings, poichè concede al programmatore la libertà di dedicarsi alla scrittura del codice significativo, delegando poi alla macch

ina l'esecuzione di compiti noiosi quali il caricamento delle impostazioni.
Anche in questo caso, si opera su My.Settings attraverso una finestra nella sezione Properties del progetto. La schermata è semplice e intuitiva, e permette di creare non solo valori di tipi semplici come String, Boolean o Double, ma anche tipi complessi, sia value che reference, anche definiti dallo sviluppatore: il requisito minimo è che siano serializzabili (come si vedrà in seguito, di default, tutti gli oggetti sono serializzabili). Un'applicazione diffusa e molto richiesta per la sua semplicità consiste nel poter salvare valori associati a controlli. Ad esempio, si vuole che il font, il testo e il colore di un pulsante vengano conservati tra una sessione e l'altra. In questo caso, ma anche negli altri, il lavoro da fare non risulta affatto lungo o complesso. Per prima cosa bisogna creare tre nuovi valori attraverso l'interfaccia My.Settings dal pannello di controllo delle proprietà di progetto: uno di tipo Font, uno String e uno Color. Ecco:

MySettings.jpg
(Si faccia caso alla finestra delle proprietà nell'angolo a destra: anche da lì, come se fosse un normale controllo, si possono modificare i campi di My.Settings, eventualmente specificando un commento in Description) Lo scope User o Application riguarda la finalità per cui il campo viene creato: in genere le proprietà User sono modificabili, mentre quelle Application sono ReadOnly. Ora che sono stati creati gli opportuni valori, bisogna collegarli alle rispettive proprietà del pulsante (ovviamente dopo aver creato anche il pulsante). Selezionato il pulsante, bisogna espandere, nella finestra delle proprietà, la voce "(Application Settings)". Al suo intero sarà presente soltanto la voce "Text", alla quale si assegnerà il valore ButtonText, tramite la piccola finestra di dialogo che apparirà cliccandoci sopra. Per le altre due proprietà, ForeColor e Font, bisogna cliccare sul pulsantino coi tre puntini di sospensione sull'elemento appena sopra, "(PropertyBinding)": verrà visualizzata una griglia completa di tutte le proprietà, dando quindi la possibilità di collegare ciascuna al corrispettivo valore. Risultato:

MySettingsBinding.jpg
Ora, cambiando un valore di My.Settings, cambierà anche l'aspetto del controllo. Le impostazioni vengono caricate automaticamente all'inizio, ma per salvare bisogna o richiamare il metodo My.Settings.Save oppure impostare a True la proprietà My.Application.SaveMySettingsOnExt.
Per quanto riguarda gli altri metodi di questa classe, è necessario annoverare solo Save, Reload e Reset: dei primi due è facilmente intuibile la funzione; il terzo, invece, reimposta al loro valore di default tutti i valori che vengono dichiarati con Persist = True. Inoltre, sono presenti anchq quattro utili eventi: SettingsChanging (generato prima che venga modificata un'impostazione), PropertyChanged (dopo che è stato cambiato il valore di un'impostazione), SettingsLoaded (all'avvio o dopo aver chiamato i metodi Reload o Reset) e SettingsSaving (prima che vengano salvate le impostazioni). Bisogna notare che gli eventi generati prima che avvenga qualcosa possono anche modificare il comportamento dell'azione oppure anche annullarla, sempre ispezionando le possibilità offerte dai membri di e.

My.Forms e My.WebServices

Espongono le istanze di default di tutti i Form o di tutti i Web Service definiti nel progetto: il secondo tipo di oggetto non è trattato in questa guida.

<< Precedente Prossimo >>
A proposito dell'autore

C#, TypeScript, java, php, EcmaScript (JavaScript), Spring, Hibernate, React, SASS/LESS, jade, python, scikit, node.js, redux, postgres, keras, kubernetes, docker, hexo, etc...