Cadastre-se Revistas DevMedia Cursos
 

Space de MICHAEL BENFORD
Busca Autor


Últimas 20 atualizações de MICHAEL BENFORD

Artigo - Criação de Componentes

Criação de Componentes

 

Componentes. Ah, o que seria de nós programadores sem eles. Poucos são os aplicativos que não fazem uso deles. Às vezes ele é um botão, uma caixa de opções. Outras, um engine de banco de dados, um timer. Enfim, há inúmeras funções para um componente. Neste artigo mostrarei como criá-los para tornar mais prático o processo de desenvolvimento de suas aplicações.

Por que criar um componente?

Sempre que você estiver necessitando reescrever algum código relativamente complexo que já tenha feito antes, ou no mesmo projeto ou em outro, é uma boa idéia parar e pensar se não seria mais prático encapsular este código dentro de um componente.

Eu disse “relativamente complexo” porque se o código em questão é simplesmente uma função que retorna a imagem de um código de barras, por exemplo, então apenas ponha esta função em uma unit de propósito geral e faça referência a ela onde for necessário. Agora, se você quer que o usuário possa visualizar este código de barras em um TImage próprio, gerenciado pelo próprio aplicativo e independente da intervenção dele, o usuário, então seria mais lógico criar um componente.

Transformado em componente, seu código pode ser inserido em quantas aplicações você quiser. Da mesma forma, todas as alterações que você fizer no componente refletirão automaticamente em todos os projetos que o utilizarem.

Pré-requisitos

Para desenvolver componentes no Delphi, você deve conhecer os conceitos da Programação Orientada a Objetos, pois, como dito no tópico anterior, um componente é essencialmente um objeto. Você pode encontrar boas informações sobre POO (em inglês) no site delphi.about.com.

Como os componentes são criados

A primeira coisa a decidir sobre qual classe base você derivará o seu componente. Ao derivar de outra classe, você herda as funcionalidades (métodos, propriedades e eventos) da classe pai. Você deve, portanto, escolher qual classe base se adapta melhor ao tipo de componente que você deseja criar. Veja abaixo como escolher a classe base para seus componentes:

 

Quando você quer simplesmente adicionar novas funcionalidades a um componente existente, derive-o diretamente da classe desejada. Por exemplo, TMemo.

Às vezes é necessário não apenas adicionar funcionalidades, mas também remover algumas existentes. Assim sendo, derive de TCustomXXXX. Por exemplo, TCustomMemo. Essas classes, em geral, declaram seus métodos, propriedades e eventos na seção Protected. Assim você pode definir quais deles serão visíveis ao usuário da classe derivada.

 

Se o seu componente deve receber foco em uma janela, ele precisa então de um handle desta mesma janela. TWinControl é a classe onde este handle foi primeiramente introduzido. Se ele não precisar receber foco, derive-o de TGraphicControl.

Caso o seu componente não faça nada visualmente, mas funcione internamente no programa, você deve derivá-lo de TComponent. Todos os componentes derivados desta classe base são visíveis apenas em design time.

Criando nosso primeiro componente

O primeiro componente que iremos criar se chamará TChronometer (cronômetro, em inglês). Ele irá fazer – como o próprio nome diz – a função de um cronômetro. Ao longo do artigo, iremos aperfeiçoá-lo com as técnicas que iremos aprender.

 

Nota: Eu particularmente nomeio meus componentes utilizando nomes em inglês, assim como seus métodos, propriedades e eventos. Procedo assim porque o componente irá interagir com a IDE do Delphi, que está em inglês, e acho deselegante ver as propriedades misturando os dois idiomas. Mas nada impede, porém, que você desenvolva no idioma que desejar.

Como o Delphi aberto, vá ao menu Components e selecione New component. Será exibida uma caixa de diálogo onde você deve informar, nesta ordem:

·         A classe que o seu componente derivará;

·         O nome da classe do novo componente;

·         A paleta na guia de componentes do Delphi onde ele será exibido;

·         Nome do arquivo da unit do componente.

 

