Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB.NET: Criando uma Label com sombra

No VB.NET não está disponível uma label que permita criar um sombreado no texto de modo a tornar-lo com mais destaque. Esta propriedade é muito comum em ambiente Office, em programas como o Excel, Word, etc, mas está disponível também em muitos outros programas.


Para criar uma label que permita criar um sombreado é preciso desenhar o texto através do namespace System.Drawing. O conceito é bastante simples: a label escreve um texto, que será a sombra, e através do evento onPaint() desenha-se o texto que fica por cima.

Depois é escondida a propriedade ForeColor (que define a cor do texto) porque esta não será a cor do texto mas sim da sombra e são criadas algumas novas propriedades:

  • OffsetX (define o offset, ou desvio, na vertical face ao texto inicial)
  • OffsetY (define o offset, ou desvio, na horizontal face ao texto inicial)
  • ForeColorFront (define a cor que fica por cima)
  • ForeColorBack (define a cor que fica por baixo – sombra)

É necessário então criar uma nova classe e utilizar o seguinte código:

Imports System.Drawing
Imports System.ComponentModel

Public Class ShadowLabel
    Inherits Label   

#Region "Properties"

    Private m_offsetX As Integer
    Private m_offsetY As Integer
    Private m_ForeColorFront As Color

    ''' <summary>
    ''' Definição do offset em X
    ''' </summary>
    <DefaultValue(0)> _
    <Category("Shadow")> _
    <Description("Definição do offset em X")> _
    Public Property OffsetX() As Integer
        Get
            Return m_offsetX
        End Get
        Set(ByVal value As Integer)
            m_offsetX = value
            Me.Invalidate()
        End Set
    End Property

    ''' <summary>
    ''' Definição do offset em Y
    ''' </summary>
    <DefaultValue(-1)> _
    <Category("Shadow")> _
    <Description("Definição do offset em Y")> _
    Public Property OffsetY() As Integer
        Get
            Return m_offsetY
        End Get
        Set(ByVal value As Integer)
            m_offsetY = value
            Me.Invalidate()
        End Set
    End Property

    ''' <summary>
    ''' Definição da cor da frente
    ''' </summary>
    <DefaultValue(GetType(Color), "RoyalBlue")> _
    <Category("Shadow")> _
    <Description("Definição da cor da frente")> _
    Public Property ForeColorFront() As Color
        Get
            Return m_ForeColorFront
        End Get
        Set(ByVal value As Color)
            m_ForeColorFront = value
            Me.Invalidate()
        End Set
    End Property

    ''' <summary>
    ''' Definição da cor de sombreado
    ''' </summary>
    <DefaultValue(GetType(Color), "White")> _
    <Category("Shadow")> _
    <Description("Definição da cor de sombreado")> _
    Public Property ForeColorBack() As Color
        Get
            Return Me.ForeColor
        End Get
        Set(ByVal value As Color)
            Me.ForeColor = value
            Me.Invalidate()
        End Set
    End Property



   
' Serve apenas para definir que a propriedade ForeColor
    ' não está disponível para alterar no editor e no design
    <Browsable(False), EditorBrowsable(EditorBrowsableState.Never)> _
    Public Overrides Property ForeColor() As System.Drawing.Color
        Get
            Return MyBase.ForeColor
        End Get
        Set(ByVal value As System.Drawing.Color)
            MyBase.ForeColor = value
        End Set
    End Property   

#End Region


   
' Define algumas propriedades por defeito
    Public Sub New()

        ' Definição dos valores iniciais de offset
        Me.OffsetX = 0
        Me.OffsetY = -1

        ' Definição das cores iniciais do texto
        Me.ForeColorFront = Color.RoyalBlue
        Me.ForeColorBack = Color.White   

    End Sub


   
' No evento Paint desenha o texto
    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

        MyBase.OnPaint(e)

        ' Desenha o texto que fica na frente
        Dim BackBrush As New SolidBrush(Me.ForeColorFront)
        e.Graphics.DrawString(Me.Text, Me.Font, BackBrush, OffsetX, OffsetY, StringFormat.GenericDefault)
        BackBrush.Dispose()

    End Sub


End
Class


No final é preciso compilar a aplicação e o controlo estará disponível na toolbar.

Este é um exemplo que pretende mostrar como criar uma label com uma sombra, mas também como utilizar algumas funcionalidades do namespace Drawing.

 

PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!


VB.NET: Criptografia - TripleDES

A segurança de dados é algo fundamental em qualquer aplicação e cada vez mais é um motivo de preocupação. Quando se guarda determinado tipo de informação, numa base de dados por exemplo, é importante que a mesma esteja segura, principalmente em alguns campos como é o caso de passwords, números de cartões de crédito, informações confidenciais, etc.

É aí que a criptografia entra, através da encriptação ou codificação de dados. A encriptação é a transformação de informação electrónica de texto legível em texto incompreensível, através de um cifra, também conhecido por algoritmo.

