RTTI: как получить значения динамического массива, объявленного как свойство класса - PullRequest
1 голос
/ 06 ноября 2010

Пожалуйста, помогите мне.

Я искал существующие вопросы и не нашел, как я могу получить все опубликованные свойства элементов (объявленных как Class) в динамическом массиве в классе Delphi (я использую Delphi 7 IDE (яне могу использовать другую версию))

У меня есть этот код:

  TObjectList = array of TObject;
  TSubClass = class(TObject)
  private
    FFirstName: string;
    FLastName: string;
    FDOB: TDateTime;
    FArray : TObjectList;
  published
    property FirstName: string read FFirstName write FFirstName;
    property LastName: string read FLastName write FLastName;
    property DOB: TDateTime read FDOB write FDOB;
    property MyArray : TObjectList read FArray write FArray ;
  end;

  TListSubClass = array of TSubClass;

  TPersonList = class(TObject)
  private
    FSubClasses: TListSubClass;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property SubClasses: TListSubClass read FSubClasses write FSubClasses;
  end;

У меня есть ссылка на Elem класса TPersonList (MyVariable: TPersonList).

Как я могу с помощью RTTI получить все опубликованные данные о свойствах моих элементов массива FSubClasses и FArray?

Как я могу установить новые данные для FSubClasses с использованием RTTI?

Спасибо,Сергей.

Ответы [ 2 ]

1 голос
/ 07 ноября 2010

То, что вы называете «динамическим массивом», - это не то, что называется «динамическим массивом» в мире Delphi.«Динамический массив» определяется как MyVar: например, массив целых чисел.В ваших классах у вас есть только потомки TList.Эти потомки TList являются своего рода динамическим хранилищем, но его называют TList (или TObjectList) вместо «динамического массива».

Так что просто используйте модуль TypInfo.

  • GetPropListполучит список всех свойств.
  • Затем вызовите GetObjectProp для каждого элемента PPropInfo, который отображает класс, и получите экземпляр каждого свойства.
  • Вызовите GetStrProp, чтобы получить содержимое строкиопубликованное свойство;
  • Вызовите GetOrdProp для получения содержимого опубликованного целочисленного свойства.
  • Вызовите GetFloatProp для получения значения с плавающей запятой, например TDateTime.

Inслучай опубликованного свойства класса, после вызова GetObjectProp, проверьте возвращаемый тип экземпляра и перечислите его содержимое в соответствии с его классом (TObjectList или TListSubClass).

Этот метод мы используем в нашем ORM с открытым исходным кодом.(мы выделили несколько объектно-ориентированных классов для доступа к свойствам, поэтому нам не нужен модуль typinfo).См http://synopse.info/fossil/finfo?name=SQLite3/SQLite3Commons.pas

0 голосов
/ 06 ноября 2010

Посмотрите на GetDynArrayProp и GetPropList единицы TypInfo.

GetDynArrayProp возвращает указатель на базовый массив, затем вы можете привести его к правильному типу массива.

GetPropList возвращает указатель на массив информации о свойствах для всех свойств передаваемого вами класса.

Запись TPropInfo, которую вы возвращаете из GetPropList, содержит информацию об адресеметодов getter и setter, связанных со свойством, вы можете использовать их для вызова соответственно getter или setter.

Как правило, вы должны более подробно рассмотреть модуль TypInfo в справке Delphi илиэлектронная документация:

http://docwiki.embarcadero.com/VCL/en/TypInfo

...