Перейти к содержанию
  • Регистрация
  • 0
rareMax

Записать значение в поле через RTTI

Вопрос

(не знаю даже в какой ветке задать вопрос)

нужно с помощью rtti создать класс с предустановленными значениями. Значения берутся из атрибута. Все работает кажется нормально ровно до момента когда нужно внести значение в поле. Находит нужное свойство и получает значение атрибута верно. А вот запись не работает. Подскажите где не так  делаю?

program DemoGenerator;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  System.Rtti;

Type
  // базовый аттрибут
  DemoDataAttribute = class(TCustomAttribute)
  private
    FGenerator: String;
  public
    constructor Create(Generator: String);
  published
    property Generator: string read FGenerator write FGenerator;
  end;

  // Обслуживаемый класс
  TSomeType = Class
  private
    fPhone: string;
  published
    [DemoData('+1800764328')]
    property Phone: string read fPhone write fPhone;
  End;

  // Управляющий класс
  TMegaSuperClass = Class
    Function Go<T: Class, constructor>: T;
  End;

Procedure Test;
var
  LMsc: TMegaSuperClass;
  New: TSomeType;
Begin
  LMsc := TMegaSuperClass.Create;
  try
    New := LMsc.Go<TSomeType>;
    Writeln('New.Phone: ' + New.Phone);
  finally
    LMsc.Free;
    // New.Free;
  end;
End;

{ DemoDataAttribute }

constructor DemoDataAttribute.Create(Generator: String);
begin
  FGenerator := Generator;
end;

{ TMegaSuperClass }

function TMegaSuperClass.Go<T>: T;
var
  LContext: TRttiContext;
  LClass: TRttiInstanceType;
  LProp: TRttiProperty;
  LAttr: TCustomAttribute;
  LField: TRttiField;
begin
  // Инициализируем РТТИ
  LContext := TRttiContext.Create;
  LClass := LContext.GetType(T) as TRttiInstanceType;
  Writeln('LClass: ' + LClass.ToString);
  // Результат
  Result := T.Create;
  for LProp in LClass.GetProperties do
  begin
    Writeln('LProp: ' + LProp.ToString);
    for LAttr in LProp.GetAttributes do
    begin
      Writeln('LAttr: ' + LAttr.ToString);
      if LAttr is DemoDataAttribute then
      Begin
        Writeln('Attr value: ' + DemoDataAttribute(LAttr).Generator);
        // Как записать значение?
        LProp.SetValue(@Result, DemoDataAttribute(LAttr).Generator);
      End;
    end;
  end;
end;

begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
    Test;
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

end.

 

Результат консоли:

Цитата

LClass: TSomeType
LProp: property Phone: string
LAttr: DemoDataAttribute
Attr value: +1800764328
New.Phone:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

Ответы на этот вопрос пока отсутствуют

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Похожий контент

    • От CodeToad
      Здравствуйте  всем!
          Воодушевившись статьей Ярослава про подход "Control-Model-Presentation" применяю ,как в примере автозаполнение ,но передаю данные в StringList 
         вопрос как правильно уничтожить данные чтобы освободить память от списка и чтобы память не текла
         //------------------------------------------------------Нужно ли явно разрушать объект? C учетом того что каждое новое заполнение ввода порождает новый список для автозаполнения
              Edit1.Model.Data['hint_list'].AsType<TSTringList>.Clear;
              Edit1.Model.Data['hint_list'].AsType<TSTringList>.DisposeOf; //?
      //--------------------------------------------------------------------------обнулять данные-> чтобы можно было проверить   Edit1.Model.Data['hint_list'].IsEmpty
              Edit1.Model.Data['hint_list']:=Tvalue.Empty; 
      или
              Edit1.Model.Data['hint_list'].Empty;
      Просьба сильно не пинать за вопрос так как после отпуска голова не варит совсем
    • От Brovin Yaroslav
      Выделение вопроса от Nixon в отдельную тему,
       
      В общем, я пытаюсь на основании этой статьи, сделать автоматический пересчет высоты объекта, в зависимости от содержания с учетом изображений и т.д. Для этого мне необходимо получить ширину и высоту конкретного текстового элемента в стиле.
       
      Как бы это не звучало странно, но 
      ListBoxItem.StylesData['text.width'].asInteger постоянно возвращает нуль. Естественно пытаюсь получить размеры после того, как ListBoxItem создан и размещен на родителе. И
      ListBoxItem.StylesData['text.text'].asString не возвращает текст. 
      Это может быть связано с тем что text это TActiveStyleTextObject ? RAD Studio XE6
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...