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