O VB.NET 2005 introduziu uma característica muito interessante em relação às outras versões, criando o namespace My
. O namespace My
contém um conjunto de objectos que simplifica o acesso a diversas áreas do .NET Framework, como o sistema de ficheiros ou dados da aplicação. Este namespace não está disponível noutras linguagens .NET. Para além de reduzir a quantidade de código (na implementação de diversas funcionalidades era necessário recorrer a APIs) o namespace My
expõe alguns objectos que são gerados dinamicamente à medida que se acrescentam características aos projectos. Por exemplo, cada classe form que se acrescenta a um projecto fica disponível através de uma propriedade distinta do objecto My.Forms
.
Objectos do Namespace My
My.Application
: expõe informação acerca da aplicação actual, tal como o seu percurso no sistema de ficheiros, a sua versão, e modo de autenticação do utilizador;My.Computer
: encerra um conjunto de subclasses destinadas a lidar com as características mais importantes do computador, tais como o sistema de ficheiros, subsistemas de áudio e vídeo, memória, teclado, rato, rede, portas série, impressoras, etc;My.Forms
: apresenta uma propriedade por cada classe form definida no projecto e possibilita referenciar a instância desse form sem se ter de criar explicitamente um objecto da mesma;My.Resources
: possui um objecto derivado por cada recurso(mais à frente explicarei melhor o que é um recurso) definido no projecto;My.Settings
: expõe uma propriedade por cada valor de configuração (setting) definida nas configurações do projecto;My.User
: devolve informação sobre o utilizador actualmente registado, possibilitando a implementação de mecanismos de autenticação;My.WebServices
: mantém uma propriedade por cada serviço web que o projecto referencie, possibilitando o acesso aos mesmo sem haver a necessidade de criar um objecto proxy de cada vez que seja necessário invocar um método no serviço web (este não será tão abordado).
My.Application
Aqui é possível obter aspectos relacionados com a aplicação em si, tal como a versão, o título, quem a produziu, a empresa, entre outros… Vamos criar um botão que nos mostra uma MessageBox
com alguma desta informação.
Dim sbInfo As New System.Text.StringBuilder With My.Application.Info sbInfo.Append("Titulo: " & .Title & vbNewLine) sbInfo.Append("Versão: " & .Version.ToString & vbNewLine) sbInfo.Append("Descrição: " & .Description & vbNewLine) sbInfo.Append("Empresa: " & .CompanyName & vbNewLine) sbInfo.Append("Direitos: " & .Copyright) End With MessageBox.Show(sbInfo.ToString(), "Informação do Sistema", MessageBoxButtons.OK, MessageBoxIcon.Information)
Podemos também chamar a aplicação com parâmetros.
Dim fInfo As New IO.FileInfo(Application.ExecutablePath) System.Diagnostics.Process.Start(fInfo.Name.ToString(), "m nome:anolsi") 'Aqui é chamada uma nova instância da aplicação
No event load do form principal obtemos os parâmetros:
For Each s As String In My.Application.CommandLineArgs Select Case s Case "m" : MessageBox.Show("Bem-Vindo") 'Argumento que mostra a mensagem de boas vindas Case "nome:" & ChrW(0) To "nome:" & ChrW(65535) : MessageBox.Show(s.Substring(5)) 'Argumento que mostra o nome do utilizador End Select Next
My.Computer
Através do My.Computer
vamos ler um ficheiro para uma TextBox
, alterá-lo e depois gravá-lo. Antes de mais, no código, vamos acrescentar duas linhas no início do código antes de Public Class ...
(zona de declarações):
'Aqui iremos declarar constantes. Public Const FICHEORIGINAL As String = "c:exemplo.txt" Public Const FICHENOVO As String = "c:copia.txt"
Private Sub btnAbrir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAbrir.Click If My.Computer.FileSystem.FileExists(FICHEORIGINAL) Then 'Verifica se o ficheiro existe Me.txtFiche.Text = My.Computer.FileSystem.ReadAllText(FICHEORIGINAL) 'Lê o texto todo para a TextBox End If End Sub Private Sub btnGravar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGravar.Click My.Computer.FileSystem.WriteAllText(FICHEORIGINAL, Me.txtFiche.Text, False) 'Escreve o texto da TextBox para o ficheiro sem adicionar (sobrepõe). End Sub Private Sub btnCopiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCopiar.Click My.Computer.FileSystem.CopyFile(FICHEORIGINAL, FICHENOVO) 'Copia o ficheiro FICHEORIGINAL para FICHENOVO End Sub
Este constitui ainda uma excelente porta de comunicação entre o programa e os periféricos do computador, como o rato (My.Computer.Mouse
), o teclado (My.Computer.Keyboard
), o monitor (My.Computer.Screen
), as portas (My.Computer.Ports
). Ainda mais importante é o My.Computer.Network
, que nos permite fazer Ping
, DownloadFile
, UploadFile
… Funções que em versões anteriores nos obrigavam a ter mais linhas de código.
Aqui está uma maneira simples de verificarmos o acesso ao P@P:
If My.Computer.Network.IsAvailable() Then 'Verifica se está ligado a alguma rede Try 'O Try...Catch apanha o erro no caso de estar ligado a uma rede mas não à internet If My.Computer.Network.Ping("portugal-a-programar.org") Then 'Tenta fazer um ping para "portugal-a-programar.org" MessageBox.Show("Acessível!", "Teste de Ligação ao P@P", MessageBoxButtons.OK, MessageBoxIcon.Information) Else MessageBox.Show("Inacessível!", "Teste de Ligação ao P@P", MessageBoxButtons.OK, MessageBoxIcon.Information) End If Catch ex as Exception MessageBox.Show("Não foi possível realizar o pedido de Ping.", "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try Else MessageBox.Show("Não está ligado a nenhuma rede.", "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Error) End If
Como podem verificar é bastante simples de usar. É claro que as nossas constantes poderiam ser variáveis, obtidas até a partir de uma DialogBox
onde iríamos obter o ficheiro para abrir ou para gravar, ou mesmo para copiar. No entanto isso fica fora das competências do namespace My
.
My.Forms
O My.Forms
permite, pura e simplesmente, acesso aos formulários criados, sendo também possível recorrendo simplesmente ao nome do formulário. Exemplo:
frmPrincipal.text = "Aqui fica o título!" My.Forms.frmPrincipal.text = "Aqui fica o título!"
A única vantagem consiste na ajuda do intelli sense que é disponibilizada. Ao escrevermos My.Forms.
, o intelli sense apresenta todos os formulários criados até à altura. Outro exemplo é verificar se um determinado formulário está ou não a ser exibido e caso não esteja, mostra-o:
If My.Forms.frmSec Is Nothing Then My.Forms.frmSec.Show()
My.Resources
Os recursos estão muito ligados às settings, as quais vamos tratar a seguir, mas constantes porque não é possível ser alterado a nível do código em runtime. Vamos criar um exemplo onde iremos colocar os valores das constantes criadas a propósito do My.Computer
.
- Abrir o My Project no Solution Explorer e ir para o separador Resources;
- Iremos dar-lhes o mesmo nome
FICHEORIGINAL
eFICHENOVO
com os mesmos valores.
Private Sub btnAbrir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAbrir.Click If My.Computer.FileSystem.FileExists(My.Resources.FICHEORIGINAL) Then Me.txtFiche.Text = My.Computer.FileSystem.ReadAllText(My.Resources.FICHEORIGINAL) End Sub Private Sub btnGravar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGravar.Click My.Computer.FileSystem.WriteAllText(My.Resources.FICHEORIGINAL, Me.txtFiche.Text, False) End Sub Private Sub btnCopiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCopiar.Click My.Computer.FileSystem.CopyFile(My.Resources.FICHEORIGINAL, My.Resources.FICHENOVO) End Sub
My.Settings
Tal como referi anteriormente o que distingue as settings dos resources é o facto de as settings se comportarem como variáveis globais, enquanto os resources como constantes globais. Ainda de referir que as settings podem ser de qualquer tipo como as variáveis mas que não são “esquecidas” ao terminar o programa. Estas possuem uma extrema relevância, uma vez não necessitamos de guardar as variáveis em ficheiros ou no registry do Windows, nem que sejamos confrontados com a necessidade de proteger a informação, ou garantir que ela não é alterada. A própria linguagem encarrega-se disso. Para criarmos uma nova setting, vamos ao My Project e, como não poderia deixar de ser, ao separador Settings. Vamos criar uma setting cuja função é guardar o último tamanho do formulário. Essa setting será do tipo System.Drawing.Size
. Convém ter um valor por defeito. Depois inserirmos o seguinte código:
Private Sub frmPrincipal_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Me.Size = My.Settings.Tamanho End Sub Private Sub frmPrincipal_ResizeEnd(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.ResizeEnd My.Settings.Tamanho = Me.Size My.Settings.Save() End Sub
Para voltar-mos a coloca o valor por defeito das settings, devemos incluir esta instrução quando o quisermos fazer:
My.Settings.Reset()
My.User
O My.User
serve essencialmente para saber se o utilizador está autenticado, qual o nome do utilizador e se este é administrador, limitado, convidado, etc. De salientar que se o My.User
for usado em aplicações Windows este refere-se ao utilizador que está a executar a aplicação, enquanto em aplicações web este refere-se a quem acede à aplicação e não onde ela está a correr.
If My.User.IsAuthenticated Then 'Verifica se o utilizador está autenticado 'O valor do My.User.Name será algo do tipo "Nome_do_ComputadorUtilizador" e por isso vamos separá-los pela Dim parte() As String = My.User.Name.Split(""c) Dim tipo As String = "" If My.User.IsInRole(ApplicationServices.BuiltInRole.Administrator) Then 'Verifica se é administrador através do IsInRole tipo = "É Administrador" Else tipo = "Não é administrador" End If MessageBox.Show(String.Format("Nome do Computador: {0} " + vbNewLine + "Utilizador: {1} " + vbNewLine + "{2}", parte(0), parte(1), tipo), "Utilizadores", MessageBoxButtons.OK, MessageBoxIcon.Information) Else 'Caso o utilizador não esteja autenticado (caso do convidado) a aplicação termina MessageBox.Show("Não está autenticado.", "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Error) Me.Close() End If
Conclusão
Como podemos constatar, a existência deste namespace veio trazer muitas vantagens ao programador, servindo até como um ponto de partida para as funcionalidades mais simples e, mesmo assim, aqui apenas foram apresentadas algumas funcionalidades do namespace My
, porque o artigo não possui extensão suficiente para serem abordadas todas as suas funcionalidades. Mesmo assim o leitor pode, a partir deste momento, explorar sozinho todas as outras funcionalidades do namespace.