2015-09-15 5 views
1

Я знаю, как писать на свойство перечислений в виде строки:Использование RTTI для чтения и записи перечисленное свойство, как Integer

 

    var 
     Form: TForm; 
     LContext: TRttiContext; 
     LType: TRttiType; 
     LProperty: TRttiProperty; 
     PropTypeInfo: PTypeInfo; 
     Value: TValue; 

    begin 
     Form := TForm.Create(NIL); 
     LContext := TRttiContext.Create; 

     LType := LContext.GetType(Form.ClassType); 
     for LProperty in LType.GetProperties do 
     if LProperty.Name = 'FormStyle' then 
     begin 
      PropTypeInfo := LProperty.PropertyType.Handle; 
      TValue.Make(GetEnumValue(PropTypeInfo, 'fsStayOnTop'), PropTypeInfo, Value); 
      LProperty.SetValue(Form, Value); 
     end; 

     writeln(Integer(Form.FormStyle)); // = 3 

но как установить значение, если у меня нет строки но integer (например, 3 для fsStayOnTop) и как читать из этого свойства, но не возвращать строку (которая будет работать с Value.AsString)?

 

    Value := LProperty.GetValue(Obj); 
    writeln(Value.AsString); // returns fsStayOnTop but I want not a string, I want an integer 
    writeln(Value.AsInteger); // fails 

ответ

5

Создание TValue из порядкового так:

Value := TValue.FromOrdinal(PropTypeInfo, OrdinalValue); 

В другом направлении, чтобы прочитать порядковое сделать это:

OrdinalValue := Value.AsOrdinal; 
+0

спасибо. прекрасно работает. – cydo

3

Попробуйте что-то вроде этого:

var 
    Form: TForm; 
    LContext: TRttiContext; 
    LType: TRttiType; 
    LProperty: TRttiProperty; 
    Value: TValue; 
begin 
    Form := TForm.Create(NIL); 

    LContext := TRttiContext.Create; 
    LType := LContext.GetType(Form.ClassType); 
    LProperty := LType.GetProperty('FormStyle'); 

    Value := TValue.From<TFormStyle>({fsStayOnTop}TFormStyle(3)); 
    LProperty.SetValue(Form, Value); 

    WriteLn(Integer(Form.FormStyle)); 

    Value := LProperty.GetValue(Form); 
    WriteLn(Integer(Value.AsType<TFormStyle>())); 

    ... 
end; 
+0

Зачем бросать в целое число, а не использовать ord()? –

+0

Все, что работает. –

+0

Я пробовал что-то подобное, но я потерпел неудачу. хорошо работает, спасибо – cydo