Este processo é bastante complexo mas a .Net Framework através da Namespace System.Security.Cryptography simplifica bastante, tornando-o acessível e fácil de utilizar. Existem diversas classes disponíveis que implementam diferentes tipos de encriptação, como é o caso de: AES (Advanced Encryption Standard), DES (Data Encryption Standard), RC2 (Rivest Cipher), Rijndael, TripleDES (Triple Data Encryption Standard), entre outras.

 

De entre todos os métodos de encriptação disponíveis, alguns são mais seguros do que outros, como é o caso do Rijndael ou do AES. No entanto e para este exemplo, será mostrado a utilização do TripleDES, por ser bastante simples de implementar.

Como curiosidade o TripleDES baseia-se no algoritmo DES que foi utilizado pelo governo norte-americano e que, actualmente, pode ser decifrado. Posteriormente foi desenvolvida uma versão melhorada onde o algoritmo corre três vezes com duas chaves simétricas: o TripleDES.


Para a implementação de uma encriptação utilizando o algoritmo TripleDES devemos criar a seguinte classe:


Imports
System.Text
Imports System.Security.Cryptography

''' <summary>
''' Encriptação simples usando TripleDES
''' (Triple Data Encryption Standard)
''' </summary>
Public Class Crypto

    Private Shared TripleDES As New TripleDESCryptoServiceProvider
    Private Shared MD5 As New MD5CryptoServiceProvider

    ' Definição da chave de encriptação/desencriptação
    Private Const key As String = "CHAVE12345teste"

    ''' <summary>
    ''' Calcula o MD5 Hash 
    ''' </summary>
    ''' <param name="value">Chave</param>
    Public Shared Function MD5Hash(ByVal value As String) As Byte()

        ' Converte a chave para um array de bytes 
        Dim byteArray() As Byte = ASCIIEncoding.ASCII.GetBytes(value)
        Return MD5.ComputeHash(byteArray)

    End Function   

    ''' <summary>
    ''' Encripta uma string com base em uma chave
    ''' </summary>
    ''' <param name="stringToEncrypt">String a encriptar</param>
    Public Shared Function Encrypt(ByVal stringToEncrypt As String) As String   

        Try

            ' Definição da chave e da cifra (que neste caso é Electronic
            ' Codebook, ou seja, encriptação individual para cada bloco)
            TripleDES.Key = Crypto.MD5Hash(key)
            TripleDES.Mode = CipherMode.ECB   

            ' Converte a string para bytes e encripta
            Dim Buffer As Byte() = ASCIIEncoding.ASCII.GetBytes(stringToEncrypt)
            Return Convert.ToBase64String(TripleDES.CreateEncryptor().TransformFinalBlock(Buffer, 0, Buffer.Length))   

        Catch ex As Exception
            MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)

            Return String.Empty

        End Try   

    End Function

  

    ''' <summary>
    ''' Desencripta uma string com base em uma chave
    ''' </summary>
    ''' <param name="encryptedString">String a decriptar</param>
    Public Shared Function Decrypt(ByVal encryptedString As String) As String   

        Try

            ' Definição da chave e da cifra
            TripleDES.Key = Crypto.MD5Hash(key)
            TripleDES.Mode = CipherMode.ECB   

            ' Converte a string encriptada para bytes e decripta
            Dim Buffer As Byte() = Convert.FromBase64String(encryptedString)
            Return ASCIIEncoding.ASCII.GetString(TripleDES.CreateDecryptor().TransformFinalBlock(Buffer, 0, Buffer.Length))

        Catch ex As Exception
            MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)

            Return String.Empty

        End Try   

    End Function

End Class

   

Depois, para a implementar na aplicação, é só necessário 
   

        Dim source As String = "vbtuga"

        ' Mostra o texto original
        Debug.WriteLine("Texto original  : " & source)

        ' Encripta a string
        Dim result As String = Crypto.Encrypt(source)

        ' Mostra o resultado da encriptação
        Debug.WriteLine("Texto encriptado: " & result)

        ' Decripta e mostra o texto original
        Debug.WriteLine("Texto decriptado: " & Crypto.Decrypt(result))   

   

Neste pequeno teste, o resultado é o seguinte (na Immediate Window):

Texto original     : vbtuga

Texto encriptado: 6ldtC7GfpGg=

Texto decriptado: vbtuga


Este artigo é um exemplo de encriptação de forma a tornar os dados e as aplicações mais seguras. Brevemente, assim que possível, irei mostra mais dois exemplos de encryptação em AES e
Rijndael.

Exemplo do artigo: DOWNLOAD DO FICHEIRO
   

PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!


VB.NET: Utilizando o controlo ComboBox

O controlo ComboBox é um controlo muito utilizado nas aplicações. É na realidade a combinação de uma TextBox com uma ListBox. Este permite que sejam definidos alguns estilos o que permite ao utilizado inserir ou escolher dados, ou apenas escolher.

