procedure TXmlReflector.LoadFromXmlNode(ANode:IXMLNode);
var
Context: TRttiContext;
rttiType,tmpType: TRttiType;
Prop: TRttiProperty;
value:TValue;
AType:PTypeInfo;
tmpNode,subNode:IXMLNode;
AList:TList;
Obj:TObject;
begin
Context := TRttiContext.Create;
try
rttiType := Context.GetType(ClassType);
if ANode.HasChildNodes then
begin
tmpNode:=ANode.ChildNodes.First;
while Assigned(tmpNode) do
begin
prop:=rttiType.GetProperty(tmpNode.NodeName);
if tmpNode.IsTextElement then
begin
if Prop.PropertyType.TypeKind in [tkInteger,tkInt64] then
begin
AType:=TypeInfo(Int64);
value:=TValue.FromOrdinal(AType,StrToInt64Def(tmpNode.Text,0));
end else if Prop.PropertyType.TypeKind in [tkChar,tkString,tkWChar,tkLString,tkWString,tkUString,tkVariant] then
begin
value:=tmpNode.Text;
end else if Prop.PropertyType.TypeKind in [tkFloat] then//日期,浮点数
begin
value:=StrToFloatDef(tmpNode.Text,0.0);
end;
Prop.SetValue(Self,value);
end else //TList
begin
if (tmpNode.HasChildNodes)and(prop.PropertyType.Name='TList') then
begin
AList:=TList.Create;
value:=AList;
Prop.SetValue(Self,value);
subNode:=tmpNode.ChildNodes.First;
while Assigned(subNode) do
begin
//谁帮我搞定这里,我现在只能用一个TDictionary来实现类的创建
Obj:=TypeDict.Items[subNode.NodeName].Create;
AList.Add(Obj);
TXmlReflector(Obj).LoadFromXmlNode(subNode);
subNode:=subNode.NextSibling;
end; end;
end;
tmpNode:=tmpNode.NextSibling;
end;
end;
finally
Context.Free;
end;
end;
var
Context: TRttiContext;
rttiType,tmpType: TRttiType;
Prop: TRttiProperty;
value:TValue;
AType:PTypeInfo;
tmpNode,subNode:IXMLNode;
AList:TList;
Obj:TObject;
begin
Context := TRttiContext.Create;
try
rttiType := Context.GetType(ClassType);
if ANode.HasChildNodes then
begin
tmpNode:=ANode.ChildNodes.First;
while Assigned(tmpNode) do
begin
prop:=rttiType.GetProperty(tmpNode.NodeName);
if tmpNode.IsTextElement then
begin
if Prop.PropertyType.TypeKind in [tkInteger,tkInt64] then
begin
AType:=TypeInfo(Int64);
value:=TValue.FromOrdinal(AType,StrToInt64Def(tmpNode.Text,0));
end else if Prop.PropertyType.TypeKind in [tkChar,tkString,tkWChar,tkLString,tkWString,tkUString,tkVariant] then
begin
value:=tmpNode.Text;
end else if Prop.PropertyType.TypeKind in [tkFloat] then//日期,浮点数
begin
value:=StrToFloatDef(tmpNode.Text,0.0);
end;
Prop.SetValue(Self,value);
end else //TList
begin
if (tmpNode.HasChildNodes)and(prop.PropertyType.Name='TList') then
begin
AList:=TList.Create;
value:=AList;
Prop.SetValue(Self,value);
subNode:=tmpNode.ChildNodes.First;
while Assigned(subNode) do
begin
//谁帮我搞定这里,我现在只能用一个TDictionary来实现类的创建
Obj:=TypeDict.Items[subNode.NodeName].Create;
AList.Add(Obj);
TXmlReflector(Obj).LoadFromXmlNode(subNode);
subNode:=subNode.NextSibling;
end; end;
end;
tmpNode:=tmpNode.NextSibling;
end;
end;
finally
Context.Free;
end;
end;
解决方案 »
- TChart显示的区域,在用鼠标拉框后,会放大缩小,如何用代码实现这一功能?
- adodataset用filter过滤后,dbgrid里还能显示表里所有的数据吗?
- TGraphicControl TLabel 之间的类型转换
- 几年没提过问题了。现在问一个关于build 速度的问题,100分相送。
- 如何调用外部程序?
- 如何控制报表的列数和行数?
- 有什么算法快速打开并且处理一个6万行的文本文件?
- 大爷,如果Hook删除某个文件或重命名文件。
- adodataset 保存时出现问题,请各位帮帮忙吧!用户火了
- dbgrid有没有一个当前记录移动时的事件?名字应该叫beforenext 或是什么把
- 买车了,散分
- 关于给Active控件的一个属性赋值全路径文件名的时候,反斜杠被去掉的问题
begin
if Attri is TXmlAttri then
begin
tmpClass:=TXmlAttri(Attri).ClassT;
end;
end;
if (tmpNode.HasChildNodes)and(prop.PropertyType.Name='TList') then
begin
AList:=TList.Create;
value:=AList;
Prop.SetValue(Self,value);
subNode:=tmpNode.ChildNodes.First;
while Assigned(subNode) do
begin
Obj:=tmpClass.Create;
AList.Add(Obj);
TXmlReflector(Obj).LoadFromXmlNode(subNode);
subNode:=subNode.NextSibling;
end;
end else
begin
Obj:=tmpClass.Create;
value:=Obj;
Prop.SetValue(Self,value);
TXmlReflector(Obj).LoadFromXmlNode(tmpNode);
end;
自己搞定了,没人来吗,结贴了。