![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
RTTI. Бесчеловечный AV для некоторых типов [D7, WinXP]
mfender © (2012-12-09 10:27:00)Не работает GetTypeData() для отдельных типов.
var
L: TList;
TypeData: PTypeData;
begin
L := TList.Create;
TypeData := GetTypeData(L.ClassInfo);
Инспектировать L.ClassInfo невозможно. Но что-то там есть. AV вываливается на GetTypeData(). Было испробовано на TList, на производных TStrings. Хотя, казалось бы, с чего бы это?
Есть ли объяснение этому феномену?
icWasya (2012-12-10 15:36:00) [1]не столько cannot be of type ARRAY, сколько Pointer
Игорь Шевченко (2012-12-10 12:43:00) [2]
> Тогда такой вопрос: каким образом сериализовать например
> TList.Items
через DefineProperties
mfender (2012-12-09 12:25:00) [3]Ах, да. published из него не сделать. Published property 'Items' cannot be of type ARRAY
mfender (2012-12-09 12:23:00) [4]Тогда такой вопрос: каким образом сериализовать например 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 11:40:00) [5]Чёрт, вот только сейчас подумалось: у них нет published-свойств.
Dimka Maslov (2012-12-09 10:33:00) [6]Может в настройках/опциях чего не так установлено?