Preencha o campo Ancestor Type com TComponent e em Class Name digite TChronometer. Em seguida clique em Install, para criar um pacote para nosso componente. Na próxima janela que aparecer, clique na segunda aba (Into new package), escolha um nome para o pacote, a pasta onde ele será salvo, informe uma descrição para ele e em seguida clique em OK. O Delphi automaticamente irá gerar o pacote e o código para o nosso novo componente, inclusive instalando-o na IDE. A partir daí, basta recompilar o pacote para que as alterações efetuadas sobre o componente sejam efetivadas.

Abra o pacote e dê uma olhada na unit criada para o componente e repare as seções Private, Protected, Public e Published:

 

type

  TChronometer = class(TComponent)

  private

    { Private declarations }

  protected

    { Protected declarations }

  public

    { Public declarations }

  published

    { Published declarations }

  end;

 

Estas quatro palavras-chave definem o nível de acessibilidade que os métodos, propriedades e eventos terão em nosso componente. Veja a tabela abaixo:

 

Private

Métodos, propriedades e eventos declarados nesta seção serão somente acessíveis para outros componentes declarados dentro da mesma unit.

...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
18/03/2008 18:23:00





Artigo - Criando classes para o comando for in


Criando classes para o comando for in

 

Entre as muitas novidades da versão 2005 do Delphi está o novo comando for-in-do, presente na nova Delphi Language. Como muitos já devem saber, esta variação do tradicional loop for permite percorrer todos os elementos de uma coleção sem ser necessário especificar o início e o fim da iteração. Assim, códigos de loops tornam-se mais simples de serem escritos. Compare:

 

Sem for-in-do

 

var

  Colecao: TStringList;

  I: Integer;

begin

  Colecao := ObterAlgumaColecao;

  for I := 0 to Colecao.Count – 1 do

    ShowMessage(Colecao[I]);

 

Com for-in-do

 

var

  Colecao : TStringList;

  Item : string;

begin

  Colecao := ObterAlgumaColecao;

  for Item in Colecao do

    ShowMessage(Item);

 

Bem mais fácil, não?

 

O que a maioria (ainda) não sabe, é que nem toda coleção pode ser usada com o loop for-in-do. Para usufruir desde novo recurso da Delphi Language, é necessário fazer algumas adaptações na classe que se pretende utilizar, e é isso que veremos neste artigo.

Atributos necessários

Para adaptar a classe ao novo loop, deve-se seguir os seguintes passos:

·         A classe deve ter um método, de visibilidade public, chamado GetEnumerator(). Esta função deve retornar uma classe, uma interface ou um record;

·         O tipo retornado por GetEnumerator() deve possuir um método (public) chamado MoveNext(), que deve retornar um tipo Boolean;

·         A classe, interface ou record retornado por GetEnumerator() deve conter uma propriedade pública somente-leitura chamada Current, do mesmo tipo de dado contido na coleção.

 

Nota: Se o tipo retornado por GetEnumerator() implementa a interface IDisposable, o compilador irá chamar o método Dispose do tipo quando o loop terminar.

Mãos à obra!

Nada como um exemplo para entendermos melhor como se implementar a teoria acima. Então, no Delphi 2005, clique New->Unit" w:st="on">em File->New->Unit – Delphi for Win32. Em seguida, digite o código abaixo:

 

  TMinhaArray = array of string;

 

  TMeuItem = class

  private

    Values: TMinhaArray;

    Index: Integer;

  public

    constructor Create;

...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
31/10/2005 17:49:00





 

Michael Benford (mrbenford@gmail.com) é acadêmico do curso de matemática da Universidade Federal Fluminense e desenvolvedor Delphi e ASP.NET da GPS Tecnologia. Programa em Delphi há 5 anos, desenvolvendo aplicações cliente/servidor, multicamadas, utilitários de uso geral, componentes, experts e aplicativos não-comerciais. É colunista do portal da DevMedia, articulista e membro da comissão editorial da revista ClubeDelphi.
Arquivo de atualizações
 2008
 2005

Estatísticas do Autor:
Número de posts: 14
Características dos posts deste autor:
Conteúdo:
Utilidade:
13 56
 
DevMedia Group - Tel: (21) 3382-5038 - www.devmedia.com.br
Todos os Direitos Reservados a DevMedia Group