PDA

Ver la Versión Completa : Como obtener las variables de un objeto


TEO127
07-06-2007, 04:58:17
Hola amigos mi consulta es la siguiente. dado un objeto cualquiera
ej :

type
MyObjeto = Class(TObject)

Private
_Data : TDataset;
_Serial: Tlist;
_Floop: TObject;
Public
function Extv : Double;
Procedure opc1;
Procedure opc2;
End;


Como puedo obtener una referencia a las variables declaradas en este

algo asi como

Var
M : MyObject;
..
..
for i:=0 M.Variables.Count-1 do
...
.
.


Ando en busca de un simil de components o controls, pero que me liste las variables contenidas en mi objeto (no los componentes ni los controles).

Cualquier sugerencia se agradecera.

Saludos.

dec
07-06-2007, 08:16:32
Hola,

Hasta donde yo llego es posible acceder a las propiedades de un objeto siempre que estas sean públicas; es posible enumerar sus propiedades, "recorrerlas", acceder a sus valores e incluso cambiarlos, pero, tratando con variables... no se me ocurre la forma.

Además creo que lo que planteas es cuando menos raro. Quiero decir que es posible que existan otras soluciones para lo que quieres conseguir. Si lo explicas tal vez alguien pueda echarte un cable.

TEO127
07-06-2007, 08:41:51
Dec gracias por tomarte la molestia de responder a mi incognita lo que puedo agregar a mi consulta es lo siguiente "dado un objeto cualquiera, recorrer sus variables una a una" .
Tengo una funcion que realiza un proceso sobre las variables (dependiendo de su tipo) de los objetos , pero cada objeto que proceso aunque decienden de la misma clase , en su implementacion cada uno tiene sus propias variables.

Ejemplo :


type
TFormExta : TClass = (TForm)
.
.
.
Private
.
.
Public
a : Tipo1;//-> esta variable quiero capturar
b : Tipo2;//-> esta variable quiero capturar
c : Tipo3;//-> esta variable quiero capturar

end;

TFormExtb : TClass = (TForm)
.
.
.
Private
.
.
Public
d : Tipox;//-> esta variable quiero capturar
e : Tipoy;//-> esta variable quiero capturar
f : Tipoz;//-> esta variable quiero capturar
end;


MyProc (Obj :TForm)
Begin
¡¡¡¡¡¡¡¡aqui tengo que recorrer el Obj y analizar cada variable!!!!!!!!!!!
.
.
.
End;

Var
A : TFormExta;
B : TFormExtb;
C : TFormExtb;
Begin
MyProc (A);
MyProc (B);
MyProc (C);
End.




Espero haber aclarado mas el asunto.
Saludos

dec
07-06-2007, 08:53:49
Hola,

Pues no sé que se pueda acceder a las variables de un objeto, aun siendo estas públicas. Lo que sí sé es que puede accederse a las propiedades de un objeto, mediante Run-time Type information (http://www.google.es/search?hl=es&q=Delphi+RTTI). Tal vez deberías plantearte añadir propiedades a tus objetos. O tal vez algún otro compañero sepa darte una respuesta mejor.

TEO127
07-06-2007, 08:58:34
Gracias por tus comentarios DEC, ya habia intentado por el lado de la RTTI pero no he logrado encontrar la solucion.

Espero que a alguien se le ocurra algo.

Saludos

roman
07-06-2007, 09:32:01
Con RTTI me parece que sólo podrás acceder a la propiedades publicadas (published). Por curiosidad, ¿qué es lo que quieres hacer? Vamos, que no es usual querer hacer algo así en un lenguaje como delphi.

// Saludos

TEO127
07-06-2007, 09:38:56
Hola Roman, la finalidad es que me estoy fabricando un recolector de basura, no lo queria mencionar porque las respuestas se podrian desvirtuar (ej: se podria prestar para que hicieran comentarios de como maneja la memoria delphi, los modelos de memoria, que delphi no necesita un garbage collector,etc. y ese tipo de cosas) y apuntar a otro punto el cual tengo cubierto.

Vamos Roman como en esa gran sabiduria acumulada de mas de 11.000 mensajes no habra algo que me ayude ;).

Saludos.

TEO127
07-06-2007, 09:51:14
Roman y Dec se han fijado en el Code Explorer de Delphi 7?

hay tres secciones

private

public

published


En esta ventana muestra las variables que quiero recuperar, si el IDE de delphi lo puede mostrar y el IDE esta hecho en Delphi enconces se puede hacer ;), el problema es como.

Saludos.

dec
07-06-2007, 10:12:43
Hola,

Bueno. Si no quieres que entremos, pues no entramos. Pero, se supone que un objeto que se encarga de inicializar ciertas variables debe encargarse de su destrucción. Para eso están los métodos constructores y destructores de un objeto. ¿No?

Entonces el "garbage colection" que planteas (según a mí se me ocurre) en qué consiste, ¿en liberar determinadas variables de un objeto (o varios) desde fuera de estos? ¿Pero no es más natural destruir los propios objetos que a su vez se encargarán de liberar las variables que sean menester?

Ahora, que si no quieres entrar... no entramos. :)

