![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
Es que eso de recorrer la lista de componentes... Nunca ha terminado de gustarme lo del RTTI. Que sí, que será muy útil, pero no termino de verlo.
|
#2
|
||||
|
||||
¿Quién dijo RTTI?
LineComment Saludos |
#3
|
||||
|
||||
Lo de recorrer la lista de componentes de un formulario, ¿no necesita RTTI para que funcione? Pregunto.
|
#4
|
||||
|
||||
No. Lo que trae Delphi de fabrica es similar a crear mi propio arreglo (matriz) de componentes y exponer una propiedad para poder evaluarlo.
Basicamente, al poner un control se hace algo como: Formulario.ObjetoPadre.Add(ObjetoHijo). Y eso a donde va? a un arreglo. RTTI tiene que ver con "Introspección", que es la habilidad de poder evaluar las características del entorno/runtime/código desde dentro del mismo runtime. Si es un poco "deficiente" en Delphi, es que eso es un problema universal en los lenguajes con compilador Y tipos estáticos y sin un soporte de runtime potente, que es casi todos. Y es muy facil y natural en lenguajes con tipos dinámicos (como python), interprete (que es un introspector!) o con compiladores dinámicos (JIT). Por eso en .NET/Java es ligeramente mas potente la introspección (aunque sigue siendo engorroso en contraste con el codigo normal). En donde introspección/código normal es casi que lo mismo es en lenguajes homoiconicos como LISP, FORTH y demás.
__________________
El malabarista. |
#5
|
||||
|
||||
Tal como dice Mario. Aunque por un momento me ha entrado la duda de si el operador is -que casi seguro sería necesario en este contexto- no cae en el terreno de RTTI.
LineComment Saludos |
#6
|
||||
|
||||
Si no estoy equivocado, el operador is esta implementado mediante RTTI, lo cual lo hace "seguro" y "completo"; tambien devolveria True en los casos en que los objetos, pudiendo ser de distintas clases, son de asignacion compatible; esto tambien aplicaría a interfaces (siempre y cuando se declaren con GUID)
Por otro lado por eso sigo pensando que la opcion 2 es mas segura en este caso, pudiendo usar colecciones con tipos genericos, o si se trata de las versiones mas antiguas de Delphi, un array of TDBxxx |
#7
|
||||
|
||||
Cita:
Cita:
Cita:
![]() LineComment Saludos |
#8
|
||||
|
||||
Veo que la duda que tenía es bastante común (si "IS" necesita RTTI o no). Si no recuerdo mal, Delphi 6 (que es donde me quedé yo) necesita que se compile con RTTI para que IS funcione. No sé si en versiones posteriores han optimizado algo y ya no es necesario.
|
#9
|
||||
|
||||
Por ejemplo esto:
Una clase puede implementar varias interfaces; luego, mediante el operador is me aseguro de que puedo realizar un cast sin problemas El problema del codigo anterior es que la linea OtraClase := TOtraClase(AdderSubstractor);, no solo que compila perfecto, sino que no da error en runtime; hasta que se intenta usar la clase. Evidentemente se produce un access violation al invocar al metodo Say Luego, otra variante es el uso del as
Eso tambien compila perfectamente pero eleva una excepcion EInvalidCast |
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Ocultar componentes en tiempo de diseño | ElDioni | OOP | 3 | 29-11-2011 17:41:47 |
Componentes en tiempo de diseño | ElDuc | OOP | 12 | 10-02-2011 06:02:15 |
eventos en tiempo de diseño | jar | OOP | 0 | 27-01-2007 22:09:11 |
Indices En Tiempo De Diseño?? | amadis | Conexión con bases de datos | 0 | 12-04-2006 20:22:01 |
Diseño en tiempo de ejecucion | Nelson Alberto | Impresión | 2 | 26-01-2006 09:34:12 |
![]() |
|