Apesar de bastante simples de utilizar, existem diferentes formas de adicionar itens à lista. Este artigo pretende mostrar algumas das formas de adicionar itens à ComboBox.

A utilização de uma base de dados com fonte de dados é muito comum. Neste pequeno exemplo é lida uma tabela de Access, através de um OleDbDataAdapter e preenchido um DataSet. Depois é definida a fonte de dados (DataSource), o item a listar (DisplayMember) e o item que guarda o valor (ValueMember).

A utilização de parâmetros para o comando Transact-SQL é muito importante. Neste caso tratasse de um exemplo simples, mas o uso de parâmetros evita um grande número de problemas, com é o caso de: formatos das datas (não é necessário especificar o formato correcto), nomes com aspas simples (não é necessário substituir as aspas dos nomes, como é o caso de O’Brien), valores numérico (não é necessário formatar os números), etc.

Imports System.Data.OleDb

    ' No evento Form Load irá ser carregados os dados da base de dados na combobox
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Try

            Dim connString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\dados.mdb;"

            ' Inicia uma ligação à base de dados
            Using connection As New OleDbConnection(connString)

                ' Select Statement que irá mostrar todos os vendedores activos, 
                ' excepto o vendedor que será definido no parâmetro
                Dim SQL As String = "SELECT * FROM Vendedores WHERE activo = ? AND vendedor <> ?"

                ' Define o DataAdapter e os parâmetros. O DataAdapter guarda a ligação, não
                ' sendo necessário abrir com o comando connection.Open()
                Dim da As New OleDbDataAdapter(SQL, connection)
                da.SelectCommand.Parameters.Add("activo", OleDbType.Boolean).Value = True
                da.SelectCommand.Parameters.Add("vendedor", OleDbType.VarChar).Value = "Jorge Paulino"

                ' Preenche o Dataset com os valores da base de dados
                Dim ds As New DataSet
                da.Fill(ds)

                ' Preenche a combobox
                With Me.ComboBox1
                    .DisplayMember = "vendedor"
                    .ValueMember = "id"
                    .DataSource = ds.Tables(0).DefaultView 

                    ' Definições para autocomplete
                    .DropDownStyle = ComboBoxStyle.DropDown
                    .AutoCompleteMode = AutoCompleteMode.Suggest
                    .AutoCompleteSource = AutoCompleteSource.ListItems
                End With

                ' Insere um novo item geral na posição 0
                ' com uma descrição geral a indicar o tipo de lista
                Dim dr As DataRow
                dr = ds.Tables(0).NewRow
                dr.Item("id") = 0
                dr.Item("vendedor") = "Lista Vendedores"
                ds.Tables(0).Rows.InsertAt(dr, 0)

               
' Selecciona o item inserido
                Me.ComboBox1.SelectedIndex = 0 

            End Using

        Catch ex As Exception
            MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try 

    End Sub

 

Para verificar o item seleccionado, ou o valor, basta fazer o seguinte:

        Debug.WriteLine("Valor seleccionado: " & Me.ComboBox1.SelectedValue)

        Debug.WriteLine("Texto seleccionado: " & Me.ComboBox1.Text)


Depois, pode-se validar e forçar a seleccionar o item da lista. Para o fazer pode-se utilizar o seguinte código, que verifica se o texto da ComboBox está disponível na sua lista, e caso contrário, mostra uma mensagem de erro e selecciona o item por defeito.

Este exemplo não se aplica se o estilo seleccionado for o DropDownList.

    ' No evento Leave verifica se o item escolhido/inserido existe na lista
    Private Sub ComboBox1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.Leave

        ' Guarda a informação do texto actual
        Dim comboText As String = Me.ComboBox1.Text 

        ' Pesquisam texto na ComboBox e caso não encontre
        If Me.ComboBox1.FindString(comboText) = -1 Then
            MessageBox.Show("O vendedor seleccionado não é válido")
            Me.ComboBox1.SelectedIndex = 0
        End If 

    End Sub

 

Mas existem métodos mais simples de carregar dados na ComboBox. Pode-se, por exemplo, usar um destes métodos para inserir itens à ComboBox em modo run-time .

        ' Define um array de meses
        Dim items() As String = {"Jan", "Fev", "Mar", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"}

        ' Adiciona o itens à ComboBox e define o estilo com 
        ' DropDownList, ou seja, apenas é possível seleccionar
        With Me.ComboBox2
            .DropDownStyle = ComboBoxStyle.DropDownList
            .Items.AddRange(items)
        End With
   

Finalmente um método bastante usual que insere 50 itens com o formato “01”, “02”, “03”, …

        ' Ciclo que insere 50 itens
        For x As Byte = 0 To 49
            Me.ComboBox2.Items.Add("Item " & x.ToString.PadLeft(2, "0"))
        Next

São pequenos exemplos que pretendem apenas mostrar alguma alternativas de inserir dados em modo run-time à ComboBox, em especial com a utilização de uma base de dados em Access como fonte de dados.                                           

 

PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!




Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico