2010-01-15 17 views
6

Uso Delphi 5 e abbiamo un metodo per creare dinamicamente determinati controlli in base al contenuto di una tabella di database (creiamo TButtons per lo più) e intervenire quando questi vengono cliccati. Questo ci consente di aggiungere semplici controlli a un modulo senza dover ricompilare l'applicazione.Accesso dinamico a una proprietà in un componente Delphi

Mi chiedevo se fosse possibile impostare la proprietà di un componente in base al nome di una proprietà contenuta in una stringa in modo da poter impostare ulteriori opzioni.

pseudo-codice:

Comp := TButton.Create(Self); 

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

Questo è possibile a tutti?

+1

Si noti che il contenuto non corretto nella configurazione potrebbe portare in modalità di errore interessanti. (Sono stato lì, fatto così.) –

risposta

11

è necessario utilizzare le Run-Time Type Informazioni caratteristiche di Delphi per fare questo:

Questo blog descrive esattamente quello che stai cercando di fare: Run-Time Type Information In Delphi - Can It Do Anything For You?

In pratica dovete ottenere la proprietà informazioni, utilizzando GetPropInfo e quindi utilizzare SetOrdProp per impostare il valore.

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

Questo non è conciso come il tuo pseudo-codice, ma fa ancora il lavoro. Inoltre diventa più complicato con altre cose, come le proprietà degli array.

+0

Brillante, ora sto analizzando una stringa, istanziando i controlli e impostando le proprietà dinamicamente! – Drarok

+0

Questo potrebbe interessarti anche tu: http://www.remobjects.com/ps.aspx –

9

da uno dei miei gruppi di lavoro (in Delphi 7 però)

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; 
    ... 

dovete includere TypInfo nella dichiarazione usi. Non so se questo funziona con Delphi 5.

+0

Ah, IsPublishedProp() è molto più bello di quanto sopra, ho usato una combinazione dei due nel mio codice. Grazie molto. – Drarok

Problemi correlati