Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.11.12;
Скачать: CL | DM;

Вниз

RTTI. Бесчеловечный AV для некоторых типов   Найти похожие ветки 

 
mfender   (2012-12-09 10:27) [0]

Не работает GetTypeData() для отдельных типов.

var
 L: TList;
 TypeData: PTypeData;
begin
 L := TList.Create;
 TypeData := GetTypeData(L.ClassInfo);

Инспектировать L.ClassInfo невозможно. Но что-то там есть. AV вываливается на GetTypeData(). Было испробовано на TList, на производных TStrings. Хотя, казалось бы, с чего бы это?

Есть ли объяснение этому феномену?


 
Dimka Maslov ©   (2012-12-09 10:33) [1]

Может в настройках/опциях чего не так установлено?


 
mfender   (2012-12-09 11:40) [2]

Чёрт, вот только сейчас подумалось: у них нет published-свойств.


 
mfender   (2012-12-09 12:23) [3]

Тогда такой вопрос: каким образом сериализовать например TList.Items?
Есть такая вот функция, которая рисует на выходе TlkJSONObject:

class function TjClient.ObjecttoJSON(AObj: TObject): TlkJSONObject;
var
 I: Integer;
 Cls: TClass;

 PropCnt: Integer;
 TypeData: PTypeData;
 PropList: PPropList;
 PropInfo: PPropInfo;
begin
 try
   Result := TlkJSONObject.Create(True);
   TypeData := GetTypeData(AObj.ClassInfo);
   if TypeData.PropCount > 0 then
   begin
     GetMem(PropList, SizeOf(PropInfo) * TypeData.PropCount);
     try
       TypInfo.GetPropInfos(AObj.ClassInfo, PropList);
       for I := 0 to Pred(TypeData.PropCount) do
       begin
         case PropList[I].PropType^.Kind of
           tkSet:
             Result.Add(PropList[I]^.Name, GetSetProp(AObj, PropList[I]));
           tkEnumeration, tkInteger:
             Result.Add(PropList[I]^.Name, GetOrdProp(AObj, PropList[I]));
           tkFloat:
             Result.Add(PropList[I]^.Name, GetFloatProp(AObj, PropList[I]));
           tkString, tkLString, tkWString:
             Result.Add(PropList[I]^.Name, GetStrProp(AObj, PropList[I]));
           tkClass:
             Result.Add(PropList[I]^.Name,
               ObjecttoJSON(GetObjectProp(AObj, PropList[I])) as TlkJSONBase);
         end;
       end;
     finally
       FreeMem(PropList, SizeOf(PropInfo) * TypeData.PropCount);
     end;
   end;
 except

 end;
end;

С объектами то она нормально обращается.
Пытаюсь опубликовать Items:

{$M+}
 TMyList = class(TList)
 public
   property Items[Index: Integer]: Pointer read Get write Put; default;
 end;
{$M-}

И всё, и тишина. TypeData.PropCount показывает 0.
Как добраться до него?


 
mfender   (2012-12-09 12:25) [4]

Ах, да. published из него не сделать. Published property "Items" cannot be of type ARRAY


 
Игорь Шевченко ©   (2012-12-10 12:43) [5]


> Тогда такой вопрос: каким образом сериализовать например
> TList.Items


через DefineProperties


 
icWasya ©   (2012-12-10 15:36) [6]

не столько cannot be of type ARRAY, сколько Pointer



Страницы: 1 вся ветка

Текущий архив: 2017.11.12;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.005 c
1-1355034458
mfender
2012-12-09 10:27
2017.11.12
RTTI. Бесчеловечный AV для некоторых типов


2-1450384249
Max
2015-12-17 23:30
2017.11.12
Сделать в stringgrid строки enabled.Афды


15-1465507801
Юрий
2016-06-10 00:30
2017.11.12
С днем рождения ! 10 июня 2016 пятница


6-1284011253
Alexandro
2010-09-09 09:47
2017.11.12
Как получить доступ к элементу в TWebBrowser?


2-1450085380
gedevan
2015-12-14 12:29
2017.11.12
Как экспортировать или импортировать таблицу из базы Access