delphi – 如何循环一个类中的所有属性

前端之家收集整理的这篇文章主要介绍了delphi – 如何循环一个类中的所有属性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在我的Delphi应用程序中有一个类,我想要一个简单而动态的方式将所有的字符串属性重置为”,所有布尔属性为False
就我在网络上可以看到,应该可以做一些循环,但是如何做到这一点我不清楚.

解决方法

请注意,以下代码仅适用于已发布的类的属性!此外,传递给下面的函数的类的实例至少必须已经定义了发布的部分!

以下是使用旧样式RTTI将已发布的字符串属性值设置为空字符串,将布尔值设置为False.

如果您的Delphi比Delphi 2009更旧,您可能会丢失tkUString类型.如果是这样,请从以下代码删除

  1. uses
  2. TypInfo;
  3.  
  4. procedure ResetPropertyValues(const AObject: TObject);
  5. var
  6. PropIndex: Integer;
  7. PropCount: Integer;
  8. PropList: PPropList;
  9. PropInfo: PPropInfo;
  10. const
  11. TypeKinds: TTypeKinds = [tkEnumeration,tkString,tkLString,tkWString,tkUString];
  12. begin
  13. PropCount := GetPropList(AObject.ClassInfo,TypeKinds,nil);
  14. GetMem(PropList,PropCount * SizeOf(PPropInfo));
  15. try
  16. GetPropList(AObject.ClassInfo,PropList);
  17. for PropIndex := 0 to PropCount - 1 do
  18. begin
  19. PropInfo := PropList^[PropIndex];
  20. if Assigned(PropInfo^.SetProc) then
  21. case PropInfo^.PropType^.Kind of
  22. tkString,tkUString,tkWString:
  23. SetStrProp(AObject,PropInfo,'');
  24. tkEnumeration:
  25. if GetTypeData(PropInfo^.PropType^)^.BaseType^ = TypeInfo(Boolean) then
  26. SetOrdProp(AObject,0);
  27. end;
  28. end;
  29. finally
  30. FreeMem(PropList);
  31. end;
  32. end;

这是一个简单的测试代码(注意属性必须发布;如果类中没有已发布的属性,至少空的发布部分必须在那里):

  1. type
  2. TSampleClass = class(TObject)
  3. private
  4. FStringProp: string;
  5. FBooleanProp: Boolean;
  6. published
  7. property StringProp: string read FStringProp write FStringProp;
  8. property BooleanProp: Boolean read FBooleanProp write FBooleanProp;
  9. end;
  10.  
  11. procedure TForm1.Button1Click(Sender: TObject);
  12. var
  13. SampleClass: TSampleClass;
  14. begin
  15. SampleClass := TSampleClass.Create;
  16. try
  17. SampleClass.StringProp := 'This must be cleared';
  18. SampleClass.BooleanProp := True;
  19. ResetPropertyValues(SampleClass);
  20. ShowMessage('StringProp = ' + SampleClass.StringProp + sLineBreak +
  21. 'BooleanProp = ' + BoolToStr(SampleClass.BooleanProp));
  22. finally
  23. SampleClass.Free;
  24. end;
  25. end;

猜你在找的Delphi相关文章