Criao de Componentes em Delphi Prof Omero Francisco

  • Slides: 46
Download presentation
Criação de Componentes em Delphi Prof. Omero Francisco Bertol, M. Sc. (omero@pb. cefetpr. br)

Criação de Componentes em Delphi Prof. Omero Francisco Bertol, M. Sc. (omero@pb. cefetpr. br) Outubro/ 2005

Componentes (1/4) • Os componentes, ou controles, são os elementos centrais dos aplicativos Delphi.

Componentes (1/4) • Os componentes, ou controles, são os elementos centrais dos aplicativos Delphi. • Os controles podem ser definidos como componentes visuais em: – Controles ajanelados: podem receber o foco de entrada (Edit e Button). – Controles não-ajanelados: não possuem nenhum manipulador, não podem receber o foco de entrada (Label e Speed. Button)

controles ajanelados, podem receber foco de entrada controles não-ajanelados, não podem receber foco de

controles ajanelados, podem receber foco de entrada controles não-ajanelados, não podem receber foco de entrada

Componentes (2/4) • Os componentes podem ser visuais (Label e Image) e não-visuais (Data.

Componentes (2/4) • Os componentes podem ser visuais (Label e Image) e não-visuais (Data. Source e Table). • Todo componente que é adicionado a um formulário torna-se um objeto de interface com o usuário: – um elemento da interface: Main. Menu, Button e Speed. Button; – um objeto de banco de dados: IBDatabase e ADOConnection 1; – uma função de sistema.

Componentes (3/4) • Todos os componentes são objetos inseridos no conceito de orientação a

Componentes (3/4) • Todos os componentes são objetos inseridos no conceito de orientação a objetos. • Estes componentes encapsulam vários conjuntos de dados, assim como funções de acesso aos mesmos. • Um elemento declarado a partir de um componente, “herda” propriedades, métodos e eventos e se comporta como o objeto do qual herdou tais características.

Componentes (4/4) • Todos os componentes formam parte da “Hierarquia de Classes de Objetos”

Componentes (4/4) • Todos os componentes formam parte da “Hierarquia de Classes de Objetos” do Delphi denominada VCL- Visual Component Library (ou Biblioteca de Componentes Visuais). • O Delphi possui mais de 500 classes de objeto, e toda nova classe deve ser herdeira de uma já existente. • As classes, ou componentes, são organizados em páginas, agrupados por finalidade, na paleta de componentes.

VCL- Visual Component Library • A VCL é a biblioteca de classes de componentes

VCL- Visual Component Library • A VCL é a biblioteca de classes de componentes do Delphi. • Todos os objetos da VCL são derivados da classe ancestral TObject. • Isto permite que o TObject seja utilizado como substituto para qualquer tipo de dados do sistema: – Classe Ancestral : = Classe Derivada; • Por exemplo, os métodos de resposta a eventos usualmente têm um parâmetro Sender do tipo TObject: procedure TForm 1. Form. Show(Sender: TObject); procedure TForm 1. Bit. Btn 1 Click(Sender: TObject);

Obtendo Ajuda sobre a Paleta de Componentes.

Obtendo Ajuda sobre a Paleta de Componentes.

Ajuda sobre a “página” ADO da Paleta de Componentes.

Ajuda sobre a “página” ADO da Paleta de Componentes.

Hierarquia da Classe, ou Componente, ADOTable.

Hierarquia da Classe, ou Componente, ADOTable.

Hierarquia das Classes no Delphi TObject é a “classe base” para todas as classes.

Hierarquia das Classes no Delphi TObject é a “classe base” para todas as classes. TPersistent define as características básicas de todos os objetos que necessitam de alocação dinâmica de memória e que podem ser atribuídos uns aos outros. TComponent TControl define as características de todos os componentes que têm a capacidade de aparecer nas páginas de componentes e de serem manipulados em tempo de projeto. é a classe base para todos os componentes visuais. TGrafic. Control componentes que não têm a capacidade de receber foco. TWin. Control componentes que têm a habilidade de receber foco e de conter outros componentes dentro de si.

Demonstrando a hierarquia de classes TObject create, destroy, free TPersistent TComponent name, tag TControl

Demonstrando a hierarquia de classes TObject create, destroy, free TPersistent TComponent name, tag TControl caption, left, top TGraphic. Control TSpeed. Button TImage glyph picture, stretch TWin. Control TButton TBit. Btn glyph, kind, layout

Uma Classe, ou Componente, possui: • Atributos, ou Propriedades – semelhante as variáveis de

Uma Classe, ou Componente, possui: • Atributos, ou Propriedades – semelhante as variáveis de memória, as propriedades armazenam dados sobre o objeto que afetam o seu funcionamento ou sua aparência. • Eventos – são também propriedades, mas armazenam o endereço de memória onde está uma procedure ou function. – estas procedures ou functions são executadas automaticamente quando algum tipo de ação ocorre com o objeto. • Métodos – são rotinas internas do objeto que nos prestam algum serviço, executando alguma tarefa.

Propriedades (Properties) • As propriedades são atributos de classes que determinam o “estado” de

Propriedades (Properties) • As propriedades são atributos de classes que determinam o “estado” de um objeto, como, por exemplo, sua posição e sua aparência, e também seu comportamento: – Object Inspector, aba Properties. • No Object Inspector são listadas somente as propriedades de tempo de projeto (designtime) de um componente: – especificador de acesso Published. • Através do Help é possível obter uma lista completa das propriedades do componente.

Eventos de componentes (Events) • Quando o usuário pratica uma ação sobre um componente,

Eventos de componentes (Events) • Quando o usuário pratica uma ação sobre um componente, como, por exemplo, dando um clique do mouse sobre ele, o componente gera um evento. • Quando for necessário adicionar código a um programa, ou aplicação, a primeira pergunta que deve ser feita é: – Onde ? – Em um ambiente motivado por eventos, como é o ambiente Windows, o código é sempre executado em resposta a um evento. – Object Inspector, aba Events.

Métodos de componentes • Os métodos de componentes são exatamente iguais a quaisquer outros

Métodos de componentes • Os métodos de componentes são exatamente iguais a quaisquer outros métodos. • Há procedimentos e funções relacionados a um objeto que podem ser chamados para executar a ação correspondente. • por exemplo: Set. Focus, Fieldby. Name, First, Open, Close, Show. Modal. • Também são usados como resposta a um evento (clique do mouse sobre o componente, por exemplo).

Sintaxe para definição de Classes e Objetos em Delphi (object Pascal) Subclasse Superclasse type

Sintaxe para definição de Classes e Objetos em Delphi (object Pascal) Subclasse Superclasse type Nome. Da. Classe = class( Nome. Da. Classe. Pai ) {definição dos atributos} {definição dos métodos} end; { Instância a classe, ou seja: declara o objeto a partir do tipo de dados definido pela classe } var Nome. Do. Objeto : Nome. Da. Classe;

Visões de uma Classe • Visão externa – interface da classe: declarações das propriedades

Visões de uma Classe • Visão externa – interface da classe: declarações das propriedades e operações aplicáveis aos objetos da classe, podem incluir declarações de outras classes, constantes, variáveis e exceções necessárias para completar a abstração. • Visão interna – implementação do comportamento: operações pré-definidas na interface da classe.

Interface da Classe (controle de acesso): 1. Pública (public) uma declaração que é parte

Interface da Classe (controle de acesso): 1. Pública (public) uma declaração que é parte da interface de uma classe e é visível a qualquer parte do ambiente de referenciamento (escopo) da classe. (Classe, Subclasses e Instâncias) 2. Protegida (protected) uma declaração que forma parte da interface de uma classe, mas não é visível para quaisquer outras classes, exceto suas subclasses. (Classe, Subclasses) 3. Privada (private) uma declaração que forma parte da interface de uma classe, mas não é visível para quaisquer outras classes. (Classe)

Interface da Classe (controle de acesso): 4. Publicada (published) • um campo ou método

Interface da Classe (controle de acesso): 4. Publicada (published) • um campo ou método publicado não somente está disponível em tempo de execução, mas também em tempo de projeto • propriedades declaradas publicadas aparecem no inspetor de objetos em tempo de projeto • componentes do Delphi têm uma interface publicada que é usada pelo inspetor de objetos • valor default

A Palavra-chave Self • Os métodos possuem um parâmetro implícito, que é uma referência

A Palavra-chave Self • Os métodos possuem um parâmetro implícito, que é uma referência ao objeto atual. • Dentro de um método é possível se referir ao objeto atual usando a palavra-chave self. • Esse parâmetro oculto extra é necessário quando existe a declaração de diversos objetos da mesma classe, de forma que cada vez que se aplica o método a um dos objetos, ele opera somente em seus próprios dados e não afeta os objetos irmãos. • Self do Delphi This do C++ e do Java

A Palavra-chave override • redefinir, ou sobrescrever • polimorfismo de sobreposição = substituir o

A Palavra-chave override • redefinir, ou sobrescrever • polimorfismo de sobreposição = substituir o método da classe ancestral por uma nova versão • acrescentar código ao método existente através da palavra reservada inherited: type My. Sub. Class = class(My. Class) procedure One; override; end; procedure My. Sub. Class. One; begin // novo código. . . // chama o procedimento herdado My. Class. One inherited One; end;

Declarando um Construtor: • método Create – objetivo = alocar a memória para o

Declarando um Construtor: • método Create – objetivo = alocar a memória para o objeto (diferente de inicializá-lo) • constructor – objetivo = prover um construtor personalizado que cria o objeto e lhe dá um valor inicial – é um procedimento especial, quando aplicado a uma classe Delphi automaticamente aloca memória para um objeto daquela classe – preferencialmente o construtor deverá ter o nome Create constructor Create(AOwner: TComponent); override;

Criando a página “Mini. Curso” para os novos Componentes.

Criando a página “Mini. Curso” para os novos Componentes.

Criando um “pacote” para os novos Componentes.

Criando um “pacote” para os novos Componentes.

Salvar o “pacote” e as unit’s dos novos componentes na pasta “Mini. Curso”. Extensões:

Salvar o “pacote” e as unit’s dos novos componentes na pasta “Mini. Curso”. Extensões: dpk delphi package bpl borland package library pas delphi source file (unit) dcu delphi compily unit

Definindo as opções “gerais” do pacote.

Definindo as opções “gerais” do pacote.

package Mini. Curso; {$R *. res} {$ALIGN 8} {$ASSERTIONS ON} {$BOOLEVAL OFF} {$DEBUGINFO ON}

package Mini. Curso; {$R *. res} {$ALIGN 8} {$ASSERTIONS ON} {$BOOLEVAL OFF} {$DEBUGINFO ON} {$EXTENDEDSYNTAX ON} {$IMPORTEDDATA ON} {$IOCHECKS ON} {$LOCALSYMBOLS ON} {$LONGSTRINGS ON} {$OPENSTRINGS ON} {$OPTIMIZATION ON} {$OVERFLOWCHECKS OFF} {$RANGECHECKS OFF} {$REFERENCEINFO ON} {$SAFEDIVIDE OFF} {$STACKFRAMES OFF} {$TYPEDADDRESS OFF} {$VARSTRINGCHECKS ON} {$WRITEABLECONST OFF} {$MINENUMSIZE 1} {$IMAGEBASE $400000} {$IMPLICITBUILD OFF} requires rtl, vcldb, dbrtl; contains ofb. Edit in 'ofb. Edit. pas', ofb. DBEdit in 'ofb. DBEdit. pas', ofb. DBDate. Time. Picker in 'ofb. DBDate. Time. Picker. pas' ; end. Estrutura básica do pacote de Componentes criado.

Criando um “novo” Componente DBEdit: Ancestor type: escolher o componente ancestral, ou superclasse obs.

Criando um “novo” Componente DBEdit: Ancestor type: escolher o componente ancestral, ou superclasse obs. classe da qual serão “herdadas” as características e funcionalidades básicas. Class Name: definir o nome do novo componente Palette Page: indicar a página da paleta na qual será “instalado” o novo componente Unit file name: definir o nome da unit do novo componente obs. criar uma pasta para conter os arquivos do pacote de novos componentes. Criando, ou adicionando, um novo Componente ao “pacote”.

Unit com a estrutura básica do Componente “Tofb. DBEdit” criado. unit ofb. DBEdit; interface

Unit com a estrutura básica do Componente “Tofb. DBEdit” criado. unit ofb. DBEdit; interface uses Sys. Utils, Classes, Controls, Std. Ctrls; type Tofb. DBEdit = class(TDBEdit) private { Private declarations } protected { Protected declarations } public { Public declarations } published { Published declarations } end; Nomenclatura utilizada: • “T” representa “type” (por padão, o nome de toda classe no Delphi começa com “T”); • “ofb” define uma nova categoria de componentes, para organizar os componentes criados pelo autor; • “DBEdit” indica a herança da classe TDBEdit. procedure Register; implementation procedure Register; begin Register. Components('Mini. Curso', [Tofb. DBEdit]); end. Página dos novos Componentes.

Novo componente DBEdit com as seguintes características adicionais: • utilização da tecla Enter para

Novo componente DBEdit com as seguintes características adicionais: • utilização da tecla Enter para mudar de campo • mudança da cor de fundo ao receber o foco • cor padrão, ao perder o foco type Tofb. DBEdit = class(TDBEdit) private FOn. Enter: TNotify. Event; FOn. Exit: TNotify. Event; FOn. Focus. Color: TColor; // declarar "Graphics" no uses para usar TColor FOn. Not. Focus. Color: TColor; FEnter. Like. Tab: Boolean; protected procedure Key. Press(var Key: char); override; procedure Do. Enter; override; procedure Do. Exit; override; public constructor Create(AOwner: TComponent); override; published property On. Enter: TNotify. Event read FOn. Enter write FOn. Enter; property On. Exit: TNotify. Event read FOn. Exit write FOn. Exit; property Color. On. Focus: TColor read FOn. Focus. Color write FOn. Focus. Color; property Enter. Like. Tab: Boolean read FEnter. Like. Tab write FEnter. Like. Tab; end; variáveis ou campos FOn. Enter FOn. Exit FOn. Focus. Color FOn. Not. Focus. Color FEnter. Like. Tab do novo componente: redefine o evento On. Enter do componente TDBEdit redefine o evento On. Exit do componente TDBEdit baseada no tipo TColor, esta variável armazena a cor de fundo do campo quando ele receber o foco determina a cor de fundo quando o componente não está com o foco permite que o uso da tecla Enter seja desabilitado para um campo

Métodos redefinidos, ou sobrescritos, no novo componente. procedure Register; begin Register. Components('Mini. Curso', [Tofb.

Métodos redefinidos, ou sobrescritos, no novo componente. procedure Register; begin Register. Components('Mini. Curso', [Tofb. DBEdit]); end; // definições iniciais do componente (inicializa as // variáveis, ou campos, do componente) constructor Tofb. DBEdit. Create(AOwner: TComponent); begin // chama o construtor da classe base TDBEdit inherited Create(AOwner); Auto. Select : = False; Color. On. Focus : = cl. Btn. Face; FOn. Not. Focus. Color : = Color; Enter. Like. Tab : = True; end; // atribui-se o valor da propriedade // Coloron. Focus e FOn. Not. Focus. Color // ao objeto, de acordo com o evento // disparado (On. Enter ou On. Exit) procedure Tofb. DBEdit. Do. Enter; begin Color : = Color. On. Focus; if Assigned(FOn. Enter) then FOn. Enter(Self); end; procedure Tofb. DBEdit. Do. Exit; begin Color : = FOn. Not. Focus. Color; if Assigned(FOn. Exit) then FOn. Exit(Self); end; procedure Tofb. DBEdit. Key. Press(var Key: char); var FEdit. Temp: TCustom. Form; begin // se o usuário pressionou a tecla Enter, pega-se o Handle do formulário // e envia-se uma mensagem que muda o foco para o próximo objeto if (Key = #13) and FEnter. Like. Tab then begin FEdit. Temp : = Get. Parent. Form(Self); Send. Message(FEdit. Temp. Handle, WM_NEXTDLGCTL, 0, 0); Key : = #0; Exit; end; inherited Key. Press(Key); end;

Removendo um pacote de componentes instalado.

Removendo um pacote de componentes instalado.

Instalando o pacote de componentes através do arquivo *. bpl.

Instalando o pacote de componentes através do arquivo *. bpl.

Instalando o pacote de componentes através do arquivo *. bpk.

Instalando o pacote de componentes através do arquivo *. bpk.

Instalando o pacote de componentes através do arquivo *. bpk. Página dos Componentes instalados.

Instalando o pacote de componentes através do arquivo *. bpk. Página dos Componentes instalados.

Instalando, ou adicionando, um componente ao pacote. localizar a “unit” do componente a ser

Instalando, ou adicionando, um componente ao pacote. localizar a “unit” do componente a ser instalado localizar o “pacote” que receberá o componente instalado

JEDI Visual Component Library • uma das maiores e mais conhecidas bibliotecas de componentes

JEDI Visual Component Library • uma das maiores e mais conhecidas bibliotecas de componentes para Delphi • são ao todo 21 paletas, contendo novos componentes e versões estendidas de controles VCL • muitos componentes pertenciam a outros projetos (como por exemplo o RX Lib), e agora foram agregados à essa biblioteca open source http: //prdownloads. sourceforge. net/jvcl/JVCL 300 Complete. JCL 195 -Build 1848. zip? download

http: //delphi-jedi. org/

http: //delphi-jedi. org/

http: //homepages. borland. com/jedi/jvcl/

http: //homepages. borland. com/jedi/jvcl/

http: //www. torry. net/ Um dos maiores repositórios de componentes para Delphi na internet.

http: //www. torry. net/ Um dos maiores repositórios de componentes para Delphi na internet.

RX Lib • Biblioteca de componentes desenvolvida pelos russos Fedor Koshevnikov, Igor Pavluk e

RX Lib • Biblioteca de componentes desenvolvida pelos russos Fedor Koshevnikov, Igor Pavluk e Serge Korolev, ela está disponível em todas as versões do Delphi. Adicionando inúmeros componentes ao ambiente de desenvolvimento, que incrementam ou suprem necessidades dos componentes padrão da VCL. • Além de ser freeware, a RX Lib é distribuída com código fonte, podendo servir também como uma valiosa fonte de estudo para quem deseja se familiarizar com a criação de componentes. • download: www. delphibr. com. br/download. php

Referências Revista Clube. Delphi (www. clubedelphi. net) Edição 39 - Ano IV: • Seu

Referências Revista Clube. Delphi (www. clubedelphi. net) Edição 39 - Ano IV: • Seu componente data-aware (estenda o DBEdit, criando um componente personalizado com acesso a dados). por Emerson Facunte, páginas 26 -28 Edição 53 - Ano IV: • Criação de componentes (construa um calendário data -aware). por Daniel Wildt, páginas 14 -16