2014-04-16 156 views
4

德爾福RTTI設定值I類有這樣根據屬性值

TuserClass = class 
private 
FUtilisateurCode: string; 
FUtilisateurCle: string; 
public 
procedure SetCodeInt(ACode: string; AValue: string); 
published 
[CodeInt('2800')] 
property UtilisateurCode: String read FUtilisateurCode write FUtilisateurCode; 
[CodeInt('2801')] 
property UtilisateurCle: String read FUtilisateurCle write FUtilisateurCle; 
end; 

procedure TuserClass.SetCodeInt(ACode: string; AValue: string); 
begin 
    // what I want to is making this by RTTI to set good value to good CodeInt 
    if ACode = '2800' then FutilisateurCode := AValue 
    else if ACode = '2801' then FUtilisateurCle := AValue; 
end; 

我想用我的SetCodeInt程序,以填補我的財產的價值,但我有問題。 我需要做什麼?

+0

這將是更好,如果你發佈真正的代碼。要搞清楚SetCodeInt是什麼是有點困難的。尤其是因爲你從不稱呼它。你需要解決你的問題,因爲它目前需要我們閱讀你的想法。也許有人能夠做到這一點,但我們不應該這樣做。 –

+0

我更新我的問題,明確我想做什麼 –

回答

6

需要自定義屬性類:

type 
    CodeIntAttribute = class(TCustomAttribute) 
    private 
    FValue: Integer; 
    public 
    constructor Create(AValue: Integer); 
    property Value: Integer read FValue; 
    end; 
.... 
constructor CodeIntAttribute.Create(AValue: Integer); 
begin 
    inherited Create; 
    FValue := AValue; 
end; 

我選擇做價值,這似乎不是一個字符串比較合適的整數。

然後定義的屬性是這樣的:

[CodeInt(2800)] 
property UtilisateurCode: string read FUtilisateurCode write FUtilisateurCode; 
[CodeInt(2801)] 
property UtilisateurCle: string read FUtilisateurCle write FUtilisateurCle; 

最後的SetCodeInt實現如下:

procedure TUserClass.SetCodeInt(ACode: Integer; AValue: string); 
var 
    ctx: TRttiContext; 
    typ: TRttiType; 
    prop: TRttiProperty; 
    attr: TCustomAttribute; 
    codeattr: CodeIntAttribute; 
begin 
    typ := ctx.GetType(ClassType); 
    for prop in typ.GetProperties do 
    for attr in prop.GetAttributes do 
     if attr is CodeIntAttribute then 
     if CodeIntAttribute(attr).Value=ACode then 
     begin 
      prop.SetValue(Self, TValue.From(AValue)); 
      exit; 
     end; 
    raise Exception.CreateFmt('Property with code %d not found.', [ACode]); 
end; 
+0

非常感謝:) –

+1

如果您將'ctx.GetType(TypeInfo(TUserClass))'更改爲'ctx.GetType(ClassType)',那麼此代碼也適用於類它來自'TUserClass',否則它只針對'TUserClass'。 –

+0

@Remy謝謝。順便說一句,我會非常高興你能做出如編輯一樣明顯的改進。 –