quarta-feira, 25 de janeiro de 2012

User Controls no Mono (ou Widgets)

No MonoDevelop também podemos criar controlos definidos por nós, os programadores, os passos são semelhantes aos do VB.Net, sendo a principal diferença que no Mono (Gtk) os controlos são chamados de Widgets.
Primeiro passo, criar o Widget, numa solução nova escolher biblioteca (ou Library):



Depois na janela da solução escolher adicionar novo widget:

Atribuimos um nome

De seguida configuramos o controlo de modo que tenha o comportamento pretendido, neste exemplo vou criar um widget que utiliza um controlo calendar para permitir ao utilizador indicar uma data e através de um botão calcular os anos e dias que já passaram desde essa data, assim fica qualquer coisa como isto:

 

O passo seguinte é compilar, assim criamos uma DLL que devemos adicionar como referência nos projetos em que a pretendemos utilizar.

Agora criamos um pequeno exemplo com este controlo, numa solução nova, adicionamos a referência
 e quando vamos editar a interface podemos ver na toolbox o nosso controlo:

 Agora é só arrastar para a janela e utilizar:


Projeto do Widget e da aplicação

sexta-feira, 20 de janeiro de 2012

User Control no Visual Basic 2010

O Visual Basic permite a criação de controlos por parte do programador, estes controlos podem ser, posteriormente, utilizados noutros projetos.

Começamos por criar um projecto no VB:



Depois adicionamos o user control:

De seguida criamos o nosso user control adicionando componentes e código de acordo com o pretendido. Neste exemplo o user control vai apresentar um relógio analógico, assim adicionamos uma picturebox, definimos o dock em fill, adicionamos um timer com interval em 1000 (1 segundo) e colocamos o seguinte código no controlo:

Public Class Relogio
    Sub hora_analogica(ByVal x As PictureBox)
        Dim meiox, meioy As Integer
        Dim tamanhohx, tamanhohy, tamanhomx, tamanhomy, tamanhosx, tamanhosy As Integer
        Dim hora, minuto, segundo As Integer
        Dim phorax, phoray, pminutox, pminutoy, psegundox, psegundoy As Integer
        Dim anguloh, angulom, angulos As Double
        Dim tipo_letra As New Font("Arial", 10)
        Dim corp As New Pen(Brushes.Black, 2)
        Dim corv As New Pen(Brushes.Red, 2)
        Dim cora As New Pen(Brushes.Blue, 2)

        'limpa a picturebox
        x.CreateGraphics.Clear(x.BackColor)

        'achar o meio da imagem
        meiox = x.Width / 2
        meioy = x.Height / 2
        'tamanho dos ponteiros
        tamanhomx = meiox
        tamanhomy = meioy
        tamanhosx = tamanhomx * 0.8
        tamanhosy = tamanhomy * 0.8
        tamanhohx = tamanhomx * 0.5
        tamanhohy = tamanhomy * 0.5

        'desenhar mostrador
        '12 horas
        anguloh = ((0 / 12 * 360) - 90) * Math.PI / 180
        phorax = meiox + Math.Cos(anguloh) * tamanhomx
        phoray = meioy + Math.Sin(anguloh) * tamanhomy
        x.CreateGraphics.DrawString("12", tipo_letra, Brushes.Black, phorax, phoray)
        '6 horas
        anguloh = ((6 / 12 * 360) - 90) * Math.PI / 180
        phorax = meiox + Math.Cos(anguloh) * tamanhomx
        phoray = meioy + Math.Sin(anguloh) * tamanhomy
        x.CreateGraphics.DrawString("6", tipo_letra, Brushes.Black, phorax, phoray - 20)
        ' 3 horas
        anguloh = ((3 / 12 * 360) - 90) * Math.PI / 180
        phorax = meiox + Math.Cos(anguloh) * tamanhomx
        phoray = meioy + Math.Sin(anguloh) * tamanhomy
        x.CreateGraphics.DrawString("3", tipo_letra, Brushes.Black, phorax - 10, phoray)
        '9 horas
        anguloh = ((9 / 12 * 360) - 90) * Math.PI / 180
        phorax = meiox + Math.Cos(anguloh) * tamanhomx
        phoray = meioy + Math.Sin(anguloh) * tamanhomy
        x.CreateGraphics.DrawString("9", tipo_letra, Brushes.Black, phorax, phoray)
        'horas
        hora = Now.Hour
        If hora > 12 Then hora = hora - 12
        anguloh = ((hora / 12 * 360) - 90) * Math.PI / 180
        phorax = meiox + Math.Cos(anguloh) * tamanhohx
        phoray = meioy + Math.Sin(anguloh) * tamanhohy
        'ponteiro das horas
        x.CreateGraphics.DrawLine(corp, meiox, meioy, phorax, phoray)
        'minutos
        minuto = Now.Minute
        angulom = ((minuto / 60 * 360) - 90) * Math.PI / 180
        pminutox = meiox + Math.Cos(angulom) * tamanhomx
        pminutoy = meioy + Math.Sin(angulom) * tamanhomy
        x.CreateGraphics.DrawLine(cora, meiox, meioy, pminutox, pminutoy)
        'segundos
        segundo = Now.Second
        angulos = ((segundo / 59 * 360) - 90) * Math.PI / 180
        psegundox = meiox + Math.Cos(angulos) * tamanhosx
        psegundoy = meioy + Math.Sin(angulos) * tamanhosy
        x.CreateGraphics.DrawLine(corv, meiox, meioy, psegundox, psegundoy)

    End Sub
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        hora_analogica(Me.PictureBox1)

    End Sub
