![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Hola, pues gracias a las aportaciones de todos los que os habeis interesado por el tema ya se por donde van los tiros.
AL Gonzales (ahora si lo escribi bien ![]() ![]() Otra duda: el uso de las RTTI merman el rendimiento de una aplicación? la duda viene de que las funciones RTTI entiendo que tienen que navegar por la jerarquia de clases y eso debe ser desde un punto de vista computacional muy costoso? estoy en lo cierto? Y otra pregunta mas: con las RTTI he conseguido informacion sólo sobre propiades de la seccion published. Se puede ir mas lejos y poder conseguir en tiempo de ejecucion informacion sobre propiedades que esten en las otras secciones? e informacion sobre variables? por lo que he visto solo se permite para propiedades (y no variables) que esten declaradas en published, pero teniendo en cuenta la falta de documentacion sobre las RTTI a lo mejor si es posible obtener informacion de cualquier componente, sea simple o no, de un objeto. Gracias por la información. Un saludo. PD: una curiosidad, ¿cuantas horas dedicais, en vuestro tiempo libre, a delphiar, ya sea porque os estais haciendo una aplicacion, por probar caracteristicas del lenguaje o entorno, porque para ustedes programar es como para un pintor hacer un cuadro,.... |
#2
|
||||||
|
||||||
No, pero ya vas mejorando.
![]() Cita:
![]() Vuelvo a poner la función que da solución al problema que planteas: Donde dice Proc2, sólo debes poner el nombre del método en cuestión, y donde dice TA, el nombre de la clase base en cuestión. Por favor, pregunta por los elementos que te resulten desconocidos o confusos. ![]() Cita:
Cita:
Cita:
Así mismo opté por declarar una clase recientemente en este otro caso, para que el compilador me generara información RTTI de una propiedad (ya que no basta que la propiedad sea publicada): http://www.clubdelphi.com/foros/show...6&postcount=12 Esto es lo que dice la ayuda sobre esa directiva: Cita:
Por otra parte, la Tabla de Métodos Virtuales (VMT) existe desde que Turbo Pascal vino a proponer destacadamente la programación orientada a objetos. Ya desde entonces Borland había diseñado una ingeniosa forma de guardar apuntadores a los métodos que podrían ser redefinidos (reimplementados) de una clase a otra dentro de la jerarquía. De tal forma que cada clase es en realidad su VMT, una tabla que la describe y que no sólo guarda punteros a métodos virtuales, sino una cantidad significativa de "meta código" adicional. Estas VMTs y la información que contienen no dependen de si la clase está compilada con la directiva $TypeInfo o no, su información comprende elementos privados (Private), protegidos (Protected), públicos (Public) y publicados (Published). Pero algo de saber es que no guarda detalle de todos ellos, sino nada más de los que son "clave" para realizar ciertas tareas, como por ejemplo la finalización de campos ("variables" del objeto) que usan contadores de referencia, como es el caso de los campos de tipo String. Cita:
Un abrazo en tiempo de ejecución. Al González. ![]() Última edición por Al González fecha: 07-02-2009 a las 22:19:49. |
#3
|
|||
|
|||
Buenas, antes de poner el codigo, una preguna mas: a lo largo de las versiones, delphi ha sufrido muchas modificaciones en las RTTI y el funcionamiento de la VTM, de forma que es complejo desde el punto de vista de la compatibilidad tener un codigo RTTI que sirva para distintas versiones de delphi?, la pregunta viene de que estoy haciendo algo generico pero que me sirva para cualquier version de delphi, pero si la situacion es (no lo se) que para cada version de delphi han salido modificaciones en las RTTI y VMT de forma que hace imposible la compatibilidad usando RTTI pues me llevaria un palo.
Saludos |
#4
|
|||
|
|||
Aqui pongo los dos archivos basicos:
- TUniverso , es la clase base de la jerarquia que estoy haciendo--- aunque se llama TUniversoE_S.pas porque habia cambiado los metodos de E/S. De hecho esa parte no la he terminado porque me tropeze con la duda motivo de este hilo en el foro. Aunque podria haber continuado, encontre la duda interesante y deje un poco de lado lo que tenia entre manos para entender un poco las VTM. Por eso a los metodos de E/S mejor no hacerles caso - Tipos --- define una serie de tipos de datos. Saludos. PD: ahora a machacar el codigo ![]() |
#5
|
||||
|
||||
Cita:
Cita:
Sin embargo la consulta en la VMT sólo resulta necesaria cuando el método base es abstracto (podría no serlo, implementándolo con sólo Begin y End). Como habrás visto, la otra función que escribí, RedefineProc1, "no" consulta a la VMT (en realidad sí lo hace, como siempre que hacemos referencia o llamamos a un método virtual, pero en este caso es responsabilidad implícita del compilador). Incluso se me ocurre una tercera forma de hacer la comparación de punteros, que sirva con métodos abstractos y que no use el operador VMTOffset ni ninguna otra referencia explícita a la VMT. No es muy elegante, pero considero que podría ser práctica: consiste en crear una instancia "dummy" de la clase base que declara el método abstracto, para poder hacer una comparación tipo Metodo.Code <> MetodoInstanciaDummy.Code (adaptando la función RedefineProc1 que escribí antes). Gracias por anexar el código, gushynet. Le echaré un vistazo en estos días. Saludos. Al González. ![]() Última edición por Al González fecha: 08-02-2009 a las 20:55:30. |
#6
|
|||
|
|||
Una pregunta mas. Situacion : tengo varios amigos que no programan en delphi sino en c++, VB, C#,....
Cual es la manera de compartir la jerarquia de clases que estoy implementando de forma que mis amigos pudieran declarar objetos de tipo TUniverso en sus programas? podría encapsularse en una dll y que ellos usaran la dll? En el caso de que si pudiera compartir mi clase mis amigos podrían crearse clases descendientes de TUniverso? (creo que esto es imposible). Saludos. |
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Saber que aplicacion tiene el foco | Omega | Varios | 3 | 13-07-2008 17:36:01 |
Sobreescribir método Paint y saber coordenadas a refrescar | Lord Delfos | Gráficos | 3 | 05-03-2008 13:48:28 |
saber si un field tiene el foco | salvanano | Conexión con bases de datos | 0 | 08-05-2007 16:22:48 |
Como saber los dias que tiene un mes?? | alfredosg19 | Varios | 3 | 06-03-2005 12:56:12 |
Saber si la Variable tiene letras | cmgenny | Varios | 1 | 11-05-2004 08:00:59 |
![]() |
|