sexta-feira, 16 de março de 2012

Lazarus Pascal - Criando componentes - II

No post anterior ( Lazarus Pascal - Criando componentes - II ) discutimos o protótipo da classe TGeraHtml. Agora falta realmente colocar funcionalidades nesta classe que será um componente.

Vamos criar duas variáveis PRIVADAS (private) que armazenarão o texto de HTML gerado em duas formas:


  • A forma de lista de strings;
  • A forma de texto inteiro (uma só string);


Estas variáveis são FHTMLDoc (formato de lista de strings) e FHTMLText (uma só string inteiriça). Para seguir o padrão do Lazarus usamos a letra "F" antecedendo os nomes das variáveis privadas.

E na seção Published da classe definimos a propriedade DocumentoHtml com o tipo TStringList, que lê ou devolve o parâmetro FHTMLDoc.

O pacote para o componente

Vamos então criar um pacote para este componente:


É mostrada uma tela de diálogo onde colocamos a unidade do componente (UComponente_GeraHtml.pas) através do botão Add:


Pressione o botão Compile e depois Install (1a. vez) ou Use => Install (2a. vez em diante).

Após o Install, se tudo der certo, o Lazarus vai reiniciar.

Coloque este componente em um formulário, e observe o Object Inspector:


Observe que apenas pela declaração de uma propriedade TStringList (DocumentoHtml) já aparece o botão que aciona o editor de código. No entanto, ele ainda não é operacional pelo fato de necessitar de acréscimos para funcionar.

O construtor da classe

Os métodos e propriedades funcionais aparecem no Object Inspector, mas para que funcionem corretamente, é preciso que o componente tenha um construtor. Deixamos de colocá-lo para mostrar a sua necessidade:



No construtor é preciso declarar a herança do construtor da classe imediatamente superior (TComponent) expresso na variável AOwner de chamada. Repare que no construtor fizemos a inicialização do campo de tipo TStringList, pois isto é necessário para que se consiga invocar o editor de código ao se pressionar o botão "..." ao lado do campo. Recompilamos o pacote e instalamos.

Quando clicamos no botão "...'" aparece o Editor abaixo:


Erros

No entanto, você vai obter erros para acessar este editor e até para gravar algum formulário com este componente incorporado. Apesar da propriedade DocumentoHtml ser do tipo TStringList, vamos optar pelo tipo TStrings e fazer a sua atribuição no construtor por um método acessor considerando sim o tipo como TStringList. Portanto, devemos proceder às seguintes alterações:



Caso a visibilidade desta imagem não o satisfaça, vamos enumerar o que fizemos:


  • A variável FHTMLDoc, que armazena o valor da propriedade DocumentoHtml, foi declarada como TStrings;
  • Declaramos um método acessor (procedure setHtmlDoc) que envia um valor do tipo TStrings;
  • Modificamos o tipo da propriedade DocumentoHtml para TStrings;
  • Colocamos o método acessor para ajustar a propriedade DocumentoHtml;
  • No construtor, criamos a variável que armazena a propriedadeDocumentoHtml como TStringList, apesar de ela ser do tipo TStrings;
  • No método acessor, utilizamos a procedure Assign do tipo TStrings;


Desta forma, o componente não mais dá o erro de Access violation até para salvar um formulário onde foi colocado este componente.







10 comentários:

  1. Este comentário foi removido por um administrador do blog.

    ResponderExcluir
  2. Olá! Parabéns pelo artigo.
    Segui todos os passos, compilou, instalou e reiniciou a IDE mas não apareceu o componente. O que pode estar errado?

    ResponderExcluir
    Respostas
    1. Prezado Cléber,

      Está utilizando a última versão do Lazarus ?
      Está utilizando o Windows 7 Home Basic, Professional ou Ultimate ?
      Usa anti-virus ou firewall ?
      Desligou o UAC do Windows no Painel de Controle ?
      Chegou a dar um reboot na máquina ?

      Coloque aqui as respostas, e a gente vai trocando ideias.

      Excluir
    2. Este comentário foi removido pelo autor.

      Excluir
    3. ☼ Lazarus-1.4.4
      ☼ Windows 7 Ultimate
      ☼ UAC desativado
      ☼ Reboot: Não

      Excluir
    4. Na hora de instalar retorna a seguinte mensagem:
      The package Html does not have any “Register”
      procedure, which typically means, it does not provide
      any IDE addon. Installing it will probably only increase
      the size of the IDE and may even make it unstable.
      Hint: If you want to use a package in your project, use
      the “Add to project” menu item.

      Excluir
    5. Não se preocupe. Esta mensagem é como as Contra-indicações das bulas de qualquer medicamento, quando diz "pode dar dor de cabeça".
      É só uma prevenção porque o programador pode fazer um objeto enorme que pode sobrecarregar o Lazarus. Salvando em pacotes, qualquer problema você pode recuperar seu Lazarus e seus componentes.
      Pode concordar e prosseguir.

      Excluir
  3. Sim, já fiz isso.
    Mas em qual paleta o componente deve aparecer? Pois não aparece.

    ResponderExcluir
    Respostas
    1. Procure em todas as orelhas. De acordo com o "ancestor" ele escolhe em qual colocar. No exemplo dado, a tendência seria aparecer na mesma orelha de TStringList.

      Excluir
    2. E então, Bittencourt, deu certo ?

      Excluir