O Namespace MY em VB.Net 2005

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.

  1. Abrir o My Project no Solution Explorer e ir para o separador Resources;
  2. Iremos dar-lhes o mesmo nome FICHEORIGINAL e FICHENOVO 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.

Publicado na edição 14 (PDF) da Revista PROGRAMAR.