2010-01-15 11 views
6

Estoy usando Delphi 5, y tenemos un método para crear dinámicamente ciertos controles basados ​​en el contenido de una tabla de base de datos (creamos TButtons principalmente) y tomar medidas cuando se hace clic. Esto nos permite agregar controles simples a un formulario sin tener que volver a compilar la aplicación.Acceda dinámicamente a una propiedad en un componente Delphi

Me preguntaba si era posible establecer la propiedad de un componente en función de un nombre de propiedad contenido en una cadena para poder establecer más opciones.

Pseudo-código:

Comp := TButton.Create(Self); 

// Something like this: 
Comp.GetProperty('Left').AsInteger := 100; 
// Or this: 
Comp.SetProperty('Left', 100); 

Es esto posible?

+1

Tenga en cuenta que el contenido mal formado en su configuración podría llevarlo a modos de falla interesantes. (He estado allí, lo he hecho). –

Respuesta

11

usted tiene que utilizar las tiempo de ejecución de información de tipo características de Delphi para hacer esto:

Este blog describe exactamente lo que está tratando de hacer: Run-Time Type Information In Delphi - Can It Do Anything For You?

Básicamente, usted tiene que conseguir la propiedad información, usando GetPropInfo y luego use SetOrdProp para establecer el valor.

var 
    PropInfo: PPropInfo; 
begin 
    PropInfo := GetPropInfo(Comp.ClassInfo, 'Left'); 
    if Assigned(PropInfo) then 
    SetOrdProp(Comp, PropInfo, 100); 
end; 

Esto no es tan conciso como su pseudo-código, pero todavía hace el trabajo. También se vuelve más complicado con otras cosas, como propiedades de matriz.

+0

Brillante, ahora estoy analizando una cadena, creando instancias de controles y estableciendo propiedades dinámicamente. – Drarok

+0

Esto podría interesarte también: http://www.remobjects.com/ps.aspx –

9

de una de mis unidades de trabajo (en Delphi 7, aunque)

var 
    c : TComponent; 

    for i := 0 to pgcProjectEdits.Pages[iPage].ControlCount - 1 do 
    begin 
    c := pgcProjectEdits.Pages[iPage].Controls[i]; 
    if c is TWinControl 
    then begin 
     if IsPublishedProp(c,'color') 
     then 
      SetPropValue(c,'color',clr); 
     if IsPublishedProp(c,'readonly')       
     then              
      SetPropValue(c,'readonly', bReadOnly); 
     ...    
    end; 
    ... 

tiene que incluir en la declaración TypInfo usos. No sé si esto funciona en Delphi 5.

+0

Ah, IsPublishedProp() es mucho mejor que el anterior, he usado una combinación de los dos en mi código. Muchas gracias. – Drarok

Cuestiones relacionadas