2011-12-30 13 views
6

Desidero enumerare tutte le proprietà: private, protette, pubbliche, ecc. Desidero utilizzare le funzionalità incorporate e non utilizzare alcun codice di terze parti.Come si elencano tutte le proprietà in un oggetto e si ottengono i relativi valori?

+0

Con quale versione di Delphi stai lavorando? Enhanced RTTI è disponibile solo da Delphi 2010. Le versioni precedenti non saranno in grado di ottenere ciò: solo le proprietà pubblicate possono essere elencate. –

+1

Stai chiedendo di ottenere i valori di tutte le proprietà. Il nuovo RTTI, disponibile in Delphi XE2, è in grado di farlo. Il link che ho postato come duplicato era un riferimento all'utilizzo di RTTI, in generale. Non c'era alcuna indicazione della versione Delphi che stavi usando. Da quando hai modificato la tua domanda, ho eliminato il mio duplicato. –

+1

@DavidHeffernan, grazie per aver modificato bene le mie domande. – VibeeshanRC

risposta

5

Usa RTTI esteso come questo (quando ho provato il codice XE ho ottenuto eccezione sulla proprietà ComObject, così ho inserito prova - ad eccezione di blocco):

uses RTTI; 
procedure TForm1.Button1Click(Sender: TObject); 
var 
    C: TRttiContext; 
    T: TRttiType; 
    F: TRttiField; 
    P: TRttiProperty; 

    S: string; 

begin 
    T:= C.GetType(TButton); 
    Memo1.Lines.Add('---- Fields -----'); 
    for F in T.GetFields do begin 
    S:= F.ToString + ' : ' + F.GetValue(Button1).ToString; 
    Memo1.Lines.Add(S); 
    end; 

    Memo1.Lines.Add('---- Properties -----'); 
    for P in T.GetProperties do begin 
    try 
     S:= P.ToString; 
     S:= S + ' : ' + P.GetValue(Button1).ToString; 
     Memo1.Lines.Add(S); 
    except 
     ShowMessage(S); 
    end; 
    end; 
end; 
7

risposta di Serg è buona, ma è meglio evitare eccezioni di saltare alcuni tipi:

uses 
    Rtti, TypInfo; 

procedure TForm4.GetObjectProperties(AObject: TObject; AList: TStrings); 
var 
    ctx: TRttiContext; 
    rType: TRttiType; 
    rProp: TRttiProperty; 
    AValue: TValue; 
    sVal: string; 
const 
    SKIP_PROP_TYPES = [tkUnknown, tkInterface]; 
begin 
    if not Assigned(AObject) and not Assigned(AList) then 
    Exit; 

    ctx := TRttiContext.Create; 
    rType := ctx.GetType(AObject.ClassInfo); 
    for rProp in rType.GetProperties do 
    begin 
    if (rProp.IsReadable) and not (rProp.PropertyType.TypeKind in SKIP_PROP_TYPES) then 
    begin 
     AValue := rProp.GetValue(AObject); 
     if AValue.IsEmpty then 
     begin 
     sVal := 'nil'; 
     end 
     else 
     begin 
     if AValue.Kind in [tkUString, tkString, tkWString, tkChar, tkWChar] then 
      sVal := QuotedStr(AValue.ToString) 
     else 
      sVal := AValue.ToString; 
     end; 

     AList.Add(rProp.Name + '=' + sVal); 
    end; 

    end; 
end; 
2

qui è un ottimo punto di partenza utilizzando le funzionalità avanzate di recente versione di Delphi:

Il seguente collegamento riguarda piuttosto la versione precedente (dalla D5 in poi). Sulla base delle TypInfo.pas unità, è limitato ma comunque istruttiva:

Problemi correlati