![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Ayudante generico para enumerativos
Saludos,
Una buena introduccion a este tema seria leer este otro ¿String a Enumerativo con record helper? ¿Es posible? La idea general consiste en tener un ayudante para los tipos enumerados. Parece que se llega a una encrucijada porque los record helper no soportan herencia, lo cual nos impide reutilizar el codigo para tal fin. Esto termina en una explosion de helpers los cuales hacen todos exactamente lo mismo, la unica variante es el tipo sobre el cual opera el helper Tomando varias ideas de la web he escrito un record generico que permite manipular los tipos enumerativos de Delphi de manera sencilla, y gracias al generico, se puede permitir usar cualquier tipo enumerativo. La idea es envolver la RTTI para obtener informacion dinamicamente del tipo enumerado. Si bien no lo he probado, es necesario Delphi 2010 como minimo que es en donde entra en juego esta nueva RTTI extendida Sin mas, la interface que se expone consiste en dos tipos fundamentales, el primero y mas importante es Enum<T> Código PHP:
Los metodos son bastante sencillos de entender y tienen su pequeño comentario sobre que hacen Una pequeña muestra de codigo de lo que se puede lograr es la siguiente: Código PHP:
Que pasa si quiero tener distintas representaciones en string del mismo enumerativo? Una forma bastante elegante y que permite el reuso de codigo es el uso de atributos. Quien nunca haya leido o usado atributos le invito a explorar la documentacion El segundo tipo importante que exporta la unidad es el atributo EnumNamesAttribute Código PHP:
Como es informacion que se almacena en el ejecutable, como si fuera "una rtti mas", deben ser valores constantes, que se puedan resolver en tiempo de compilacion. Una limitante de Delphi es que, aunque realmente un "array of TMiEnumerativo of string" es constante, no lo permite en atributos. Es ese el motivo por el cual el atributo EnumNamesAttribute se implementa usando un string delimitado por algun caracter Otro pormenor es que si bien el tipo enumerado puede ser anotado con atributos, no sucede lo mismo con los valores del enumerado (el codigo compila, ni da advertencias, pero luego no hay forma de extraer la informacion) Pasemos a un ejemplo que creo que va a ser mas practico: Código PHP:
Bueno, en realidad cuando anotamos al tipo TScoped con el atributo, en realidad lo que estamos haciendo es "invocar a su constructor". Si se fijan en el constructor, esta definido asi: Código PHP:
![]() Que es justamente el constructor El parametro "Names" es un string, que deberia ser un string delimitado por un algun caracter (personalizable por el parametro "Delimiter", por defecto la coma). Dicho string se separa usando el delimitador y se almacena en un arreglo. En el caso de que el numero de string sea diferente al del enumerativo, aquellos que queden indefinidos se interpretan como "EmptyStr" y lo que sobre se ignora Que es esa cosa que llame "identificador". Bueno ya que Delphi permite anotar todas las veces que uno quiera con el mismo atributo a un tipo, me parecio una buena idea que la API permitiera definir distintas representaciones, pero obviamente era necesario algo que "identifique" Un ejemplo en accion: Código PHP:
|
#2
|
||||
|
||||
![]() ![]() ![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#3
|
||||
|
||||
Muy interesante Agustín.
![]() ![]() ![]()
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi ![]() P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
![]() |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Ayudante de office 97 | gianfranco_tont | Varios | 5 | 20-02-2012 18:29:13 |
programar un ayudante al estilo del office 2000 | maricarmenNS | Varios | 9 | 20-02-2012 15:19:38 |
Procedimiento Generico para oprimir un boton | GerTorresM | Varios | 4 | 29-12-2009 15:24:35 |
procedimiento de asignación genérico | gushynet | OOP | 23 | 09-09-2008 10:50:15 |
reporte generico | piyugo | Impresión | 8 | 07-05-2004 18:20:03 |
![]() |
|