IDE – Criando meu próprio componente #14

Criar um novo componente no Delphi é basicamente implementar algum comportamento “by code” que será executado quando for requisitado ao componente.

base
Um componente publicado na paleta de objetos da IDE permitem arrastar e soltar para os formulários entregando recursos RAD ao desenvolvedor.
O componente pode ter um comportamento visual no FORM quando herda de outro componente visual, ou não visual quando herda de um TComponent;

Exemplo

  • um componente visual: TEdit
  • componente não visual: TDatasource

estrutura de um componente
[code]
/// sample1
unit xxxx;

type
/// minha implementação
TMeuComponent = class(TComponent)
private
FAbout:string;
published
/// mostrar a propriedade no Object Inspect da IDE
property About:string read FAbout write FAbout;
end;

/// registrar o component na paleta da IDE
procedure register;

implementation
procedure register;
begin
RegisterComponents(‘MVCBr’,[TMeuComponent] );
end;
end.
[/code]

Caso o componente implemente uma interface é possível indicar qual a interface junto com a mesma declaração do novo componente:

[code]
/// sample2
unit xxxx;

type
IMeuComponent = interface
[Ctrl+G para obter um GUID]
….
end;
/// minha implementação
TMeuComponent = class(TComponent,IMeuComponent)
private
FAbout:string;
published
/// mostrar a propriedade no Object Inspect da IDE
property About:string read FAbout write FAbout;
end;

/// registrar o component na paleta da IDE
procedure register;

implementation
procedure register;
begin
RegisterComponents(‘MVCBr’,[TMeuComponent] );
end;
end.
[/code]

a pegadinha

Para componentes simples será suficiente o código de exemplo indicado. Já quando o componente encapsula outros componentes (visuais/ou não) que são ligados diretamente no FORM através de propriedades, será necessário código adicional para ajudar a IDE a retirar a ligação dos componentes quando não forem mais necessário.

vejamos um exemplo de um componente com um “link”:

[code]
///sample3
type
TDBMeuComponent = class(TComponent)
private
FDatasource:TDatasource;
published
property Datasource:TDatasource read FDatasource write FDatasource;
end;
[/code]

escrevendo para a IDE

Neste caso (sample3) a propriedade Datasource permitirá que em tempo de design seja ligado um TDatasource na propriedade Datasource; A ligação do componente ocorre visualmente na IDE (ligando as propriedade), o problema ocorre neste ponto em razão da IDE não saber lidar com o desfazimento desta ligação. Como a IDE não sabe qual o momento correto em desfazer a ligação, é necessário indicar esta situação no código através do método “Notification” como segue.

[code]
///sample4
type

TDBMeuComponent = class(TComponent)
private
FDatasource: TDatasource;
protected
procedure Notification(AComponent: TComponent;
AOperation: TOperation); override;
published
property Datasource: TDatasource read FDatasource write FDatasource;
end;

{ TDBMeuComponent }

procedure TDBMeuComponent.Notification(AComponent: TComponent;
AOperation: TOperation);
begin
inherited;
/// retira o link do datasource
if AComponent.Equals(FDatasource) and (AOperation = TOperation.opRemove) then
FDatasource := nil;
end;
[/code]

Importante !!!
A maioria dos BUGs de IDE em tempo de Design ocorre pela uso inadequado do Notification, então é bom ficar atento a este ponto obrigatório para aqueles que pensam em implementar novos componentes para a IDE do Delphi.

Exemplo Completo

2 comentários

  1. a dica do Notification é sensacional.
    com ela corrigi um bug de um componente de mais de 10 anos.

    grato

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *