powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Rtti и object
25 сообщений из 28, страница 1 из 2
Rtti и object
    #39986508
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу получить список полей и свойств у объекта (тот который object, а не экземпляр класса)
Код: pascal
1.
2.
3.
4.
  TTestObject = object
    FTestField: Integer;
    property TestField: Integer read FTestField;
  end;


пишу
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
procedure TForm1.Button2Click(Sender: TObject);
var
  LContext: TRttiContext;
  LTypeInfo: PTypeInfo;
  LRttiType: TRttiType;
  LFields: TArray<TRttiField>;
  LProps: TArray<TRttiProperty>;
  LLenFld, LLenPrp: Integer;
begin
  LContext := TRttiContext.Create;
  LTypeInfo := TypeInfo(TTestObject);
  LRttiType := LContext.GetType(LTypeInfo);

  LFields := LRttiType.GetFields;
  LLenFld := Length(LFields);

  LProps := LRttiType.GetProperties;
  LLenPrp := Length(LProps);

  ShowMessageFmt('FldCount: %d, PrpCount: %d', [LLenFld, LLenPrp]);
end;


получаюFldCount: 0, PrpCount: 0

Заменяю на
Код: pascal
1.
TTestObject = record

получаюFldCount: 1, PrpCount: 0
Заменяю на
Код: pascal
1.
TTestObject = class

получаюFldCount: 1, PrpCount: 1

Это так и должно быть? Я ожидал во всех трех случаях видеть (1, 1)

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Rtti и object
    #39986511
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

As an alternative to class types, you can declare object types using the syntax

type objectTypeName = object (ancestorObjectType)
memberList
end;

where objectTypeName is any valid identifier, (ancestorObjectType) is optional, and memberList declares fields,
methods, and properties. If(ancestorObjectType) is omitted, then the new type has no ancestor.
Object types cannot have published members.

Since object types do not descend from TObject, they provide no built-in
constructors, destructors, or other methods. You can create instances of an
object type using the New procedure and destroy them with the Dispose
procedure, or you can simply declare variables of an object type, just as you
would with records.

Object types are supported for backward compatibility only. Their use is
not recommended.
...
Рейтинг: 0 / 0
Rtti и object
    #39986513
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В QC на все записи об object заявляют "мы это больше не поддерживаем, используйте record". Соответственно, новомодные хреньки с ним работать тем более не будут.

Насчёт записей - хз.
...
Рейтинг: 0 / 0
Rtti и object
    #39986518
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
Только управляемые типы можно получить.
...
Рейтинг: 0 / 0
Rtti и object
    #39986519
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Структуры не поддерживают свойства на уровне RTTI
...
Рейтинг: 0 / 0
Rtti и object
    #39986521
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для таких вещей нужна ручная регистрация свойств
Как в своё время было с CrystalLUA
А для объединения информации RTTI с ручным заполнением когда-нибудь появится модуль Tiny.Namespace
Но пока руки не доходят
...
Рейтинг: 0 / 0
Rtti и object
    #39986652
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov
Object types cannot have published members.
При чем здесь это?
GunSmoker
"мы это больше не поддерживаем, используйте record".
Хотел record с наследованием.
Как бы они объекты в итоге вообще не извели.
GunSmoker
Соответственно, новомодные хреньки с ним работать тем более не будут.
Жаль. Кстати, LRttiType.GetMethods; для объектов вообще дает AV. Для record работает
ziv-2014
Только управляемые типы можно получить.
Не понял. Откуда получить?
SOFT FOR YOU
Структуры не поддерживают свойства на уровне RTTI
Есть ссылка на документацию?
...
Рейтинг: 0 / 0
Rtti и object
    #39986717
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

TypInfo.pas
TTypeData
...
Рейтинг: 0 / 0
Rtti и object
    #39986720
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Про deprecated объектов говорят уже миллион лет. А я как юзал, так и юзаю
...
Рейтинг: 0 / 0
Rtti и object
    #39986737
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Потому что у компании есть обязательства из-за обратной совместимости.

Использование того, что официально не поддерживается, подобно отпиливанию ветки на которой сидите.
...
Рейтинг: 0 / 0
Rtti и object
    #39986758
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

У тебя есть альтернатива наследуемой структуре?
Тогда зачем умничать? )
...
Рейтинг: 0 / 0
Rtti и object
    #39986773
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Чем не устраивает наследование классов?
...
Рейтинг: 0 / 0
Rtti и object
    #39986776
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

