{"id":901,"date":"2024-11-20T09:46:40","date_gmt":"2024-11-20T12:46:40","guid":{"rendered":"https:\/\/adrianosantostreina.com.br\/blog\/?p=901"},"modified":"2024-12-13T14:33:40","modified_gmt":"2024-12-13T17:33:40","slug":"como-trabalhar-com-customattributes-no-delphi","status":"publish","type":"post","link":"https:\/\/adrianosantostreina.com.br\/blog\/como-trabalhar-com-customattributes-no-delphi\/","title":{"rendered":"Como trabalhar com CustomAttributes no Delphi"},"content":{"rendered":"\n<p>Os <strong>CustomAttributes<\/strong> s\u00e3o um recurso poderoso no Delphi que permite adicionar metadados \u00e0s classes, m\u00e9todos, propriedades ou at\u00e9 mesmo par\u00e2metros. Essa funcionalidade foi introduzida para facilitar a cria\u00e7\u00e3o de c\u00f3digo mais din\u00e2mico e robusto, ampliando as possibilidades de abstra\u00e7\u00e3o e personaliza\u00e7\u00e3o.<\/p>\n\n\n\n<p>A principal vantagem dos CustomAttributes \u00e9 permitir que informa\u00e7\u00f5es adicionais sejam associadas a elementos de c\u00f3digo, sem interferir na l\u00f3gica ou estrutura base. Esses metadados podem ser extra\u00eddos e utilizados em tempo de execu\u00e7\u00e3o, permitindo comportamentos din\u00e2micos e adapt\u00e1veis.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Neste artigo, exploraremos como criar, utilizar e extrair informa\u00e7\u00f5es de CustomAttributes no Delphi, passando por um exemplo pr\u00e1tico para demonstrar como integrar essa funcionalidade em seus projetos.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>O que s\u00e3o CustomAttributes no Delphi?<\/strong><\/h4>\n\n\n\n<p>No Delphi, os <strong>CustomAttributes<\/strong> s\u00e3o implementados como classes derivadas de <code>TCustomAttribute<\/code>. Elas permitem que informa\u00e7\u00f5es adicionais sejam anexadas a tipos, m\u00e9todos, propriedades ou par\u00e2metros. Essas informa\u00e7\u00f5es, ou metadados, n\u00e3o afetam diretamente o comportamento do c\u00f3digo em tempo de compila\u00e7\u00e3o, mas podem ser lidas em tempo de execu\u00e7\u00e3o usando <strong>RTTI (Runtime Type Information)<\/strong>.<\/p>\n\n\n\n<p>Este recurso \u00e9 amplamente utilizado em frameworks como ORM (Object-Relational Mapping), onde atributos customizados podem ser usados para mapear classes e propriedades a tabelas e colunas de banco de dados, por exemplo.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Como criar um CustomAttribute?<\/strong><\/h4>\n\n\n\n<p>A cria\u00e7\u00e3o de um CustomAttribute no Delphi \u00e9 simples. Voc\u00ea precisa definir uma classe que herda de <code>TCustomAttribute<\/code> e adicionar os campos ou propriedades necess\u00e1rios para armazenar informa\u00e7\u00f5es. Vamos ver um exemplo b\u00e1sico:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >type\n  \/\/ Definindo um CustomAttribute para armazenar metadados de campos\n  CampoAttribute = class(TCustomAttribute)\n  private\n    FNome: string;\n  public\n    constructor Create(const ANome: string);\n    property Nome: string read FNome;\n  end;\n\n\/\/ Implementa\u00e7\u00e3o do construtor\nconstructor CampoAttribute.Create(const ANome: string);\nbegin\n  FNome := ANome;\nend;\n<\/pre><\/div>\n\n\n\n<p>Aqui, <code>CampoAttribute<\/code> permite associar um nome a um campo ou propriedade de uma classe.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Usando CustomAttributes em Classes<\/strong><\/h4>\n\n\n\n<p>Depois de criado o atributo, ele pode ser associado a classes, propriedades ou m\u00e9todos. Veja um exemplo de como utiliz\u00e1-lo em uma classe:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >type\n  [CampoAtribute('Tabela_Cliente')]\n  TCliente = class\n  private\n    FId: Integer;\n    FNome: string;\n  public\n    [CampoAtribute('Id_Cliente')]\n    property Id: Integer read FId write FId;\n\n    [CampoAtribute('Nome_Cliente')]\n    property Nome: string read FNome write FNome;\n  end;\n<\/pre><\/div>\n\n\n\n<p>No exemplo acima, associamos o nome de uma tabela ao atributo da classe e nomes de colunas aos atributos das propriedades.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Extraindo CustomAttributes em Tempo de Execu\u00e7\u00e3o<\/strong><\/h4>\n\n\n\n<p>Para acessar os atributos definidos, utilizamos a <strong>RTTI<\/strong>. Abaixo, demonstramos como recuperar as informa\u00e7\u00f5es de atributos associados a propriedades de uma classe:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >uses\n  System.Rtti, System.TypInfo;\n\nprocedure TForm1.ListarAtributos(Classe: TObject);\nvar\n  Contexto: TRttiContext;\n  Tipo: TRttiType;\n  Prop: TRttiProperty;\n  Atributo: TCustomAttribute;\nbegin\n  Memo1.Lines.Clear;\n  \/\/ Inicializando o contexto RTTI\n  Contexto := TRttiContext.Create;\n  try\n    Tipo := Contexto.GetType(Classe.ClassType);\n    for Prop in Tipo.GetProperties do\n    begin\n      for Atributo in Prop.GetAttributes do\n      begin\n        if Atributo is CampoAttribute then\n          Memo1.Lines.Add(Format('Propriedade: %s, Atributo: %s',\n            [Prop.Name, CampoAttribute(Atributo).Nome]));\n      end;\n    end;\n  finally\n    Contexto.Free;\n  end;\nend;\n\n\/\/ Exemplo de uso\nprocedure TForm1.Button1Click(Sender: TObject);\nvar\n  Cliente: TCliente;\nbegin\n  Cliente := TCliente.Create;\n  try\n    ListarAtributos(Cliente);\n  finally\n    Cliente.Free;\n  end;\nend;\n<\/pre><\/div>\n\n\n\n<p>O c\u00f3digo acima percorre todas as propriedades da classe <code>TCliente<\/code>, buscando atributos do tipo <code>CampoAttribute<\/code> e exibindo suas informa\u00e7\u00f5es.<\/p>\n\n\n\n<p>Observa\u00e7\u00f5es: Nos exemplos acima criamos um form no Delphi com apenas um Button e um Memo. Criamos uma unit App.CustomAtribute.pas com a classe CustomAtribute e outra unit para conter o objeto TCliente. Chamamos a unit de App.Cliente.<\/p>\n\n\n\n<p>O exemplo percorre os atributos de TCliente, localiza o CampoAtribute e publica dentro de um Memo. Simples assim.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Aplica\u00e7\u00f5es Pr\u00e1ticas<\/strong><\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Mapeamento de Banco de Dados<\/strong>: Atribuir nomes de tabelas e colunas diretamente no c\u00f3digo para facilitar a integra\u00e7\u00e3o com bancos de dados.<\/li>\n\n\n\n<li><strong>Valida\u00e7\u00e3o de Dados<\/strong>: Criar atributos que definem regras de valida\u00e7\u00e3o espec\u00edficas para campos.<\/li>\n\n\n\n<li><strong>Serializa\u00e7\u00e3o<\/strong>: Configurar atributos que indicam como as propriedades de uma classe devem ser serializadas.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Participe da Comunidade no Telegram<\/h3>\n\n\n\n<p>\ud83d\ude80 Quer continuar essa discuss\u00e3o e trocar ideias com outros desenvolvedores? Junte-se \u00e0 nossa comunidade no Telegram! L\u00e1, voc\u00ea pode comentar sobre o que achou deste artigo, tirar suas d\u00favidas e compartilhar suas experi\u00eancias com Delphi e ainda discutir ou tirar suas d\u00favidas sobre os mais variados temas em uma comunidade com mais de 1.000 desenvolvedores.<\/p>\n\n\n\n<p>\ud83d\udd17 <a href=\"https:\/\/t.me\/AdrianoSantosCommunity\" target=\"_blank\" rel=\"noreferrer noopener\">Clique aqui para entrar na comunidade<\/a><\/p>\n\n\n\n<p>Te vejo l\u00e1!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Conclus\u00e3o<\/strong><\/h3>\n\n\n\n<p>Os <strong>CustomAttributes<\/strong> no Delphi oferecem uma maneira poderosa de incorporar metadados ao seu c\u00f3digo, permitindo maior flexibilidade e dinamismo em suas aplica\u00e7\u00f5es. Com sua utiliza\u00e7\u00e3o, \u00e9 poss\u00edvel reduzir a rigidez do c\u00f3digo e melhorar a organiza\u00e7\u00e3o e a manutenibilidade.<\/p>\n\n\n\n<p>Experimente integrar CustomAttributes em seus projetos, e veja como este recurso pode transformar a forma como voc\u00ea estrutura e gerencia suas aplica\u00e7\u00f5es no Delphi.<\/p>\n\n\n\n<p>Mais informa\u00e7\u00f5es <a href=\"https:\/\/docwiki.embarcadero.com\/RADStudio\/Athens\/en\/Extracting_Attributes_at_Run_Time\" target=\"_blank\" rel=\"noreferrer noopener\">nesse link<\/a>. <\/p>\n\n\n\n<p>Adriano Santos<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Os CustomAttributes s\u00e3o um recurso poderoso no Delphi que permite adicionar metadados \u00e0s classes, m\u00e9todos, propriedades ou at\u00e9 mesmo par\u00e2metros. Essa funcionalidade foi introduzida para facilitar a cria\u00e7\u00e3o de c\u00f3digo mais din\u00e2mico e robusto, ampliando as possibilidades de abstra\u00e7\u00e3o e personaliza\u00e7\u00e3o. A principal vantagem dos CustomAttributes \u00e9 permitir que informa\u00e7\u00f5es adicionais sejam associadas a elementos [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":906,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-901","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/901","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/comments?post=901"}],"version-history":[{"count":5,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/901\/revisions"}],"predecessor-version":[{"id":907,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/901\/revisions\/907"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/media\/906"}],"wp:attachment":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/media?parent=901"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/categories?post=901"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/tags?post=901"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}