Propriedade TopMost VB .NET

Em certos momentos um formulário (janela) de um programa precisa ficar a frente de todas as outras. Em outros casos essas telas precisam ficar a frente de tudo. Quando eu digo tudo, me refiro a tudo mesmo, até as janelas do Windows se necessário. Por isso mostrarei hoje a propriedade TopMost.

A propriedade TopMost, é do tipo booleana, ou seja, aceita True ou False e é utilizada nesses casos onde o formulário desejado precisa ficar a frente de tudo. Seja para chamar a atenção do usuário ou para não deixar que ele execute qualquer outra tarefa.

Continue lendo

Herança em programação Orientada a Objeto

No post de hoje, vou mostrar como é feita a herança no Visual Basic. Mas antes, uma pequena descrição a respeito de herança em programação Orientada a Objeto.

Herança é um conceito pelo qual é possível criar uma classe (subclasse) com base em uma existente. Essa nova classe herda todos os atributos, comportamentos e implementações da classe herdada (superclasse).

Diagrama mostrando a herança entre classes.

Diagrama mostrando a herança entre classes.


Continue lendo

Passo a Passo de uma Criptografia MD5

No post de hoje, mostrarei a vocês quais os passos para criptografar uma String. Além de aprender[bb] como criptografar um texto com a Criptografia MD5, vocês poderão observar o que acontece com o texto digitado a cada processo que ele passa.

Iniciando o desenvolvimento

A primeira coisa que devemos fazer, é importar as Namespace que tratam texto e que contém as classes de criptografia[bb].

Imports System.Text
Imports System.Security.Cryptography

Interface para o teste

Como você podem ver na imagem abaixo, acima de cada TextBox há uma Label explicando o que será exibido nele.

Formulário utilizado para exibir os passos da criptografia

Formulário utilizado para exibir os passos da criptografia

Código com passo a passo para a criptografia MD5

Abaixo temos o código necessário para criptografar o texto. No próprio código já estou explicando o que cada linha faz.

    Private Sub btnConverter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConverter.Click
        ' Limpa TextBox que exibirão o Resultado
        TextBox2.Clear()
        TextBox4.Clear()
        TextBox5.Clear()

        ' Variável utilizada para gerar o primeiro Hash
        Dim Ue As New UnicodeEncoding ' Também pode ser usado o UTF8Encoding
        ' Vetor que receberá a Hash gerada pela codificação acima
        Dim ByteSourceTexto() As Byte
        ' Variável que gerará a Hash MD5
        Dim md5 As New MD5CryptoServiceProvider
        ' Vetor que receberá a Hash MD5 gerada pela variável acima
        Dim Bytehash() As Byte

        ' Gera Hash de Bytes a partir do texto digitado.
        ' ** É gerado um Vetor **!
        ByteSourceTexto = Ue.GetBytes(TextBox1.Text)

        ' For each: pega gada item do vetor gerado acima
        ' 1º Codificação. Bytes do Texto Digitado
        For Each b In ByteSourceTexto
            TextBox2.Text &= b
        Next

        ' Gera Hash de Bytes com a codificação MD5
        ' ** É gerado um Vetor! **
        Bytehash = md5.ComputeHash(ByteSourceTexto)

        ' For each: pega gada item do vetor gerado acima
        ' 2º Criptografa String acima em uma hash de byte MD5.
        For Each b In Bytehash
            TextBox4.Text &= b
        Next

        ' Último Passo:
        ' 3º Converte os Bytes para uma base String de 64 Digitos.
        ' Este último texto seria, por exemplo, gravado no banco de dados.
        TextBox5.Text = Convert.ToBase64String(Bytehash)
    End Sub

E como resultado[bb] temos o seguinte:

Resultado do passo a passo da criptografia

Resultado do passo a passo da criptografia

E por hoje é. Até uma próxima.

Implementando resolução do problema das 100 portas

Hoje mostrarei como implementar a resolução do problema das 100 portas em Visual Basic .NET. Enquanto navegava na grande rede de computadores internet, encontrei esse problema e achei que seria interessante mostrá-lo aqui.

O que é o problema das 100 portas

O problema das 100 portas cria a seguinte situação: você tem 100 portas em linha e todas as portas estão inicialmente fechadas. Você deve passar por cada porta 100 vezes. A cada vez que você passa pela porta, você deve fechá-la se estiver aberta, ou abri-la se estiver fechada. Na primeira vez você deve passar por todas as portas. Na segunda vez deve passar somente nas portas que são múltiplo de 2 (2, 4, 6, …). Na terceira vez, somente pelas portas que são múltiplos de 3 (3, 6, 9, …). Faça isso até a porta 100.

A pergunta: Ao final, quando passar por todas as portas, quais estarão abertas e quais estarão fechadas?

Resolvendo o problema

Nesse primeiro modelo que faremos para resolver o problema, levaremos o enunciado ao pé da letra e passaremos por todas as portas.

Para os exemplos, utilizarei uma Console Application do Visual Basic .NET.

Resolvendo com um For dentro de outro

    Sub Main()
        Dim portas(100) As Boolean

        For pass = 1 To 100
            For porta = pass - 1 To 99 Step pass
                portas(porta) = Not portas(porta)
            Next
        Next

        For porta = 0 To 99
            Console.WriteLine("Porta " & (porta + 1) & " está " & If(portas(porta), "Aberta", "Fechada"))
        Next
        Console.Read()
    End Sub

