IDE – Criando meu próprio componente #14

Share Button

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

  /// 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.

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

  /// 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.

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”:

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

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.

    ///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;

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