Mini-curso - Criando componentes

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (4)  (0)

Veja neste artigo de Adriano Santos, a Parte I do mini-curso sobre criação de componentes.

Parte I - Entendendo como funciona

Bem amigos à muito tempo que venho querendo ministrar um curso para ensinar a desenvolver componentes em Delphi. É uma forma de aprender mais e passar o conhecimento que obtive com meus colegas do fórum e com alguns livros que li. Então mãos à obra, pois temos muito trabalho a fazer.

Conhecendo a estrutura

No início o desenvolvimento de componentes, confesso, é um pouco confuso, mas logo você irá se apaixonar por seus próprios componentes, prometo.

A primeira coisa que se deve ter em mente é que componentes são desenvolvidos sem auxílio pleno no que diz respeito a visual, ou seja, é basicamente a digitação de classes, procedures e functions. Por isso é necessário se ter uma boa noção de como criar procedimentos, funções, classes e etc.

Você deve estar se perguntando: Na Internet existem milhares de componentes gratuitos e até com código fonte aberto, porque desenvolvê-los? Para responder esta questão faço uso de duas palavras que resumem tudo: controle e personalização. Nem sempre encontramos componentes que se encaixem com nossa realidade, daí surge a necessidade de criá-los.

Para este nosso primeiro artigo, vamos criar um componente bem interessante e útil. O TexTabToEnter. O componente fará o trabalho de trocar o tab pelo enter em toda a aplicação. Calma, calma. A idéia inicial é que possamos ver o básico da criação de um componente, pois o TexTabToEnter existe aos montes na grande teia, vamos apenas treinar.

Nota: Usarei o prefixo “ex” para todos os componentes que criaremos em nossos exemplos.

Por onde começar?

O início de um projeto de componente é bem mais simples do que muitos imaginam.

Abra o Delphi e logo em seguida feche o projeto default que se abre usando a opção Close All no menu File. Depois disso basta acionar a opção New Component presente no meu Component. Uma caixa de diálogo irá aparecer (veja Figura 1) e nela vamos preencher alguns parâmetros.

Figura 1. Diálogo de criação do componente

Nesta caixa de diálogo definimos informações referentes ao nosso novo componente conforme explicação:

  • Ancestor type: Classe "pai" do nosso componente, ou seja, de qual classe nosso compoente será "parente". No caso TComponent.
  • Class Name: Nome da nova classe que estamos criando. Vamos usar em nossos exemplos o prefixo "ex" de exemplo para todas as classes.
  • Pallete Page: Em qual paleta do Delphi nosso componente será instalado.
  • Unit file name: Informe ao Delphi em qual dirertório será salvo nosso componente.

Após a configuração dessas informações basta clicar em Ok para que o Delphi crie pra nós o escopo inicial de nosso componente e olhando com atenção para nossa nova Unit vemos que existem algumas seções que não encontramos em nossos programas (veja a Listagem 1).

Listagem 1. Unit do nosso componente ainda sem nenhuma implementação.

unit exTabToEnter;
 
interface;
 
uses 
  SysUtils, Classes;
 
type 
  TexTabToEnter = class(TComponent);
  private 
    {Private Declarations}
  protected 
    {Protected Declarations}
  public 
    {Public Declarations}
  published 
    {Published Declarations}
  end; 
 
procedure Register;
 
implementation 
 
procedure Register;
begin
  RegisterComponents('ClubeDelphi', [TabToEnter]);
end;
 
end.

Implementando funcionalidades

Para este primeiro projetos, vamos fazer algo bem simples.

Nosso componente será responsável por fazer com que o Enter funcione como TAB em nossos sistemas.

A mágica consiste em “desviar” o evento onMessage do objeto TApplication para uma função Execute do componente que por sua vez fará a “troca” de Tab para Enter.

Nota: Na verdade não faremos a troca, afinal de contas o tab continuará tendo sua funcionalidade.