Только одним
Тем, что классы - не структуры )
...
Рейтинг: 0 / 0
Rtti и object
    #39986777
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU
TTypeData
И что я там должен увидеть?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
  TTypeData = packed record
    function NameListFld: TTypeInfoFieldAccessor; inline;
    function UnitNameFld: TTypeInfoFieldAccessor; inline;
    function IntfUnitFld: TTypeInfoFieldAccessor; inline;
    function DynUnitNameFld: TTypeInfoFieldAccessor; inline;

    function PropData: PPropData; inline;
    function IntfMethods: PIntfMethodTable; inline;

    function DynArrElType: PPTypeInfo; inline;
    function DynArrAttrData: PAttrData; inline;
    function GUID: TGUID; inline;

    case TTypeKind of
      ...............
      tkClass: (
        ClassType: TClass; // most data for instance types is in VMT offsets
        ParentInfo: PPTypeInfo;
        PropCount: SmallInt; // total properties inc. ancestors
        UnitName: TSymbolName;
       {PropData: TPropData;
        PropDataEx: TPropDataEx;
        ClassAttrData: TAttrData;
        ArrayPropCount: Word;
        ArrayPropData: array[1..ArrayPropCount] of TArrayPropInfo;});
      ................
      tkRecord: (
        RecSize: Integer;
        ManagedFldCount: Integer;
       {ManagedFields: array[0..ManagedFldCnt - 1] of TManagedField;
        NumOps: Byte;
        RecOps: array[1..NumOps] of Pointer;
        RecFldCnt: Integer;
        RecFields: array[1..RecFldCnt] of TRecordTypeField;
        RecAttrData: TAttrData;
        RecMethCnt: Word;
        RecMeths: array[1..RecMethCnt] of TRecordTypeMethod});
      ................

принципиальных отличий класса от рекорда не вижу. Или вот это
Код: pascal
1.
PropCount: SmallInt; // total properties inc. ancestors

подразумевает, что свойства есть только у класса?
...
Рейтинг: 0 / 0
Rtti и object
    #39986778
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
Чем не устраивает наследование классов?
Например, классы не запишешь в поток
...
Рейтинг: 0 / 0
Rtti и object
    #39986779
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Такие вещи как PropData, ArrayPropData тебе о чём-то говорят )
...
Рейтинг: 0 / 0
Rtti и object
    #39986781
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Что значит класс записать в поток?
Значения полей класса? Значения свойств класса?
Может вы имеете ввиду сериализация/десериализация?
Ну так это все делается через соответствующие паттерны..

Если вам надо именно структура как область памяти, то что мешает сделать так?
TRec1 = record
A: Int32;
B: Char;
end;

TRec2 = record
Rec: TRec1;
C: Int32;
end;

по сути то что надо... TRec2 состоит из TRec1 и своих полей...
...
Рейтинг: 0 / 0
Rtti и object
    #39986783
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

Структуры вообще не нужны
Используй классы )
...
Рейтинг: 0 / 0
Rtti и object
    #39986789
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любую современную задачу можно решить используя либо классы, либо структуры...
object - не нужны.
...
Рейтинг: 0 / 0
Rtti и object
    #39986791
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

Я скажу больше
Любую задачу можно решить с помощью object
Классы и структуры не нужны )
...
Рейтинг: 0 / 0
Rtti и object
    #39986795
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU
Такие вещи как PropData, ArrayPropData тебе о чём-то говорят )
Они немного закомментированы
X-Cite
Что значит класс записать в поток?
Мне не нужно записывать класс в поток, потому что это невозможно. Мне нужно в поток записать структуру
Код: pascal
1.
Stream.Write(MyRec, SizeOf(MyRec))


X-Cite
Если вам надо именно структура как область памяти, то что мешает сделать так?
"Удобство" обращения к полям
Код: pascal
1.
LRec4.Rec3.Rec2.Rec1.A := 10


X-Cite
Любую современную задачу можно решить используя либо классы, либо структуры..
А любую программу можно написать на ассемблере.

У объектов есть:
1) наследование
2) размещение на стеке
у классов только первое, у рекордов только второе
...
Рейтинг: 0 / 0
Rtti и object
    #39986798
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

_Vasilisk_Не понял. Откуда получить?
У object через Rtti можно получить информацию только об управляемых типах.
Типа этого http://docwiki.embarcadero.com/Libraries/Sydney/en/System.Rtti.TRttiRecordType.ManagedFields
...
Рейтинг: 0 / 0
Rtti и object
    #39986800
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

В RTTI принято комментировать динамические структуры
Если посмотришь TypeInfo - там TypeData тоже закомментирован
Потому что смещение не константно и зависит от длины имени
...
Рейтинг: 0 / 0
Rtti и object
    #39986803
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_

Мне не нужно записывать класс в поток, потому что это невозможно. Мне нужно в поток записать структуру
Код: pascal
1.
Stream.Write(MyRec, SizeOf(MyRec))



Реализуете обертку форматтеров, которых нет из коробки, и сериализуйте в любой формат, бинарный, xml, json как душе угодно

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
TA = class
public
  A: Int32;
  B: string;
end;

TB = class(TA)
public
  C: string;
  D: Int64;
end;

var
  MyClass: TB;



Код: pascal
1.
2.
IFormatter BF = TBinaryFormatter.Create();
BF.Serialize(Stream, MyClass);


Код: pascal
1.
2.
IFormatter BF = TXmlFormatter.Create();
BF.Serialize(Stream, MyClass);


Код: pascal
1.
2.
IFormatter BF = TJsonFormatter.Create();
BF.Serialize(Stream, MyClass);



Он вам даже string запишет и если другой класс есть тоже...
...
Рейтинг: 0 / 0
Rtti и object
    #39986835
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

Или воспользоваться object и не клепать мозги
Сложная дилемма )
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Rtti и object
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]