Capítulo X
Novos Componentes
Uma das maiores vantagens do Delphi sobre os demais concorrentes é o fato da geração
de novos componentes (de novos objetos).
O exemplo a seguir pretende colocar uma luz sobre o assunto mostrando os passos
básicos para o desenvolvimento de componentes, estes passos são:
· Criando propriedades e métodos;
· Controle ao acesso as propriedades;
· Propriedades de leitura e escrita;
· Enviando e recebendo mensagens através dos componentes.
Criando Componentes
Componentes são como blocos de construção para as aplicações Delphi. Você poderá
construir uma aplicação simplesmente adicionando estes blocos e modificando os eventos,
propriedades ou métodos. Todos os componentes possuem duas propriedades em comum: Name
e Tag. Alguns componentes estão distribuídos na Component Pallete. Mas alguns componentes
(TApplication, TMenu, TMenuItem, e TScreen) são disponíveis apenas através de seu código.
Você pode criar novos componentes utilizando os seguintes passos:
1. Derivando os novos componentes de um componente já existente.
2. Modificando um componente.
3. Registrando um componente.
O componente é criado como uma unit separada de um projeto, podendo ser formado por
uma ou mais unit´s. Após você criação do componente, compilação e instalação dentro da paleta
de componentes. Para usar o componente, selecione-o da Component Pallete e adicione-o ao
formulário.
A Classe TComponent
Você criará um novo componente utilizando diretamente o Code Editor, para isso você
usará a Component Expert. Na verdade todos os componentes criados serão derivados de
componentes já existentes, mesmo que você deseje criar um componente sem eventos ou
propriedades ele será herdado de uma classe já existente a TComponent.
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
A TComponent é uma classe inicial de componentes, sob ela é que foi feita a árvore de
componentes Delphi, por exemplo, a classe TControl, possuem mais de 70 componentes
descendentes, tais como: TBitBtn, TButton, TCheckBox, TColorDialog, TComboBox, TForm,
TFontDialog, TGroupBox, THeader, TImage, TLabel, TListBox, TMainMenu e TMediaPlayer. E
você ainda pode derivar mais alguns descendentes daqui.
Um Componente Simples
Vamos criar agora um novo componente, para tanto abra um novo projeto e selecione
File | New... selecione a página New e o item . Será mostrada a janela da Component
Expert. Informe os seguintes parâmetros conforme o desenho abaixo:
Clique no botão OK para aceitar a entrada. A Component Expert criará automaticamente
o seguinte código para a chamada da Unit1:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
CustComp1 = class(TComponent)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation
2
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
procedure Register;
begin
RegisterComponents('Custom', [CustComp1]);
end;
end.
Adicionando o Componente a Palheta
Por incrível que pareça mas você terminou de construir seu primeiro componente, e bem
verdade que ele não faz absolutamente nada além de abrigar as únicas propriedades padrões
existentes em qualquer componente: Name e Tag. Mas já estamos no começo.
Salve o componente como Cust, selecionando File | Save, dentro do diretório de
instalação do Delphi na pasta Lib. Para instalar o componente selecione Component | Install...
aparecerá a seguinte janela diálogo:
Clique no botão Add... e será mostrada a janela diálogo Add Module. Use o botão
Browse para localizar o arquivo Cust.PAS, note que ele será remetido a ListBox Installed units:
e caminho do componente (se você salvou-o em outro diretório) será colocado no Search Path.
+ Para novos componentes crie um diretório embaixo do Delphi entitulado Lib2, pois
se você sempre colocar cada novo componente no diretório Lib, caso você precise copiar apenas
os seus componentes, dificilmente os distinguirá dos componentes padrões do Delphi.
+ Lembre-se que o Search Path é um campo texto limitado em 255 posições então
também não adianta para cada componente novo colocar um diretório separado, pois facilmente
você estourará o tamanho do campo Search Path.
3
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Finalmente clique no botão OK e a COMPLIB.DCL (Biblioteca padrão de
componentes) será recompilada. Ao término da compilação, note que foi criada uma nova página
na Component Pallete (Custom) e adicionado o novo componente (CustomComp1).
Para testar seu novo componente crie um novo formulário insira o componente
CustomComp1. Observe através da Object Inspector as propriedades do seu novo componente:
Name e Tag.
Criando Propriedades
Para o nosso componente vamos adicionar uma propriedade que armazenará um valor
inteiro, para isto chame novamente a unit do componente e insira os códigos abaixo da
declaração private:
type
CustComp1 = class(TComponent)
private
fDemoProp:Integer;
Agora criaremos uma propriedade aonde o valor será lido e escrito através desta variável
para tanto insira os códigos abaixo da declaração published:
published
property DemoProp: Integer read fDemoProp write fDemoProp;
end;
+ A seção Public (pública) abriga as variáveis, procedimentos ou funções que podem
ser lidos e executados por quaisquer outras units que utilizem (através cláusula Uses) a unit em
questão já a seção Published (Publicado) é utilizada para inserir propriedades ou eventos aos
componentes.
Salve o componente e recompile a biblioteca através das opções Component | Rebuild
Library..., ao término da recompilação, note que para o componente foi criada uma nova
propriedade definida como DemoProp que armazena o valores inteiros.
Métodos de Acesso
A propriedade criada pode disparar um procedimento ou uma função para executar
determinadas ações (por exemplo, colocando um intervalo válido para a variável criada).
Primeiro, escreva a seguinte função para a função read do comando property:
function Cust.GetDemoProp: integer;
begin
Result := fDemoProp;
end;
Escreva o procedimento para a função write do comando property:
procedure Cust.SetDemoProp(val: integer);
begin
if val > 99 then
begin
4
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
DemoProp := fDemoProp;
raise exception.create('Valor não pode ser maior que 99');
end
else
fDemoProp := val;
end;
Declare a função GetDemoProp e o procedimento SetDemoProp na seção private,
conforme o exemplo abaixo:
private
fDemoProp:Integer;
function GetDemoProp: integer;
procedure SetDemoProp(val: integer);
E para a seção published troque as propriedades:
published
property DemoProp: Integer read GetDemoProp write SetDemoProp;
Salve o componente e recompile a biblioteca através das opções Component | Rebuild
Library..., note que a propriedade não mais permitirá valores superiores a 99.
Criando novos tipos
De modo semelhante aos já descritos uma propriedade pode abrigar uma lista de tipos
definidos, para tanto na seção type defina o conjunto que abrigará os tipos:
type
TDirecao = (drCima, drBaixo, drLado);
Na seção private crie uma nova variável com base no tipo definido:
private
fDemoProp:Integer;
fNovaProp:TDirecao;
E finalmente na seção published defina a propriedade:
published
property DemoProp: Integer read GetDemoProp write SetDemoProp;
property NovaProp: TDirecao read fNovaProp write fNovaProp;
Salve o componente e recompile a biblioteca através das opções Component | Rebuild
Library..., teste a nova propriedade.
Pensando em Objetos
Mas para que devemos criar novos componentes? Para aliviarmos os “futuros” trabalhos.
Lembra-se quando você copiava aqueles pequenos pedaços de rotinas (do tipo: cálculo de
CPF/CGC, cálculo de fatorial, um cabeçalho de relatório...) os objetos servem exatamente para
guardamos estes “pequenos pedaços” de blocos de programação, ou se você preferir o termo
serve para encapsularmos estes códigos.
5
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Construindo um Objeto
Quando for construir objetos lembre-se que ele deve servir à vários aplicativos, nunca
construa um objeto que servirá apenas a um único aplicativo (é perda de tempo).
Todo o sistema (pelo menos for Windows) necessita de uma janela Sobre o Sistema
então vamos transformar a janela sobre criada no Capítulo IV em um objeto prático que sirva a
qualquer sistema, inicie um novo projeto e crie um novo componente, para tanto abra um novo
projeto e selecione File | New... selecione a página New e o item Component. Será mostrada a
janela da Component Expert. Informe os seguintes parâmetros:
Class Name: SobreDlg
Ancestor type: TComponent
Palette Page: Dialogs
Clique no botão OK para aceitar a entrada. As alterações propropostas no objeto estão
documentadas com o fonte:
unit SobreDlg;
{ Este objeto permite a criação de uma "caixa sobre" padrão para
diversos aplicativos. }
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, fSobre;
type
TSobreDlg = class(TComponent)
private
FProductName, FVersion, FCopyright, FComments: string;
public
function Execute: Boolean;
published
property NomeProduto: string read FProductName write FProductName;
property Versao: string read FVersion write FVersion;
property Direitos: string read FCopyright write FCopyright;
property Comentario: string read FComments write FComments;
end;
const
PROCESSOR_INTEL_386 = 386;
PROCESSOR_INTEL_486 = 486;
PROCESSOR_INTEL_PENTIUM = 586;
PROCESSOR_INTEL_860 = 860;
PROCESSOR_MIPS_R1000 = 1000;
PROCESSOR_MIPS_R2000 = 2000;
PROCESSOR_MIPS_R3000 = 3000;
PROCESSOR_MIPS_R4000 = 4000;
6
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
PROCESSOR_ALPHA_21064 = 21064;
PROCESSOR_PPC_601 = 601;
PROCESSOR_PPC_603 = 603;
PROCESSOR_PPC_604 = 604;
PROCESSOR_PPC_620 = 620;
var
SobreDlg: TSobreDlg;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Dialogs', [TSobreDlg]);
end;
function TSobreDlg.Execute: Boolean;
var
OsInfo: TOSVERSIONINFO;
SysInfo: TSYSTEMINFO;
MemStat: TMEMORYSTATUS;
DiskNo: Integer;
begin
// Cria a janela em memória
F_Sobre := TF_Sobre.Create(Application);
try
with F_Sobre do
begin
// Coloca as propriedades nas variaveis do formulario
ProductName.Caption := NomeProduto;
Version.Caption := Versao;
Copyright.Caption := Direitos;
Comments.Caption := Comentario;
Caption := 'Sobre ' + NomeProduto;
OsInfo.dwOSVersionInfoSize := sizeof(TOSVERSIONINFO);
GetVersionEx(OsInfo);
// Versão do Windows
case OsInfo.dwPlatformId of
VER_PLATFORM_WIN32s : WinVersion.Caption := 'Windows 3.1';
VER_PLATFORM_WIN32_WINDOWS : WinVersion.Caption := 'Windows 95';
VER_PLATFORM_WIN32_NT : WinVersion.Caption := 'Windows NT';
end;
DosVersion.Caption := format('%d.%d Ver : %d',
[OsInfo.dwMajorVersion,OsInfo.dwMinorVersion,LOWORD(OsInfo.dwBuildNumber)]);
// Pega o processador
GetSystemInfo(SysInfo);
case SysInfo.dwProcessorType of
PROCESSOR_INTEL_386 : CPU.Caption :=
format('%d %s',[SysInfo.dwNumberOfProcessors, 'Intel 80386']);
PROCESSOR_INTEL_486 : CPU.Caption :=
7
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
format('%d %s',[SysInfo.dwNumberOfProcessors, 'Intel 80486']);
PROCESSOR_INTEL_PENTIUM : CPU.Caption :=
format('%d %s',[SysInfo.dwNumberOfProcessors, 'Intel Pentium']);
PROCESSOR_MIPS_R1000 : CPU.Caption :=
format('%d %s',[SysInfo.dwNumberOfProcessors, 'MIPS R1000']);
PROCESSOR_MIPS_R2000 : CPU.Caption :=
format('%d %s',[SysInfo.dwNumberOfProcessors, 'MIPS R2000']);
PROCESSOR_MIPS_R3000 : CPU.Caption :=
format('%d %s',[SysInfo.dwNumberOfProcessors, 'MIPS R3000']);
PROCESSOR_MIPS_R4000 : CPU.Caption :=
format('%d %s',[SysInfo.dwNumberOfProcessors, 'MIPS R4000']);
PROCESSOR_ALPHA_21064 : CPU.Caption :=
format('%d %s',[SysInfo.dwNumberOfProcessors, 'ALPHA 21064']);
PROCESSOR_PPC_601 : CPU.Caption :=
format('%d %s',[SysInfo.dwNumberOfProcessors, 'Power PC 601']);
PROCESSOR_PPC_603 : CPU.Caption :=
format('%d %s',[SysInfo.dwNumberOfProcessors, 'Power PC 603']);
PROCESSOR_PPC_604 : CPU.Caption :=
format('%d %s',[SysInfo.dwNumberOfProcessors, 'Power PC 604']);
PROCESSOR_PPC_620 : CPU.Caption :=
format('%d %s',[SysInfo.dwNumberOfProcessors, 'Power PC 620']);
end;
MemStat.dwLength := sizeof(TMEMORYSTATUS);
GlobalMemoryStatus(MemStat);
FreeMemory.Caption := format('Tot: %d KB Disp: %d KB',
[Trunc(MemStat.dwTotalPhys/1024),Trunc(MemStat.dwAvailPhys/1024)]);
DiskNo := 3;
FreeDisk.Caption := '';
FreeResources.Caption := '';
repeat
if DiskNo < 7 then
FreeDisk.Caption := FreeDisk.Caption + format('%s: %d MB ',
[Chr(DiskNo + Ord('A')- 1),Trunc(DiskFree(DiskNo)/1024/1024)])
else
FreeResources.Caption := FreeResources.Caption + format('%s: %d MB ',
[Chr(DiskNo + Ord('A')- 1),Trunc(DiskFree(DiskNo)/1024/1024)]);
inc(DiskNo);
until DiskFree(DiskNo) = -1;
ProgramIcon.Picture.Graphic := Application.Icon;
Result := (ShowModal = IDOK);
end;
finally
F_Sobre.Free;
end;
end;
end.
Para esta primeira etapa do nosso objeto note que tudo gira em torno do procedimento
Execute (o nome se deve apenas a uma questão de padronização com os outros objetos da
palheta Dialogs), através deste procedimento todos as outras variáveis são iniciadas, resta-nos
agora a criação do formulário, crie um novo formulário, ATENÇÃO: Não aproveite o formulário
8
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
F_Sobre já criado pois este é uma herança do formulário F_Splash, crie-o conforme o desenho
abaixo:
+ Para os objetos dentro do painel: altere a propriedade Caption: Nome do Produto,
Versão, Direitos Resevados e Comentário e a propriedade Name: ProductName, Version,
Copyright, Comments.
+Para os objetos fora do painel: altere os objetos Labels da esquerda a propriedade
Caption (Ex: Usuário, Companhia) e os da direita a propriedade Name (Ex: UserName,
CompanyName)
+ A propriedade Name para todos os componentes, na ordem que eles aparecem são:
Objeto Tipo Objeto Tipo Objeto Tipo Objeto Tipo
ProgramIcon TImage ProductName TLabel Version TLabel Copyright TLabel
Comments TLabel Label1 TLabel UserName TLabel Label2 TLabel
CompanyName TLabel Label3 TLabel WinVersion TLabel Label4 TLabel
DosVersion TLabel Label5 TLabel CPU TLabel Label6 TLabel
FreeMemory TLabel Label7 TLabel FreeDisk TLabel FreeResources TLabel
F_Sobre TForm Panel1 TPanel
Salve a janela com o nome de FSobre e o componente como SobreDlg e compile a
biblioteca e instale o componente: SobreDlg.PAS, teste o componente da seguinte forma:
4. Remova do projeto o formulário F_Sobre e retire sua chamada da cláusula Uses;
5. Coloque o componente no formulário F_Menu e acerte as suas propriedades;
6. Insira a chamada ao componente na opção de Sobre o Sistema:
procedure TF_Menu.ItemAuxilio1Click(Sender: TObject);
begin
9
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
SobreDlg.Execute;
end;
7. Compile e rode o sistema.
Bem-vindo ao mundo dos objetos.
Finalmente
É facilmente reconhecido que este novo ambiente da Borland possui um poder um tanto
ilimitado, tanto na criação de sistemas como no desenvolvimento de aplicações de multimídia
resta-nos (a nós desenvolvedores) deixarmos a imaginação fluir e iniciar tudo aquilo que sempre
desejamos, espero que lhe tenha ajudado ao menos a trilhar o caminho das pedras.
10