![]() |
![]() |
| Paypal | 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
|
||||
|
||||
|
Si te entendi bien. El tipo lo puedes averiguar buscandolo en las propiedades del objeto de destino en vez de en el puntero que te pasan.
Por ejemplo, si te pasan el objeto A para fijar la propiedad B, solo tienes que saber de que tipo es B para suponer que el puntero que te pasan apunta a una variable del mismo tipo. Y en el peor de los casos, si te pasan un puntero a una variable de tipo incorrecto, saltara una excepcion al asignarlo a la propiedad lo que me parece un comportamiento muy correcto ya que nos esta señalizando que ha ocurrido un error. |
|
#2
|
|||
|
|||
|
Seria algo como esto
tambien puedes mirar antes si la propiedad existe en el objeto destino. Te recomiendo que mires los tips de la pagina de neftali, donde hay otra variante de esta funcion y tambien una explicacion de PPropInfo. Tambien que mires sobre la funcion GetPropList y la unidad Typinfo. PD: en el codigo, getobject es:
stringtoparams transforma una string a tipo TParams, GetStrings devuelve una string entre comillas y m es un TMethod. Saludos y a ver si te sirve. Última edición por coso fecha: 20-10-2008 a las 17:36:40. |
|
#3
|
|||
|
|||
La funcion Asignar es un método del objeto por lo que no intervienen mas objetos que el que llama al método. Esta funcion en principio deberia ser capaz de cambiar el valor de una de sus propiedades simples, es decir, propiedades como el caption de un TButton por ejemplo que es de tipo AnsiString. Como dije en el correo anterior, el problema que se me plantea y por el que no puedo usar la informacion proporcionada por rtti es en el segundo parámetro del método asignar. De que tipo de dato es?, depende de la propiedad que indique en el primer parámetro. Lo que esta claro es que no existen funciones condicionales en la que el tipo de uno de sus parámetros venga en función de otro parámetro de la misma rutina. El primer parámetro no tiene problema, es el nombre de la propiedad a la que quiero cambiar su valor. Por tanto, las posibles soluciones que veo son: * sobrecargar el procedimiento asignar: - procedure TObjeto.asignar(NombrePropiedad:AnsiString;valor:integer)overload; - procedure TObjeto.asignar(NombrePropiedad:AnsiString;valor:double)overload; -.... y asi con todos los tipo simples. * pasar el segundo parámetro como pointer y dentro de la rutina averiguo el tipo al que apunta el pointer (a un entero,a un real, booleano, string,....), hago el casting y realizo la asignacion. Pero claro, ¿como me entero de a lo que apunta un pointer, si lo unico que puedo averiguar a través del pointer es la direccion que tiene almacenada pero no que es lo que representa?. Por esta razón creo que voy a optar por sobracargar la rutina Asignar, una por cada tipo de dato simple. Y mira que lo del pointer me parecia una solucion mas elegante, pero no se puede tener todo en la vida , se puede tener sexo, alcohol pero no un pointer con mas conversacion.Gracias por la ayuda. Un saludo. Salud y delphi Última edición por gushynet fecha: 20-10-2008 a las 17:27:40. |
|
#4
|
|||
|
|||
|
pero...si buscas informacion sobre GetPropInfo encontraras que dando el nombre de la propiedad (tal cual, como una string) te devuelve que tipo de dato es aquella propiedad, con lo que ya tendrias resuelto que cast debes hacerle al puntero que pasas como segundo parametro. De todas maneras, puedes hacer que el segundo parametro sea string, y segun el tipo de propiedad, hacer strtofloat, strtoint o bien encontrar el objeto pertinente segun su nombre. Otra manera seria haciendo una combinacion de las dos:
- procedure TObjeto.asignar(NombrePropiedad:AnsiString;valor:string) - procedure TObjeto.asignar(NombrePropiedad:Ansistring;valor : TObject); el que tiene valor como string luego podrias transformarlo segun te convenga a strtofloat,etc...y el que tenga valor : TObject hacer un cast segun el tipo de clase que sea la propiedad. Incluso, en vez de string, pasar valor : variant, con lo que lo simplificarias bastante. Última edición por coso fecha: 20-10-2008 a las 18:27:16. |
|
#5
|
|||
|
|||
|
de la misma manera con typinfo.PropType(c,pn), donde c seria el objeto y pn el nombre de la propiedad...te devuelve el tipo de dato que es aquella propiedad.
|
|
#6
|
|||
|
|||
|
es mas...creo que lo que tu querias hacer, es lo que hace exactamente el tipo 'variant'. Saludos
|
|
#7
|
|||
|
|||
|
gracias por la ayuda, tenias razón coso.
Un saludo. Salud y Delphi |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Google apunta a una página de mi sitio que ya no existe | Io | HTML, Javascript y otros | 7 | 01-10-2007 01:00:11 |
| A quien apunta el parametro | jzginez | Conexión con bases de datos | 3 | 28-08-2006 16:41:19 |
| Variables Tipo Pointer | omar_e_rc | Varios | 4 | 24-03-2005 18:51:34 |
| Una variable que apunta a dos objetos | mlara | OOP | 5 | 10-12-2004 04:53:41 |
| 1 Gb de correo gratuito: Spymac, otro que se apunta al carro ... | kinobi | Noticias | 3 | 19-04-2004 17:22:50 |
|