TEO127
07-06-2007, 10:24:05
Ves Dec que sucedio lo que yo dije, no queria caer en la discucion de quien debe o no liberar la memoria (en lo cual estamos totalmente de acuerdo) y porque es necesario un recolector de basura. ahora estoy obligado a explicar mas en detalle lo que intento hacer, pretendo liberar de la memoria variables u objetos Activex que estan declarados dentro de un formulario o un objeto cualquiera. y tu me diras pero no se supone que estos Activex se liberan por si solos o con un metodo dispose? y yo te dire que lo que sucede es que estos activex generan un memory Leak ya que no estan muy bien implementados o carecen de un dispose y encontre una forma de liberarlos, pero quiero automatizar el proceso y no estar referenciandolos uno a uno, es por eso que necesito recorrer cualquier objeto y comprobar si hay en el una variable u objeto de tipo "activex" y si es asi lo libero.

Saludos.

Neftali [Germán.Estévez]
07-06-2007, 10:56:32
El truco 42 (http://www.clubdelphi.com/trucos/index.php?id=42&scroll=0&scrollb=0) se titula: "Mostrar las propiedades de uncomponente en Runtime", aunque vale perfectamente para cualquier otro objeto.
Usa RTTI que es la única forma de hacerlo sin programar nada especial (NOTA1); Lo más importante para hacerlo así es que las propiedades que deseas recorrer sean published.

En el caso que has puesto:


TFormExtb : TClass = (TForm)
.
.
Private
.
.
Public
d : Tipox;//-> esta variable quiero capturar
e : Tipoy;//-> esta variable quiero capturar
f : Tipoz;//-> esta variable quiero capturar
end;

Habría que modificarlo para que fuera así:

TFormExtb : TClass = (TForm)
.
.
Private
_d : Tipox;//-> esta variable quiero capturar
_e : Tipoy;//-> esta variable quiero capturar
_f : Tipoz;//-> esta variable quiero capturar
Published
property d:Tipox read _d write _d;
property e:Tipoy read _e write _e;
property f:Tipoz read _f write _f;
end;
Aunque habría que saber más de lo que necesitas hacer.
(NOTA1) La otra opción, si consigues que todas las clases deriven de una clase base, es programar en la clase Base una lista de variables/propiedades y que cada una de las clases derivadas añada las suyas en el Create (por ejemplo). En la clase basedeberás programar el método que recorra la lista y te las devuelve (no se si me explico...:o)

maeyanes
07-06-2007, 16:30:51
Roman y Dec se han fijado en el Code Explorer de Delphi 7?

hay tres secciones

private

public

published


En esta ventana muestra las variables que quiero recuperar, si el IDE de delphi lo puede mostrar y el IDE esta hecho en Delphi enconces se puede hacer ;), el problema es como.

Saludos.

Según tengo entendido, el Code Explorer de Delphi lo que hace es interpretar el código fuente del archivo que está activo en el editor.


Saludos...

Neftali [Germán.Estévez]
07-06-2007, 17:33:10
...En esta ventana muestra las variables que quiero recuperar, si el IDE de delphi lo puede mostrar y el IDE esta hecho en Delphi enconces se puede hacer, el problema es como.

La diferencia es que el IDE lo hace en Diseño y tú lo quieres hacer en ejecución.;)
No es lo mismo.
Aunque no lo se de cierto, estoy casi seguro de que maeyanes tiene razón. En ese caso se hace "parseando" los .PAS

roman
07-06-2007, 18:15:52
Más que el Code Explorer, supongo que se refiere al Browser. Y éste sí que muestra las secciones privadas, protegidas, públicas y publicadas, aun en ausencia del .pas

¿Cómo hace esto?

// Saludos

Neftali [Germán.Estévez]
07-06-2007, 19:34:25
Y éste sí que muestra las secciones privadas, protegidas, públicas y publicadas, aun en ausencia del .pas

No se a qué te refieres cuando dices "en ausencia del PAS".
Yo creo que debe hacer algo similar a este (http://www.megaupload.com/?d=VL6X49KO).
(1) Pulsad Load para cargar el PAS.
(2) Pulsad el botón que pone "Code Tree".

roman
07-06-2007, 19:38:08
No se a qué te refieres cuando dices "en ausencia del PAS".


Me refiero a eso, a que si inserto una componente en el formulario, del cual sólo tengo los dcus, el browser sí me lista todas las propiedades de la componente.


Yo creo que debe hacer algo similar a este (http://www.megaupload.com/?d=VL6X49KO).
(1) Pulsad Load para cargar el PAS.
(2) Pulsad el botón que pone "Code Tree".

Lo probaría encantado, pero desafortunadamente, todo el ancho de banda disponible está reservado a sus usuarios premium :( ¿No tenías tú un ftp en el club? :rolleyes:

// Saludos

Neftali [Germán.Estévez]
08-06-2007, 11:42:02
¿No tenías tú un ftp en el club? :rolleyes:

Sí veo que Megaupload los últimos días está dando problemas de este tipo...:( Habrá que cambiar a otro...
No lo había subido al FTP, porque no es algo que tenga interés fuera de este hilo; De todas formas he creado una carpeta temporal para este tipo de cosas; link (http://www.terawiki.clubdelphi.com/archivos/Delphi-Win32/Temporal/SampleParser.zip).

Neftali [Germán.Estévez]
08-06-2007, 12:43:05
Me refiero a eso, a que si inserto una componente en el formulario, del cual sólo tengo los dcus

Bueno con los DCU's también se puede hacer algo similar. Link (http://www.terawiki.clubdelphi.com/archivos/Delphi-Win32/Temporal/dcu2pas.zip). Se hace de otra forma, pero sigue siendo un "parseo".