Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Como obtener las variables de un objeto (https://www.clubdelphi.com/foros/showthread.php?t=44476)

TEO127 07-06-2007 04:58:17

Como obtener las variables de un objeto
 
Hola amigos mi consulta es la siguiente. dado un objeto cualquiera
ej :
Código Delphi [-]
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 :

Código Delphi [-]
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. 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 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:

Código Delphi [-]
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í:

Código Delphi [-]
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

Cita:

Empezado por TEO127
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

Cita:

Empezado por TEO127
...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

Cita:

Empezado por roman
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.
(1) Pulsad Load para cargar el PAS.
(2) Pulsad el botón que pone "Code Tree".

roman 07-06-2007 19:38:08

Cita:

Empezado por Neftali
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.

Cita:

Empezado por Neftali
Yo creo que debe hacer algo similar a este.
(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

Cita:

Empezado por roman
¿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.

Neftali [Germán.Estévez] 08-06-2007 12:43:05

Cita:

Empezado por roman
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. Se hace de otra forma, pero sigue siendo un "parseo".


La franja horaria es GMT +2. Ahora son las 16:25:00.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi