本文整理汇总了C++中TObject::ClassType方法的典型用法代码示例。如果您正苦于以下问题:C++ TObject::ClassType方法的具体用法?C++ TObject::ClassType怎么用?C++ TObject::ClassType使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类TObject
的用法示例。
在下文中一共展示了TObject::ClassType方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ToPyObject
/** Convert a TValue from the Delphi RTTI system to a PyObject*.
* \param V: The value to convert.
* \return New reference to a converted object.
* \throw EPyVclError if the conversion fails.
*/
PyObject* ToPyObject(const Rtti::TValue &V)
{
Rtti::TValue &Value = const_cast<Rtti::TValue&>(V);
if(Value.IsEmpty)
Py_RETURN_NONE;
switch(Value.Kind)
{
case tkInteger:
return ToPyObject(Value.AsInteger());
case tkUString:
case tkString:
case tkLString:
case tkWString:
return ToPyObject(Value.AsString());
case tkEnumeration:
{
if(AnsiString(Value.TypeInfo->Name) == "Boolean")
return ToPyObject(static_cast<bool>(Value.AsOrdinal()));
TRttiEnumerationType *Type = static_cast<TRttiEnumerationType*>(Context.GetType(Value.TypeInfo));
int Ordinal = Value.AsOrdinal();
if(Ordinal >= Type->MinValue && Ordinal <= Type->MaxValue)
//GetEnumName() lacks range check
return ToPyObject(GetEnumName(Value.TypeInfo, Ordinal));
return ToPyObject("0x" + IntToHex(Ordinal, 2));
}
case tkClass:
return VclObject_Create(Value.AsObject(), false);
case tkSet:
return ToPyObject(SetToString(Value.TypeInfo, *static_cast<int*>(Value.GetReferenceToRawData()), false));
case tkChar:
return ToPyObject(Value.AsType<char>());
case tkWChar:
return ToPyObject(Value.AsType<wchar_t>());
case tkFloat:
return ToPyObject(Value.AsExtended());
case tkRecord:
{
void *Data = Value.GetReferenceToRawData();
TRttiType *Type = Context.GetType(Value.TypeInfo);
DynamicArray<TRttiField*> Fields = Type->GetFields();
PyObject *Tuple = PyTuple_New(Fields.Length);
for(int I = 0; I < Fields.Length; I++)
PyTuple_SET_ITEM(Tuple, I, ToPyObject(Fields[I]->GetValue(Data)));
return Tuple;
}
case tkMethod: //Event
{
TMethod Method;
Value.ExtractRawDataNoCopy(&Method);
if(Method.Code == NULL)
Py_RETURN_NONE;
TObject *Object = static_cast<TObject*>(Method.Data);
if(TMethodImplementation *Impl = dynamic_cast<TMethodImplementation*>(Object))
{
PyObject *Result = static_cast<PyObject*>(Impl->FUserData);
Py_IncRef(Result);
return Result;
}
String Name = Object->MethodName(Method.Code);
TRttiType *Type = Context.GetType(Object->ClassType());
return VclMethod_Create(NULL, Object, Type->GetMethods(Name));
}
case tkInt64:
return PyLong_FromLongLong(Value.AsInt64());
case tkVariant:
case tkArray:
case tkInterface:
case tkDynArray:
case tkClassRef:
case tkPointer:
case tkProcedure:
case tkUnknown:
default:
throw EPyVclError("Unable to convert type '" + AnsiString(Value.TypeInfo->Name) + "'");
}
}