Quem sou eu

Minha foto
Programador por profissão, formação e opção! Interessado em tudo relacionado a computadores, menos manutenção de hardware! Linguagens (interesse e trabalho): Java, C#, C/C++, Python, Ruby, Haskell. Atualmente trabalhando como Desenvolvedor (maior parte do tempo em soluções ASP.NET)

quinta-feira, 31 de dezembro de 2009

Ant Build File. Simples e Funcional.

No intuito de entender melhor o processo de build do NetBeans (Ant).

Escrevi um ant build file bem simples para projetos java pequenos.

Ele não trata arquivos embarcados, readme files e documentação.

Mas já serve de base para que seja melhorado e utilizado dentro de suas limitações.

Ele está disponibilizado na licensa MIT.

Esse script Ant pode ser utilizado em projetos com qualquer outra licensa que você queira.

Download aqui.

Ícones

Todo desenvolvedor gosta de bons ícones para suas aplicações.

Seguem ai alguns sites que contém diversos ícones para serem utilizados. Alguns são livres.

Novos projetos Open-Source.

Desenvolvi a pouco tempo um gerador de código para utilizar no dia-a-dia.

Durante o desenvolvimento, acabei por criar dois outros projetos que são pequenos porém muito úteis:


  • am-simple-factory: Ajuda na utilização do design patter (Factory) sem gerar grandes complicações (sem arquivos de configuração!). O projeto possui apenas duas classes. Vale a pena conferir.
  • am-command-line-parser: Um parser para opções de linha de comando. Gera mensagens de erro, e o famoso "printUsage" com muito pouco esforço por parte do programador.
Ambos projetos estão hospedados no Google Code e utilizam o Mercurial como sistema para controle de versão.

Abraços e espero que os projetos sejam úteis.

Am Java Regular Expression Designer

Olá!

Estava tentando assistir uns vídeos do Google no meu PC mas a conexão não estava das melhores! (Velox...)

Então acabei começando a desenvolver um software em Java para poder baixar o vídeo e depois assistir.

Durante o desenvolvimento, precisei criar uma expressão regular para identificar o ID do vídeo.

Então para dar uma mãozinha no processo, desenvolvi este aplicativo
Am Java Regular Expression Designer - or by simple - ared


Ele basicamente recebe uma expressão regular, um conjunto de teste e executa a expressão regular no conjunto de teste exibindo os grupos que foram encontrados.

Ele é muito simples porém pode ajudar na hora de trabalhar com expressões regulares.

Na página acima existe um pequeno manual (na verdade é apenas um screenshot) que mostra a aplicação e como você faz para utilizar.

Ah, você também pode baixar os códigos fontes e melhorar o aplicativo (ele realmente precisa pois é muito, muuuuito simples!). O código-fonte está liberado sobre a licensa MIT.

Abraços e boas expressões regulares!

domingo, 13 de dezembro de 2009

Utilizando alias no linux!

O Shell do Linux está anos luz a frente do Prompt do Dos disponível no Windows. Existem várias opções de shell, porém a mais utilizada é o bash.

Entre as grandes facilidades que vejo no bash é o comando alias.

Basicamente o alias serve para criar um apelido para um comando que você utiliza com muita frequência.

Por exemplo, se você usa muito o comando:
ls -la
Você pode criar um alias para ele da seguinte forma:
alias ls="ls -la"
Agora, sempre que você utilizar o ls, ele irá expandir o comando para o alias que você definiu.

Abaixo estão três alias que eu acho muito práticos para a utilização do dia-a-dia:

Lista de Alias Salvadores!

alias cp="cp -v"
alias tar-gz="tar -zcvf"
alias tar-ugz="tar -xzvf"
alias du-first="du -h --max-depth=0"
  1. faz com que toda cópia de arquivos seja verbose, sendo assim o shell sempre lista quais arquivos estão sendo copiados.
  2. utilizado para compactar uma pasta utilizando o tar e o gzip
  3. processo inverso, e serve para descompactar um arquivo .tar.gzip
  4. Lista o tamanho do diretório que você informar. Por padrão o du traz o total para todas os dirtórios filhos daquele que você informou. O du também pode ser utilizado para listar o tamanho de arquivos.
