Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Modificar propiedad del un componente (https://www.clubdelphi.com/foros/showthread.php?t=56238)

hexxa 12-05-2008 13:23:28

Modificar propiedad del un componente
 
Amigos, tengo el siguiente problema, necesito armar en tiempo de ejecucion, de acuerdo al componente que elija el usuario, el nombre del componente y concatenarle la propiedad que quiero modificar. Por ej, tendria que poder armar lo siguiente cuando hago click sobre un componente:

TControl(Sender).Top

La propiedad que tendria que modificar del componente seleccionado la obtengo de un archivo ini. Lo que no encuentro la forma de resolver es si por ej, hice click sobre un Label y en el archivo ini lei que tengo que modificarle la propiedad Top y Left, es como armo lo siguiente

TControl(Sender) + .Top donde 'Top' lo lei del archivo ini
TControl(Sender) + .Left donde 'Left' lo lei del archivo ini

Espero haber sido claro en la explicacion, desde ya muchas gracias.

coso 12-05-2008 14:29:23

Hola,
Código Delphi [-]
var
   ob : TObject;
begin
   ob := FindComponent(nombre_del_objeto);  // p.e. : nombre_del_objeto := 'ListBox1'
   if ob = nil then begin ShowMessage('No existe ese objeto'); exit; end;

   SetOrdProp(ob,propiedad_a_cambiar,valor_a_poner); // p.e. : propiedad_a_cambiar := 'Top'
end;

como ves, la funcion SetOrdProp sirve solo para establecer propiedades integer, existe tb las SetStrProp, SetMethodProp, etc... (y sus correspondientes GetStrProp, GetOrdProp,... todas indocumentadas :/ ) deberás encontrar el tipo de la propiedad a modificar antes de usar una u otra. Investigando he encontrado que se puede hacer de manera general, pero se usan punteros directos al objeto y parece bastante mas complicado.

Te pongo tb una funcion para encontrar toda la lista de propiedades de un objeto. Desde esta funcion, seguro que puedes determinar el tipo de la propiedad que buscas

Código Delphi [-]
procedure GetPropertyList(Obj:TObject ;List: TStrings;Filter: TTypeKinds);
var PropList:pPropList;
    count,i : Integer;
begin
  List.Clear;
  Count := GetPropList(Obj.ClassInfo, Filter, nil);
  GetMem(PropList,Count * SizeOf(PPropInfo));
  GetPropList(Obj.ClassInfo, Filter, PropList);
  for i:=0 to Count -1 do
    List.Add(Proplist[i].Name);
end;

Venga, espero q te sirva ;)

PD : links a Free Pascal, http://www.freepascal.org/docs-html/...bjectprop.html

xEsk 12-05-2008 14:38:12

Caso deberías informar que para usar estas funciones hay que declarar la unit TypInfo en el uses.

Saludos.

coso 12-05-2008 14:48:31

cierto es xEsk :D

hexxa 12-05-2008 14:53:02

Gracias a ambos, es lo que estaba necesitando!!!!!

hexxa 12-05-2008 18:22:33

La info que me pasaron me vino de maravillas, pero tengo otro problema, cuando la propiedad que deseo modificar/leer es una subpropiedad de una propiedad no lo puedo hacer. Por ej si lo que quiero es modificar la propiedad 'size' de la propiedad 'font' de un tlabel, las funciones SetOrdProp, GetOrdProp no encuentran esa propiedad, o bien me estoy equivocando en como le paso el parametro. He probado con

SetStrProp(TControl(Sender), 'size', 10);

y con

SetStrProp(TControl(Sender), 'font.size', 10);

y no me reconoce ese nombre de propiedad.

Tambien estoy usando GetPropInfo y no la encuentra.

GetPropInfo(TControl(Sender).ClassInfo,'size');

Alguna idea de como debo referenciarla???

coso 12-05-2008 19:51:23

Código Delphi [-]
var
   ob : TObject;
   ft : TFont;
begin
   ob := FindComponent(nombre_del_objeto);  // p.e. : nombre_del_objeto := 'Edit1'
   if ob = nil then begin ShowMessage('No existe ese objeto'); exit; end;

   ft := (GetObjectProp(ob,'Font') as TFont); //GetObjectProp recoge las propiedades que son un objeto, como en este caso, la fuente
   SetOrdProp(ft,'size',18); // cambiamos ahora el size del objeto que es propiedad del Edit1, su Font
end;
;)


La franja horaria es GMT +2. Ahora son las 00:18:21.

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