加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 03:56:03 所属栏目:大数据 来源:网络整理
导读:我在我的Delphi应用程序中有一个类,我想要一个简单而动态的方式将所有的字符串属性重置为”,所有布尔属性为False 就我在网络上可以看到,应该可以做一些循环,但是如何做到这一点我不清楚. 解决方法 请注意,以下代码仅适用于已发布的类的属性!此外,传递给下面
我在我的Delphi应用程序中有一个类,我想要一个简单而动态的方式将所有的字符串属性重置为”,所有布尔属性为False
就我在网络上可以看到,应该可以做一些循环,但是如何做到这一点我不清楚.

解决方法

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

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

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

uses
  TypInfo;

procedure ResetPropertyValues(const AObject: TObject);
var
  PropIndex: Integer;
  PropCount: Integer;
  PropList: PPropList;
  PropInfo: PPropInfo;
const
  TypeKinds: TTypeKinds = [tkEnumeration,tkString,tkLString,tkWString,tkUString];
begin
  PropCount := GetPropList(AObject.ClassInfo,TypeKinds,nil);
  GetMem(PropList,PropCount * SizeOf(PPropInfo));
  try
    GetPropList(AObject.ClassInfo,PropList);
    for PropIndex := 0 to PropCount - 1 do
    begin
      PropInfo := PropList^[PropIndex];
      if Assigned(PropInfo^.SetProc) then
      case PropInfo^.PropType^.Kind of
        tkString,tkUString,tkWString:
          SetStrProp(AObject,PropInfo,'');
        tkEnumeration:
          if GetTypeData(PropInfo^.PropType^)^.BaseType^ = TypeInfo(Boolean) then
            SetOrdProp(AObject,0);
      end;
    end;
  finally
    FreeMem(PropList);
  end;
end;

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

type
  TSampleClass = class(TObject)
  private
    FStringProp: string;
    FBooleanProp: Boolean;
  published
    property StringProp: string read FStringProp write FStringProp;
    property BooleanProp: Boolean read FBooleanProp write FBooleanProp;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  SampleClass: TSampleClass;
begin
  SampleClass := TSampleClass.Create;
  try
    SampleClass.StringProp := 'This must be cleared';
    SampleClass.BooleanProp := True;
    ResetPropertyValues(SampleClass);
    ShowMessage('StringProp = ' + SampleClass.StringProp + sLineBreak +
      'BooleanProp = ' + BoolToStr(SampleClass.BooleanProp));
  finally
    SampleClass.Free;
  end;
end;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读