No código acima, temos a situação onde o código segue o que o enunciado pede.

Primeiro fazemos um laço de repetição For que passa por todas as portas e dentro do laço fazemos outro, que passa somente pelos múltiplos dessa porta; isso é possível porque cada interação do segundo For, “pula” os número das portas com o auxilio da variável pass, que é o número da porta do primeiro laço.

Dentro do segundo laço, falamos que cada porta deve ficar no status contrário ao que está, executando o código = Not portas(door).
No final fazemos um laço exibindo o status da porta ao fim das iterações. Aqui temos um trecho interessante, o condicional If está montado em linha (If(portas(porta), "Aberta", "Fechada")). Essa é uma ótima maneira de mostrarmos um valor mesmo que haja uma condição para a exibição. Essa forma segue a seguinte estrutura:

If (condição booleana, valor verdadeiro, valor falso)

Resolvendo o problema de outra forma

Quadrado PerfeitoNo próximo exemplo, o código é um pouco menor, porque só será necessário um laço de repetição. Dessa vez é utilizada a matemática para resolver o problema.

Segundo discursarão sobre a resolução do problema (ver fonte ao final do texto), somente as portas com números que são quadrados perfeitos ficam abertas.

Quadrado perfeito em matemática, é um número inteiro não negativo que pode ser expresso como o quadrado de um outro número inteiro.

Fonte: Wikipédia

Dito isso, vamos ao código:

    Sub Main()
        Dim portas(100) As Boolean

        For i = 1 To 10
            portas(i ^ 2 - 1) = True
        Next
        For porta = 0 To 99
            Console.WriteLine("Porta " & (porta + 1) & " está " & If(portas(porta), "Aberta", "Fechada"))
        Next

        Console.ReadLine()
    End Sub

Para conseguirmos somente os quadrados perfeitos, utilizamos a expressão i ^ 2, onde i é o número da iteração e o símbolo ^ (circunflexo) indica que o número (i) está sendo elevado a potencia (2). Seria o equivalente a i2.

Fazemos isso dentro do laço que vai de 1 a 10, porque a porta máxima é a 100 e 102. = 100. Para sabermos qual porta do array portas será aberta, devemos passar o índice do array, por isso a expressão i ^ 2 – 1. Como dito antes, sabemos o quadrado perfeito com o i ^2, o -1 da expressão é para ‘acertar’ o cálculo para o array que é baseado em zero (inicia em zero). Dessa forma quando i = 2, o resultado do quadrado seria 4, mas na verdade a porta 4 está na posição 3 do array.

Por hoje é só galera, espero que tenha gostado e entendido.

Fonte sobre problema das 100 portas.

Bloco Using no VB .NET

Hoje vamos ver algo do Visual Basic .NET, que particularmente não vejo muito, mas é bastante interessante; o bloco Using. Esse bloco permite que seja criada uma instancia de uma classe e ao final do bloco tal instancia é retirada da memória, sem que seja necessário, por exemplo, utilizar o método .Dispose().

Declarando bloco Using

A declaração básica desse bloco:

    Using classe As New classeQualquer

    End Using

Como no exemplo, a variável chamada classe, só é válida dentro do bloco Using, ou seja, se tentar utilizá-la fora do bloco, será acusado erro por falta de declaração de variável.

Importante: a classe que será instanciada no bloco Using, DEVE implementar a interface IDisposable. Uma classe que implementa tal interface, indica que conseguem por si própria, desalocar a memória que fora separada para uma instância.

Utilizando o bloco Using

Vamos ver em um exemplo prático, como utilizar o bloco Using.

Para o exemplo a seguir, utilizarei um código responsável por ler um arquivo de texto. Isso porque utilizarei a classe TextReader que implementa a interface IDisposable.

Using reader As System.IO.TextReader = System.IO.File.OpenText("arquivo.txt")
    Dim linhaArquivo As String

    linhaArquivo = reader.ReadLine()
    Do Until linhaArquivo Is Nothing
        Console.WriteLine(linhaArquivo)
        linhaArquivo = reader.ReadLine()
    Loop
End Using

Vejamos o que está sendo feito linha a linha.

Linha 1: criamos uma instancia da classe TextReader e para tanto, utilizamos o método OpenText, que lê um arquivo de texto e retorna um TextReader.

Linha 2: declaramos uma variável que será utilizada para ler cada linha do arquivo.

Linha 4: lê uma linha do arquivo utilizando o método ReadLine.

Linha 5: utilizamos a estrutura de repetição Do Until para lermos todas as linhas do arquivo. Veja que a condição para que ocorra uma iteração é que a variável linhaArquivo tenha algum valor.

Linha 6: escreve no console da aplicação a linha que foi lida.

Linha 7: utilizamos o método ReadLine novamente. Ao final do arquivo, quando não houver mais linhas, a variável linhaArquivo será igual a Nothing.

Linha 8: fim da estrutura de repetiçao Do Until.

Linha 9: fim do bloco Using.

Veja que para o nosso exemplo, o Using se mostra bastante útil, pois nesse caso, não precisamos nos preocupar em utilizar métodos para fechar o arquivo ou liberar o espaço alocado na memória, tudo isso é feito pela própria classe.

Por hoje é só. Espero que o bloco Using seja útil nas suas aplicações!