Quem se interessar, pode conferir esse tutorial interessante sobre Bash
    E para os WindowsManiacos que só vivem com a tela do Prompt, vale a pena uma olhada no WindowsPowerShell e no Cygwin.
    Este último traz algumas das ferramentas (muito boas!!!) do Linux para o Windows.
    É... foi-se a época que o pessoal do Linux precisava portar aplicativo do Windows! Hoje em dia ocorre extamente o contrário, assim que algo legal sai para o Linux muitos "WindowsUsers" pedem para o aplicativo ser portado!

    sábado, 28 de novembro de 2009

    Google Go - Arquivo de Sintaxe para GEdit

    Olá,

    Escrevi um arquivo de sintaxe para a biblioteca GtkSourceView (base do Gedit) para reconhcer a sintaxe da linguagem go.

    Siga o link abaixo e baixe o arquivo go.lang
    http://sites.google.com/site/alamoraespage/google-go-contents

    Para instalar basta baixar o arquivo e copiar para o diretório de sintaxe, no ubuntu normalmente encontra-se em:

    /usr/share/gtksourceview-2.0/language-specs

    Feito isso basta abrir o Gedit que a opção da linguagem estará disponibilizada.

    quinta-feira, 19 de novembro de 2009

    Tutorial Go - Parte 1 - Hello World

    Este é o primeiro post de uma série de postagens que irão apresentar a linguagem Go através de uma série de pequenos blocos de código fonte.

    Como em qualquer linguagem, começamos pelo Hello World, vejam abaixo o trecho de código:



    package main



    import "fmt"



    func main() {

            fmt.Printf("\nhello, world");

            fmt.Printf("\nhello, Mr. World\nA little bit diferent")

    }




    A primeira linha do código define o nome do pacote, neste caso main

    Logo abaixo está a linha que importa os pacotes necessários. Um fato interessante na linguagem é que se o programador importar um pacote que ele não necessita o compilador acusa isso como um erro.

    A seguir temos a declaração da função main (ponto de início do programa) posteriormente o corpo da função definido entre {}.

    Como Go é uma linguagem compilada, depedendo da sua arquitetura de processador você precisará utilizar um compilador diferente. No meu caso utilizo o 8g, sendo assim o processo para compilar e executar (no Linux) é:

    8g helloworld.go
    8l -o helloworld.bin helloworld.8
    ./helloworld.bin
    

    E isso é tudo, nos vemos na próxima

    sábado, 14 de novembro de 2009

    Configurando o Vim para a linguagem Go

    A linguagem Go já vem com vários documentos de definição de sintaxe para os editores mais comuns (emacs, vim, TextMate).

    Como estou utilizando o Ubuntu normalmente utilizo o GEdit porém o mesmo ainda está sem suporte então dei uma chance ao Vim.

    Para utilizar o Vim executei os seguintes passos:

    Instalando a versão completa do vim. O padrão no Ubuntu é trazer apenas o vim-tiny que é uma versão bem menor do Vim.

    Digite o seguinte comando:

    sudo apt-get install vim-runtime

    Agora o próximo passo e criar ou alterar o seu arquivo .vimrc (localizado em $HOME/.vimrc)

    No meu caso eu criei o arquivo e inseri as seguintes linhas:

    Arquivo de configuração do vim

    let gosyntaxfile = "$GOROOT/misc/vim/go.vim"
    syntax on
    
    au BufRead,BufNewFile *.go set filetype=golang
    au! Syntax golang source $GOROOT/misc/vim/go.vim
    

    Não sou especialista em Vim, porém por dedução as linhas fazer respectivamente:

    • Linha 1: Define uma Variável com o caminho do arquivo de sintaxe
    • Linha 2: Habilita o syntax highlight
    • Linha 4: Associação a extensão (.go) ao tipo de linguagem golang
    • Linha 5: Define o arquivo de sintaxe para a linguagem golang definida na linha anterior
    Pronto, agora basta abrir seus arquivos utilizando o Vim para obter syntax highlight para a linguagem Go

    Instalando o ambiente para a linguagem Go

    Olá!

    Comecei a estudar a linguagem Go (novo brinquendo lançado pela Google) hoje, até onde já li e assisti sobre a linguagem ela parece ser muito interessante. Principalmente nas questões relativas a Concorrência

    Neste post vou basicamente traduzir o tutorial de instalação do ambiente Go destacando os passos que utilizei para instalar no Ubuntu 9.04 (os passos devem ser os mesmos para a versão 9.10)

    Primeiramente é necessário configurar algumas variáveis de ambiente necessárias para a instalação e utilização do Go:

    Variáveis para a configuração do ambiente Go

    export GOROOT=$HOME/go
    export GOARCH=amd64
    export GOOS=linux
    export GOBIN=$HOME/bin/go
    

    Explicando as variáveis:
    GOROOT: Pasta raiz do projeto Go, nesta pasta que você irá baixar o código-fonte da linguagem.

    GOARCH: Arquitetura do seu processador, voce pode utilizar um dos valores abaixo:
    • amd64: Processadores Amd de 64 bits (são os processadores x86_64)
    • 386: Processadores baseados na arquitetura 386 (praticamente todos os procesadores intel se enquadram)
    • arm: Processadores para dispositivos móveis (celulares, smartphones, alguns netbooks)
    GOOS: Sistema operacional que você está utilizando, abaixo a lista de opções possíveis:
    • linux: Sistemas baseados no kernel Linux
    • darwin: Mac OSX 10.5/10.6
    • nacl: Native Client, não sei o que essa opção representa, porém parece ser algo para os celulares?? Vai saber? De toda forma, o próprio site da linguagem informa que essa opção não está 100% ok!
    GOBIN: Essa variável não é obrigatória, caso não seja setada o valor default aponta para $HOME/bin. Esta variável indica aonde os binários da linguagem serão colocados! O importante é que a opção que você colocar aqui deve estar no seu PATH.
    Feito isso você deve baixar os fontes da linguagem para a pasta GOROOT. A Google utilizou a ferramenta mercurial para gerenciar as versões, sendo assim você precisa instalar essa ferramenta no Ubuntu. Para isso vamos utilizar o APT-GET.
    sudo apt-get install mercurial
    Agora basta baixar os fontes utilizando o comando:
    hg clone -r release https://go.googlecode.com/hg/ $GOROOT
    Logo em seguida o que você precisa é instalar as ferramentas para compilar o compilador Go. Digite a seguinte linha de comando:
    sudo apt-get install bison gcc libc6-dev ed make
    Ao terminar de instalar as ferramentas necessárias, você deve iniciar o processo de compilar. Digite os seguintes comandos no seu terminal:

    Compilando o Compilador Go

    cd $GOROOT/src
    ./all.bash
    
    Caso o processo termine com sucesso você deve ver a seguinte mensagem:

    Resultado

    --- cd ../test
    N known bugs; 0 unexpected bugs
    

    Pronto o ambiente Go já está instalado em sua máquina e você pode começar a experimentar essa nova linguagem.

    O endereço do tutorial de instalação oficial é o seguinte: http://golang.org/doc/install.html

    Lá você encontra outros tutoriais sobre a linguagem.

    Este vídeo mostra um pouco do que a linguagem pode oferecer.

    quarta-feira, 11 de novembro de 2009

    Uma nova linguagem - Google Go

    É isso ai!

    A Google sempre bancando seus empregados para gastarem parte do seu dia investindo em seus projetos pessoais acabou de lançar a sua própria linguagem de programação.

    Go é o nome da nova criação da gigante de Mountain View.

    Ainda não li o tutorial da linguagem, isso fica para uma próxima postagem.

    Não é possível saber se a linguagem será ou não um grande sucesso, mas com certeza em pouco tempo muita gente já vai estar se divertindo com a nova linguagem da Google (está sendo assim com o Chrome). Não duvido nada que em pouco tempo já será disponibilizada uma versão do Google App Engine para a linguagem Go.

    Referência da matéria no TechCrunch

     - Logo da nova linguagem

    sábado, 3 de outubro de 2009

    Instalando um FTP no Ubuntu 9.04 - Proftpd

    Na minha empreitada por limpar de vez o Windows do meu HD hoje precisei configurar uma Máquina Virtual para instalar o Windows e as ferramentas que preciso para trabalhar nela.

    Antes que sejam lançadas as critícas, eu uso o Windows para desempenhar as minhas atividades de trabalho! Afinal de contas, dinheiro é necessário! :)

    Bom, para fazer isso eu precisava transferir as isos e instaladores do meu note com o Vista para o meu desktop Ubuntu (para poder então liberar o note para instalar o Ubuntu).

    Então vamos ao que interessa, como instalar e configurar um servidor ftp no Ubuntu 9.04?

    Primeiro, digite na linha de comando o seguinte:
    sudo apt-get install proftpd

    Durante a instalação você será questionado se deseja configurar o ftp para utilizar o inetd ou standalone.
    No meu caso o inetd seria suficiente, porém preferi o standalone. A diferença é que no standalone o servidor é independente do inetd e já no modo inetd o processo do ftp e iniciado cada vez que uma requisição é aberta.

    O inetd ajuda a poupar recursos porém recursos na minha máquina não são problema então o standalone foi a escolha!

    Feito isso o serviço será iniciado e já estará pronto para ser utilizado. Para acessar basta no seu cliente ftp entrar com o Ip do seu servidor, seu usuário e senha. A senha é trafegada em plain-text na configuração padrão.

    A instalação acima cria uma pasta ftp no diretório home que permite acesso anônimo ao ftp. Todos os usuários por padrão podem acessar suas pastas através do ftp.

    Abraço

    quarta-feira, 30 de setembro de 2009

    OnLine Web Color Picker

    Muitas vezes nós desenvolvedores precisamos trabalhar um pouco com questões gráficas e isso com certeza irá envolver escolher uma cor para nossos gráficos, textos ou telas.

    Sem questionar o bom gosto de um programador para escolher a cor do seu site (um verde com fundo preto ao estilo terminal do linux), o que mais incomoda é encontrar o código hexadecimal da cor desejada.

    Para facilitar nosso serviço alguém teve a brilhante idéia de criar um color picker on line!

    Basta digitar o endereço na URL ou clicar no link abaixo e você será redirecionado para uma tela onde um quadrado e alguns sliders lhe permitiram escolher a cor desejada.

    Feito isso, basta copiar o código Hexadecimal apresentado no textbox e colar no seu CSS.

    Este é o link para o ColorPicker.com - Quick Online Color Picker Tool

    Meus parabéns ao desenvolvedor do site.

    Abraços,

    terça-feira, 22 de setembro de 2009

    HTML 5

    Estava a um tempo tentando decidir sobre qual tecnologia para desenvolvimento WEB (client-side) iria escolher para dedicar meu tempo de estudo.

    Estava quase certo que iria utilizar o FLEX da Adobe para criar minhas aplicações RIA.

    Porém a umas duas semanas precisei trabalhar com orientação a objetos em JavaScript e comecei a questionar se a minha decisão por ActionScript/Flex seria realmente a melhor.

    Hoje acabei encontrando alguns links interessantes sobre JavaScript/HTML5 e tive a certeza de que as vantagens que o ambiente Flex da Adobe apresenta para os desenvolvedores foram superadas.

    A seguir está o link da especificação do HTML 5, um tópico que vale a pena é a tag CANVAS
    W3C HTML 5 Reference.

    Outro ponto positivo do HTML 5 é que ele suporta "offline storage", o que permite ao desenvolvedor do script armazenar dados na máquina do cliente.

    A medida que iniciar meus estudos sobre HTML 5 irei postar mais informações.

    domingo, 16 de agosto de 2009

    Build da documentação do Flex 3 SDK

    A tecnologia Flash sempre esteve distante dos programadores, pois seu publico alvo eram os designers das aplicações.

    Porém com o avanço das aplicações RIA a Adobe decidiu trazer as vantagens da tecnologia Flash para os programadores, e assim, criou o Flex.

    A partir da versão 3, a tecnologia Flex tornou-se Open Source.

    Voce pode baixar o código fonte trunk ou então utilizar a branche mais estável, 3.3.0. Atualmente estou utilizando a branche 3.3.0.

    Bom, após baixar o código-fonte você verá que a documentação não foi compilada e se você baixar a versão binária da SDK também verá que a documentação não está presente.

    Porém ao rodar o build da documentação (lembre-se que estou utilizando a branche 3.3.0) o mesma não executa e acusa vários erros.

    Pesquisei um pouco e acabei encontrado um link no issue tracker da Adobe que explicava como tentar solucionar, e é isto que vou mostrar para vocês agora.

    Entre no diretório \asdoc\

    Altere o arquivo build.properties da seguinte maneira:


    frameworks.dir = ${basedir}/../frameworks
    playerglobal.dir = ${basedir}/../modules/playerglobal/src

    asdoc.options = \
    -namespace http://www.adobe.com/2006/mxml ${basedir}/mxml-manifest.xml \
    -doc-namespaces http://www.adobe.com/2006/mxml \
    -doc-classes \
    FrameworkClasses \
    -source-path \
    "${frameworks.dir}/projects/flex/src" \
    "${frameworks.dir}/projects/framework/src" \
    "${frameworks.dir}/projects/haloclassic/src" \
    "${frameworks.dir}/projects/rpc/src" \
    "${frameworks.dir}/projects/utilities/src" \



    E depois altere o arquivo mxml-manifest.xml e comente todas as entradas referentes a biblioteca graphics. Deve ficar parecido com:



        <!-- graphics -->
    <!--
    <component id="BitmapFill" class="mx.graphics.BitmapFill"/>
    <component id="GradientEntry" class="mx.graphics.GradientEntry"/>
    <component id="LinearGradient" class="mx.graphics.LinearGradient"/>
    <component id="LinearGradientStroke" class="mx.graphics.LinearGradientStroke"/>
    <component id="RadialGradient" class="mx.graphics.RadialGradient"/>
    <component id="SolidColor" class="mx.graphics.SolidColor"/>
    <component id="Stroke" class="mx.graphics.Stroke"/>
    <component id="BitmapGraphic" class="mx.graphics.BitmapGraphic"/>
    <component id="CubicBezierSegment" class="mx.graphics.CubicBezierSegment"/>
    <component id="Ellipse" class="mx.graphics.Ellipse"/>
    -->



    Feito isso basta acionar o ant que o build irá ocorrer.

    Ah, para substituir os < e > no xml, usei o site: centricle

    sábado, 15 de agosto de 2009

    Buscando pacotes com o apt.

    Provavelmente todos os usuários de distribuições derivadas do Debian já utilizaram alguma vez o comando apt-get para instalar ou remover um pacote.

    Porém o apt não serve apenas para instalar os pacotes, você pode utilizá-lo para buscar um pacote no repositório.

    Para fazer isso é simples, basta digitar:

    apt-cache search

    Por exemplo, para buscar todos os pacotes relacionados com VirtualBox (VM da Sun), basta digitar:

    apt-cache search virtualbox

    O resultado deve ser:

    imvirt - detects several virtualizations
    vboxgtk - simple GTK+ frontend for VirtualBox
    virtualbox-ose - x86 virtualization solution - binaries
    virtualbox-ose-dbg - x86 virtualization solution - debugging symbols
    virtualbox-ose-guest-source - x86 virtualization solution - guest addition module source
    virtualbox-ose-guest-utils - x86 virtualization solution - guest utilities
    virtualbox-ose-source - x86 virtualization solution - kernel module source
    virtualbox-2.2 - Sun VirtualBox
    virtualbox-3.0 - Sun VirtualBox


    Vale lembrar que a busca é feita nos dados armazenados localmente, sempre que possível execute um apt-get update para atualizar a lista de pacotes.

    Informação recuperada em: Mike Kruckenberg

    sexta-feira, 14 de agosto de 2009

    Música para programar...

    Uma boa forma de aumentar o rendimento na hora de programar é ouvir uma boa música (pelo menos para mim funciona).

    Sempre que possível estou utilizando o ambiente Linux (mais precisamente Ubuntu 9.04) para realizar minhas atividades não relacionadas ao meu trabalho.


    Apesar da Nullsoft disponibilizar uma versão do Winamp para Linux, prefiro utilizar as ferramentas que a comunidade recomenda. Sendo assim estou utilizando o Rhythmbox para ouvir minhas músicas.

    Porém uma coisa que sinto falta é a grande variedade de rádios on-line que eu tenho disponível no Winamp. Sendo assim dei uma procurada no google e achei o link do Shoutcast (serviço que disponibiliza as rádios do winamp).

    Para utilizar o Shoutcast no Rhythmbox basta navegar até o site da Shoutcast, encontrar sua rádio preferida e adicionar na lista de rádios do Rhythmbox.

    Não é a mesma coisa que utilizar a integração do winamp, mas já ajuda a curtir boa música.

    Abraço!

    Manipulando arquivos .iso no Linux

    Apesar deste blog ser voltado para programação, algumas dicas do ambiente Linux não podem ferir. :]

    Bom, a primeira refere-se a como criar uma imagem de um cd/dvd para o seu sistema de arquivos. Basta escrever:

    dd if=/dev/cdrom of=/endereco/onde/quer/salvar/oiso.iso

    Este comando copia o disco byte a byte (e da maneira que está pode ser muito lento, porém você não tem problemas em setar tamanhos de blocos errados).

    Depois de terminar a cópia do disco, você pode verificar a integridade do seu arquivo com:

    isovfy /endereco/onde/salvou/oiso.iso

    Agora o mais interessante do linux é que facilmente você pode pegar uma iso e utilizar como um diretório do seu computador, através do comando mount.

    Digite o seguinte comando:

    mount -o loop -t iso9660 /endereco/onde/salvou/oiso.iso /diretorio/de/destino

    O comando mount recuperei deste site!

    quarta-feira, 5 de agosto de 2009

    Chamando métodos no servidor através de javascript.

    Este post apresenta apenas dois links para a documentação do MSDN que indicam como implementar a chamada de métodos no lado server através de código javascript (sem utilizar diretamente o _doPostBack).

    Depois faço um novo post com algum exemplo.

    Documentação da interface ICallbackEventHandler
    http://msdn.microsoft.com/en-us/library/system.web.ui.icallbackeventhandler.aspx

    Exemplo de implementação da microsoft
    http://msdn.microsoft.com/en-us/library/ms178210%28VS.80%29.aspx

    terça-feira, 4 de agosto de 2009

    Carregando arquivos embarcados - .Net

    Muitas vezes precisamos carregar arquivos que são embarcados em nossas dlls ou executáveis.

    Isso é muito comum com imagens de botões. Pois quando o seu executável é publicado, você não libera uma pasta cheia de imagens para seus usuários.

    O trecho abaixo, mostra como carregar um arquivo embarcado em um assembly. É bem simples:


    public class ResourceReader
    {
    public static System.IO.Stream OpenResource(string fullName)
    {
    /* Full name é o nome completo do recurso, ou seja
    * o caminho onde você colocou o recurso na sua solução.
    * Apenas substituindo o "/" por "."
    * Supondo que eu tenha um xml colocado na pasta
    * <raiz da solução>\Andre\Configuration\Network\config.xml
    * eu acessaria o recuros com o seguinte endereço:
    * Andre.Configuration.Network.config.xml
    * */
    /* Recuperei o objeto que representa a dll ou exe que contém
    * o código corrente */
    System.Reflection.Assembly meuAssembly = System.Reflection.Assembly.GetExecutingAssembly();
    /* Retorna um stream para ler o conteudo que está embarcado em minha dll */
    return meuAssembly.GetManifestResourceStream(fullName);
    }
    }
    O código acima é bem simples e auto-explicativo. Com este recurso você pode ler qualquer coisa que possa ser manipulada através de Streams (imagens, vídeos, textos, xml, xsd, etc).

    terça-feira, 14 de julho de 2009

    Asp.Net Child Controls

    Criar controles customizados é uma parte importante do trabalho de desenvolvedores asp.Net. Muitas vezes os controles criados precisam manipular uma lista de controles filhos. (Child Controls).

    Pensando nisso os desenvolvedores do Asp.Net criaram uma classe base para este tipo de controles, a CompositeControl.

    A utilização da CompositeControl faz o trabalho de criar controles complexo uma tarefa bastate fácil, porém algumas vezes você precisa herdar de um controle que não é filho de CompositeControl, por exemplo customizar um Textbox.

    Implementar as funcionalidades já presentes na ComposisteControle pode ser feita implementando alguns métodos.

    • CreateChildControls: Responsável por criar os controles filhos e adicioná-los à lista de controles filhos (this.Controls). O ideal é que a criação de controles filhos seja controlada dentro desta função, evitando que o código fique espalhado.
    • RenderChildren(HtmlTextWriter writer): Responsável por renderizar os controles filhos, o modo de operação padrão é simplesmente chamar o método RenderControl para cada um dos itens da lista (this.Controls).
    • Render(HtmlTextWriter writer): Este método apenas deve efetuar uma chamada ao método EnsureChildControls() e depois pode simplesmente chamar o método da classe base (base.Render(writer);)
    • EnsureChildControls: Este método não deve ser implementado, porém ele tem um papel fundamental. Seu objetivo é verificar a propriedade ChildControlsCreated e caso seja false, executar a chamada ao método CreateChildControls.
    • ChildControlsCreated: Sempre que for necessário recriar os itens filhos, o método ideal é setar essa propridade como false e posteriormente efetuar uma chamada ao método EnsureChildControls
    O trecho de código abaixo cria um controle que apresenta um Label e um Textbox que são renderizados em conjunto, criando um campo que pode ser adicionado e ter um nome associado ao mesmo. Este tipo de controle é muito utilizado para fazer telas de preenchimento de formulários (cadastro de clientes, contatos, produtos, etc).



    public class LabeledTextBox : WebControl
    {
    private Label _nameLabel;
    private TextBox _field;

    [Browsable(true)]
    public Label NameLabel
    {
    get
    {
    EnsureChildControls();
    return _nameLabel;
    }
    }

    public TextBox Field
    {
    get
    {
    EnsureChildControls();
    return _field;
    }
    }

    protected override void CreateChildControls()
    {
    this.Controls.Clear();
    base.CreateChildControls();
    _nameLabel = new Label();
    _nameLabel.ID = this.ID + "_Label";

    _field = new TextBox();
    _field.ID = this.ID + "_Textbox";

    this.Controls.Add(_nameLabel);
    this.Controls.Add(_field);
    }

    protected override void Render(HtmlTextWriter writer)
    {
    EnsureChildControls();
    base.Render(writer);
    }

    protected override void RenderChildren(HtmlTextWriter writer)
    {
    _nameLabel.RenderControl(writer);
    writer.WriteBreak();
    _field.RenderControl(writer);
    }
    }


    Esta classe é muito simples e não encapsula muito bem os controles, o ideal seria nunca exibir os controles filhos através de propridades públicas pois assim classes clientes podem se apoiar nas interfaces dos controles exibidos nas propriedades.
    Sendo assim ao exibir os controles da maneira apresentada o controle fica preso e poderá somente utilizar controles de classes que descendem de Label e Textbox.