Vamos precisar de apenas uma propriedade: Ativo do tipo Boolean. Esta propriedade quando ativa será checada pela procedure Execute realizando a tarefa desejada. Para criar uma propriedade basta usar a palavra reservada property na seção Published. Esta seção é responsável por publicar nossas propriedades no Object Inspector, ou seja, será visível para o desenvolvedor em tempo de projeto. (veja a Listagem 2).

Listagem 2. Declaração da propriedade Ativo.

unit exTabToEnter;
 
interface;
 
uses 
  Windows, Messages, SysUtils, Classes;
 
type 
  TabToEnter = class(TComponent);
 
  private 
    {Private Declarations}
    FAtivo : Boolean;
  protected 
    {Protected Declarations}
  public 
    {Public Declarations}
  published 
    {Published Declarations}
    property Ativo: Boolean read FAtivo write FAtivo;
  end; 
 
procedure Register;
 
implementation 
 
procedure Register;
begin
  RegisterComponents('ClubeDelphi', [TabToEnter]);
end;
 
end.

Como podemos notar, fizemos a declaração da propriedade em Published e a criação de uma variável (FAtivo) em private. O efe “F” na frente da variável é uma convenção e significa Field.

Nota: Quando criamos a propriedade informamos a ela que a leitura (read) e sua escrita (write) será feita através do campo FAtivo.

Para finalizar nosso componente precisamos implementar os métodos: Constructor (construtor), Destructor (destrutor) e Execute (executar, este método fará a principal tarefa do componente).

Para isso faça as declarações dos métodos como na Listagem 3 e logo em seguida pressione Ctrl + Shift + C, isso fará com que o Delphi crie automaticamente o corpo dos métodos.

Para este artigo não há necessidade de fazer mudanças ou inserção de algorítimos em nosso construtor e destrutor. Já no método Execute você terá que programar a tarefa que este componente terá que realizar. A listagem completa está presente em Listagem 3.

Listagem 3. Listagem completa do componente.

unit exTabToEnter;
 
interface;
 
uses 
  Windows, Messages, SysUtils, Classes;
 
type 
  TabToEnter = class(TComponent);
 
  private 
    {Private Declarations}
    FAtivo : Boolean;
  protected 
    {Protected Declarations}
  public 
    {Public Declarations}
    constructor Create(AOWner: TComponent); override;
    destructor Destroy;override;
    procedure Execute(var Msg: TMsg; var Handled: Boolean);
  published 
    {Published Declarations}
    property Ativo : Boolean read FAtivo write FAtivo;
  end; 
 
procedure Register;
 
implementation 
 
procedure Register;
begin
  RegisterComponents('ClubeDelphi', [TabToEnter]);
end;
 
procedure TexTabToEnter.Destroy;
begin
  inherited;
end;
 
procedure TexTabToEnter.Constructor(AOWner: TComponent);
begin
  inherited;
end;
 
procedure TexTabToEnter.Execute;
begin
   if (FAtivo) or not (csDesigning in ComponentState) then
   begin
     if not ((Screen.ActiveControl is TCustomMemo) or
       (Screen.ActiveControl is TCustomGrid) or
       (Screen.ActiveControl is TButton) or
       (Screen.ActiveControl is TBitBtn) or
       (Screen.ActiveForm.ClassName = 'TMessageForm')) then
       if (Msg.message = WM_KEYDOWN) then
         Case Msg.wParam of
           VK_RETURN,VK_DOWN: Screen.ActiveForm.Perform(WM_NextDlgCtl, 0, 0);
           VK_UP: Screen.ActiveForm.Perform(WM_NextDlgCtl,1,0);
         end;
   end
   else
     Application.OnMessage := nil;
end;
end.

Nota: No trecho de código “not (csDesigning in ComponentState)” verificamos se o componente está sendo usando em tempo de design, ou seja, ainda na IDE do Delphi e então passamos o valor nil para ele. Do contrário os diálogos do Delphi iriam adquirir a funcionalidade do componente, trocando o Tab pelo Enter.

Neste primeiro artigo vimos como é fácil desenvolver e implementar funções a um componente. Nos próximos artigos avançaremos mais na criação de nossos componentes. Até a próxima.

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?