PDA

Ver la Versión Completa : Acceder a una sub-propiedad mediante RTTI


elrayo76
06-08-2020, 04:13:03
Buenas gente,


Estoy trabajando con RTTI para acceder a las propiedades de los componentes y luego setear o devolver su valor. Todo funcionaba bien hasta que me encontré con algo que no le estoy encontrando la vuelta.


Tengo un componente que tiene algo como esto: Properties.ReadOnly como propiedad que se puede ver desde el inspector de objetos. Si se presiona sobre el signo mas se despliegan las propiedades y una de ellas es la que indico.


El tema es que de la forma tradicional no me devuelve ninguna de las propiedades que están dentro de Properties. Comento que he provado con GetPropertyPath pero no me funciona.


¿Alguno sabe como obtener esas propiedades?.


Aclaro que estoy trabajando con Delphi XE8.


Saludos
El Rayo

Casimiro Notevi
06-08-2020, 09:37:36
Si al menos dijeras qué componente es.

elrayo76
06-08-2020, 13:55:29
Buenas,


Son varios los componentes y son de las DevExpress (TcxCheckBox y TcxTextEdit).


Lo que hago es recorrer todos los componentes del formulario y mediante RTTI buscar la propiedad, si la tiene se la seteo. El tema es que si la propiedad está dentro de una que se despliega con el signo más y estás son las que no devuelve nada, las que están mas afuera como "Transparent" (TcxCheckBox) si funciona.



Saludos,
El Rayo

manelb
07-08-2020, 11:28:35
Buenos días a todos....

Pues podrías probar con algo como esto


var
c: Tcomponent;
begin
c:= Button1;

SetPropValue(c, 'Caption', 'Functiona');
SetPropValue(c, 'Tag', 25);
SetPropValue(c, 'Anchors', 'akBottom,akRight');


SetPropValue( GetObjectProp(c, 'Margins'), 'Bottom', 50);
SetPropValue( GetObjectProp(c, 'Font'), 'Size', 20);

end;



Debes tener en el uses System.TypInfo

Saludos.

Neftali [Germán.Estévez]
07-08-2020, 11:54:35
Creo que primero debes acceder a la propiedad Properties como si fuera un Objeto/Clase.
Fíjate que el tipo:

TTypeKind = System.TTypeKind;

Posee un valor:
tkClass = System.TTypeKind.tkClass;

En este caso properties de las DevExpress (por ejemplo para un TcxTextedit) es de tipo TcxTextEditProperties. Una vez accedeas como clase, vuelves a acceder a las propiedades de esa clase como lo haces normalmente.

NOTA: Creo que es similar a lo que ha comentado manel.

elrayo76
07-08-2020, 17:12:18
Gracias a los dos por responder.



Veré los dos casos a ver con cual me quedo que me sirva mejor y luego les contaré como me fue.


Saludos
El Rayo