ventajas software relacion programacion proceso los lenguaje las historia funciones entre embarcadero elementos ejemplos desventajas comunicativo borland delphi annotations delphi-2010 delphi-xe delphi-xe2

software - programacion delphi ejemplos



¿Qué elementos del lenguaje se pueden anotar utilizando la función de lenguaje de atributos de Delphi? (1)

Delphi 2010 introdujo atributos personalizados que se pueden agregar a declaraciones y métodos de tipo. ¿Para qué elementos del lenguaje se puede usar un atributo personalizado?

Los ejemplos que he encontrado hasta ahora incluyen declaraciones de clase, campos y métodos. (Y las clases genéricas AFAIK no admiten atributos personalizados).

Algunos ejemplos se muestran en este artículo . Parece que las variables (externas a cualquier declaración de clase) también pueden tener atributos.

Según este artículo, los atributos se pueden usar para

  • campos y métodos de clase y registro
  • parámetros del método
  • propiedades
  • declaraciones de enumeración no locales
  • declaraciones de variables no locales

¿Hay otros elementos de idioma donde se pueden colocar los atributos?

Actualización: este artículo indica que los atributos personalizados se pueden colocar antes de las propiedades: http://francois-piette.blogspot.de/2013/01/using-custom-attribute-for-data.html

Contiene este ejemplo de código:

type TConfig = class(TComponent) public [PersistAs(''Config'', ''Version'', ''1.0'')] Version : String; [PersistAs(''Config'', ''Description'', ''No description'')] Description : String; FTest : Integer; // No attribute => not persistent Count : Integer; [PersistAs(''Config'', ''Test'', ''0'')] property Test : Integer read FTest write FTest; end;

Supongo que también hay una forma de leer atributos en argumentos de métodos como

procedure Request([FormParam] AUsername: string; [FormParam] APassword: string);


¡Interesante pregunta! Puede declarar atributos en casi cualquier cosa , el problema es recuperarlos usando RTTI. Aquí hay una demostración rápida de la consola para declarar atributos personalizados para:

  • Enums
  • Tipo de función
  • Tipo de procedimiento
  • Tipo de método ( of object )
  • Tipo de alias
  • Tipo de registro
  • Tipo de clase
  • Tipo de registro interno de una clase
  • Campo de registro
  • Método de registro
  • Campo de instancia de clase
  • Campo clase class ( class var )
  • Método de clase
  • Variable global
  • Función global
  • Variable local

No encontré una forma de declarar un atributo personalizado para una property de una clase. Pero un atributo personalizado se puede adjuntar a los métodos getter o setter.

Código, la historia continúa después del código:

program Project25; {$APPTYPE CONSOLE} uses Rtti; type TestAttribute = class(TCustomAttribute); [TestAttribute] TEnum = (first, second, third); [TestAttribute] TFunc = function: Integer; [TestAttribute] TEvent = procedure of object; [TestAttribute] AliasInteger = Integer; [TestAttribute] ARecord = record x:Integer; [TestAttribute] RecordField: Integer; [TestAttribute] procedure DummyProc; end; [TestAttribute] AClass = class strict private type [TestAttribute] InnerType = record y:Integer; end; private [TestAttribute] function GetTest: Integer; public [TestAttribute] x: Integer; [TestAttribute] class var z: Integer; // Can''t find a way to declare attribute for property! property Test:Integer read GetTest; [TestAttribute] class function ClassFuncTest:Integer; end; var [TestAttribute] GlobalVar: Integer; [TestAttribute] procedure GlobalFunction; var [TestAttribute] LocalVar: Integer; begin end; { ARecord } procedure ARecord.DummyProc; begin end; { AClass } class function AClass.ClassFuncTest: Integer; begin end; function AClass.GetTest: Integer; begin end; begin end.

El problema es recuperar esos atributos personalizados. Mirando la unidad rtti.pas , los atributos personalizados pueden ser recuperados para:

  • Tipo de registro ( TRttiRecordType )
  • Tipo de instancia ( TRttiInstanceType )
  • Tipo de método ( TRttiMethodType )
  • Tipo de puntero ( TRttiPointerType ): ¿para qué se usa?
  • Tipo de procedimiento ( TRttiProcedureType )

No hay forma de recuperar ningún tipo de RTTI para nivel de "unidad" o variables y procedimientos locales, por lo tanto, no hay forma de recuperar información sobre los atributos.