Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos


Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-01-2012
Leviatan Leviatan is offline
Miembro
 
Registrado: Oct 2005
Posts: 56
Poder: 13
Leviatan Va por buen camino
Asignar dinámicamente valores a propiedades sin conocer previamente cuáles

Hola amigos:

Necesito leer datos de un XML de configuración que contiene básicamente la siguiente estructura:

<parametros>
<edPuerto>
<Text>80</Text>
...
...
</edPuerto>
...
...
</parametros>

El tag "edPuerto" es de un tipo TEdit en la aplicación y el nodo hijo "Text" es la propiedad que necesito asignar. Al ejecutarse, la app leerá el archivo de configuración XML y asignará el valor "80" a la propiedad "Text" de "edPuerto".

Se podrían ir añadiendo propiedades al XML y la idea es asignar aquellas propiedades que se definan en el archivo de configuración. ¿Cómo lo puedo hacer?

Muchas gracias de antemano.
Responder Con Cita
  #2  
Antiguo 25-01-2012
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: Apr 2009
Posts: 168
Poder: 10
LoPiTaL Va por buen camino
Si estás trabajando con Delphi 2010 o superior, puedes hacerlo fácilmente usando la unit RTTI, mediante el objeto TRttiContext. Busca en google más info sobre éste y encontrarás mucha información sobre él, cómo leer / escribir propiedades por nombre, etc...

Por ejemplo:

Código Delphi [-]
procedure SetProperty(propname: string; value: TValue; obj: TMyObject);
var
  context: TRTTIContext;
  rtti: TRTTIType;
  prop: TRTTIProperty;

begin
  context := TRTTIContext.Create;
  rtti := context.GetType(TMyObject);
  prop := rtti.GetProperty(propname);
  prop.SetValue(obj, value);
end;

Sólo deberás tener cuidado con el tipo de la propiedad. Si es string, deberás pasarle un string a value, si es int, deberás pasarle un int, etc...

Si estás trabajando con una versión anterior, la cosa se complica un poco, pero sigue siendo posible. Google te lanzará mucha información si buscas "RTTI".

En cuanto a encontrar componentes en un form, simplemente sería haciendo
Código Delphi [-]
for I:=0 to ComponentsCount - 1 do begin
  if Components[i].Name=TuNombreLeido then begin
    //Aquí iría la rutina para establecer el valor de la propiedad en cuestión.
    seteaPropiedad(nombrePropiedad, Components[i])
  end;
end;
Un saludo,
LoPiTaL
Responder Con Cita
  #3  
Antiguo 25-01-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: Dec 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.018
Poder: 29
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Con Delphi 7 y superior podrías hacer algo como:
Código Delphi [-]
...
implementation

uses TypInfo;

procedure TForm1.CambiarPropiedad(const AName, AProperty, AValue: string);
var
  PInfo: PPropInfo;
  TC: TComponent;
begin
  TC:= FindComponent(AName);
  PInfo:= GetPropInfo(TC.ClassInfo, AProperty);
  if PInfo <> nil then
  begin
    case PInfo^.Proptype^.Kind of
      tkString, tkLString: SetStrProp(TC, PInfo, AValue);
      tkInteger: if (PInfo^.PropType^.Name = 'TColor') then
                   SetOrdProp(TC, PInfo, StringToColor(AValue))
                 else if (PInfo^.PropType^.Name = 'TCursor') then
                   SetOrdProp(TC, PInfo, StringToCursor(AValue))
                 else
                   SetOrdProp(TC, PInfo, StrToInt(AValue));
      tkEnumeration: try
                       if (PInfo^.PropType^ = TypeInfo(System.Boolean)) then
                         SetOrdProp(TC, PInfo, StrToInt(AValue))
                       else
                         SetOrdProp(TC, PInfo, StrToInt(AValue));
                      except
                         raise;
                      end;
    end;
  end;
end;

Ejemplo de uso:
Código Delphi [-]
  CambiarPropiedad('edPuerto', 'Text', 'Hola');
  CambiarPropiedad('edPuerto', 'Color', 'clLime');
  CambiarPropiedad('edPuerto', 'Cursor', 'crHandPoint');
  ...

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 25-01-2012 a las 18:25:09.
Responder Con Cita
  #4  
Antiguo 25-01-2012
Leviatan Leviatan is offline
Miembro
 
Registrado: Oct 2005
Posts: 56
Poder: 13
Leviatan Va por buen camino
Hola amigos,

Gracias por su respuesta. Estoy usando Delphi 2010. Lo voy a probar y les cuento cómo me fue.

Saludos.
Responder Con Cita
  #5  
Antiguo 31-01-2012
Leviatan Leviatan is offline
Miembro
 
Registrado: Oct 2005
Posts: 56
Poder: 13
Leviatan Va por buen camino
Thumbs up

Gracias LoPiTaL y ecfisa. Los ejemplos que me han pasado me han funcionado super bien.

Saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Delphi, Indy, SSL Cuales versiones trabajan bien con cuales ?. Como se configuran ? rolandoj Internet 12 23-03-2014 17:07:41
Conocer cuales Base de datos son del SQL Ledian_Fdez MS SQL Server 3 07-11-2011 15:17:10
Conocer clases y propiedades de los objetos de cualquier ventana windows. chozas API de Windows 3 19-06-2008 19:26:04
Asignar evento on exit y otros a varios labeledit creados dinamicamente cotoprix OOP 2 08-01-2004 23:05:53
asignar evento a control creado dinamicamente jorgeganc Varios 4 17-12-2003 02:47:51


La franja horaria es GMT +2. Ahora son las 01:24:27.


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