End Class

Depois executamos o Build do projeto, com esta tarefa concluída passamos a contar com o nosso componente na Tool Box:
Este icon só aparece se não estivermos no modo design do user control!

Feito isto podemos adicionar o nosso novo componente a qualquer formulário deste projeto do mesmo modo que se adiciona os restantes.

Se pretendermos utilizar este componente noutro projeto basta adicionar o componente criado utilizando a opção de adicionar elemento existente:

Projeto com o componente e uma aplicação que utiliza esse componente para download.

quinta-feira, 19 de janeiro de 2012

Criar e utilizar DLL no MonoDevelop

Tal como no Visual Basic também o Mono Develop permite criar DLL's a utilizar em outras aplicações.
Primeiro a DLL:


Eis o código:
using System;
using System.Collections.Generic;  //namespace para as listas

namespace class_valores
{
public class valores
{
private List<int> lista;
//construtor
public valores ()
{
lista=new List<int>();
}
//construtor versao 2
public valores (int x)
{
lista=new List<int>();
lista.Add(x);
}
//destrutor
public void destroy()
{
lista.Clear();
}
//inserir um elemento
public void adiciona(int x)
{
lista.Add(x);
}
//delvove o numero de elementos
public int n_elementos()
{
return lista.Count;
}
//calcula e devolve a media
public double media()
{
double m;
int i,t;

t=0;
for(i=0;i<lista.Count;i++)
t=t+lista[i];
m=(double)t/(double)lista.Count;
return m;
}
//calcula e devolve a soma total
public int soma()
{
int t;

t=0;
foreach(int x in lista)
{
t+=x;
}
return t;
}
//devolve o maior
public int maior()
{
int m;
m=0;
if(lista.Count>0){
m=lista[0];
foreach(int x in lista){
if(x>m) m=x;
}
}
return m;
}
//devolve o menor
public int menor()
{
int m;
m=0;
if(lista.Count>0){
m=lista[0];
foreach(int x in lista){
if(x<m) m=x;
}
}
return m;
}
}
}


Agora a aplicação que vai utilizar a DLL.
Primeiro adicionamos a referência à DLL





Depois disto temos na lista das referências
Agora sim podemos inserir o código:

using System;
using Gtk;
using class_valores;

public partial class MainWindow: Gtk.Window
{
public class_valores.valores val = new class_valores.valores();

public MainWindow (): base (Gtk.WindowType.Toplevel)
{
Build ();
}

protected void OnDeleteEvent (object sender, DeleteEventArgs a)
{
Application.Quit ();
a.RetVal = true;
}
//Terminar
protected void OnButton2Clicked (object sender, System.EventArgs e)
{
val.destroy();
Application.Quit ();
//throw new System.NotImplementedException ();
}
//calcular
protected void OnButton1Clicked (object sender, System.EventArgs e)
{
int x;

x=Convert.ToInt16(this.entry1.Text);

val.adiciona(x);
this.lb_maior.Text=val.maior ().ToString();
this.lb_menor.Text=val.menor().ToString();
this.lb_soma.Text=val.soma().ToString();
this.lb_media.Text=val.media().ToString();
//throw new System.NotImplementedException ();
}
}

No final é só correr.

quarta-feira, 18 de janeiro de 2012

Como criar e utilizar uma DLL em VB.NET

Com o Visual Basic podemos criar uma DLL com código que pretendemos reutilizar noutros projetos. Para isso devemos começar por criar um projeto do tipo Class Library



Este projeto abre um módulo do tipo class
Neste documento definimos o código e as propriedades da class:

Public Class Valores
    'class que permite gerir uma lista de valores inteiros
    Private lista As List(Of Integer)
    'construtor
    Public Sub New()
        lista = New List(Of Integer)
    End Sub
    'construtor versão 2
    Public Sub New(ByVal x As Integer)
        lista = New List(Of Integer)
        lista.Add(x)
    End Sub
    'destrutor
    Public Sub Destroy()
        lista.Clear()
    End Sub
    'inserir um elemento
    Public Sub adiciona(ByVal x As Integer)
        ' Adiciona um elemento à class.
        lista.Add(x)
    End Sub
    'devolve o numero de elementos
    Public Function n_elementos() As Integer
        Return lista.Count
    End Function
    'calcula e devolve a média
    Public Function media() As Double
        Dim m As Double
        Dim i As Integer

        For i = 0 To lista.Count - 1
            m = m + lista(i)
        Next
        m = m / lista.Count
        Return m
    End Function
    'calcula e devolve a soma total
    Public Function soma() As Integer
        Dim t As Integer
        'ciclo for each
        For Each x In lista
            t = t + x
        Next
        Return t
    End Function
    'devolve o maior
    Public Function maior() As Integer
        Return lista.Max()
    End Function
    'devolve o menor
    Public Function menor() As Integer
        Return lista.Min()
    End Function
End Class

De seguida compilamos, de preferência mudando para a versão Release:

Depois disto temos na pasta release a nossa DLL, esta deve ser adicionada ao projeto em que vai ser utilizada como uma referência:


Assim podemos utilizar a class do seguinte modo:
Imports class_valores
Public Class Form1
    Dim val As New class_valores.Valores()
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim v As Integer

        Try
            v = Me.TextBox1.Text
        Catch ex As Exception
            MessageBox.Show("Erro verifique o tipo de dados!" & vbCrLf & ex.Message)
            Exit Sub
        End Try

        'adiciona o elemento na class
        val.adiciona(v)
        'maior
        Me.lb_maior.Text = val.maior()
        'menor
        Me.lb_menor.Text = val.menor()
        'soma
        Me.lb_soma.Text = val.soma()
        'média
        Me.lb_media.Text = val.media()

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        val.Destroy()
        End
    End Sub
End Class



terça-feira, 17 de janeiro de 2012

Excepções (há delas para cada regra)


Um pequeno projecto para demonstrar o funcionamento das excepções em VB.NET (para Windows) e MonoDevelop (para Windows e Linux).

A parte mais importante do código está no click do botão verificar:

Versão VB.NET

        Dim n As Integer
        Dim nome As String
        Dim cp As String

        Try
            n = TextBox1.Text
            nome = TextBox2.Text
            cp = TextBox3.Text
            If nome.Length < 3 Then
                Throw New ArgumentException("Erro no preenchimento dos dados! O campo nome tem de ter pelo menos 3 caracteres.")
            End If
            'caso o código postal não tenha 4 caracteres iniciar uma excepção
            If cp.Length <> 4 Then
                Throw New ArgumentException("Erro no preenchimento dos dados! O campo código postal tem de ter 4 caracteres.")
            End If
        Catch ex As Exception
            MessageBox.Show("Erro! " & ex.Message)
        End Try

Versão C#

int n;
string nome,cp;

try{
n=Convert.ToInt16(entry1.Text);
nome=entry2.Text;
cp=entry3.Text;
if(nome.Length<3) {
throw new ArgumentException("Erro no nome. Tem de ter pelo menos 3 letras!");
}
if(cp.Length!=4){
throw new ArgumentException("Erro no codigo postal. Tem de ter 4 caracteres!");
}
}catch(Exception ex)
{
projeto_excepcoes.mensagem aviso= new projeto_excepcoes.mensagem();
aviso.Title="Erro";
aviso.texto="Erro!\n " + ex.ToString();
aviso.Run();
}

Downloads: Projecto VB Projecto MonoDevelop

segunda-feira, 16 de janeiro de 2012

Hash codes em C# no MonoDevelop

O mesmo projeto agora em C# e com o MonoDevelop, apesar de ainda não o ter testado em Linux deve correr de igual modo que no Windows.



Projecto em MonoDevelop

domingo, 15 de janeiro de 2012

Hash codes e outros

Neste pequeno primeiro projeto apresento o código que permite verificar se um formulário está aberto, como se pode ver a seguir basta utilizar a propriedade visible do formulário:




        If Form2.Visible = True Then
            MessageBox.Show("Aberto")

        Else
            MessageBox.Show("Fechado")
        End If

Os hash codes devem ser utilizados para armazenar palavras passes dos utilizadores na base de dados, assim ninguém consegue saber qual a palavra escolhida. A seguir apresento o código que exemplifica:


        Dim texto As String

        texto = "password"
        If Me.TextBox2.Text = Hex(texto.GetHashCode().ToString()) Then
            MessageBox.Show("Hash válido")
        Else
            MessageBox.Show("Hash inválido")
        End If

Para começar é só, já agora vale a pena dar uma vista de olhos no click do linklabel.
Download do projecto