Delphi 7 中的 ClassInfo 函数

ClassInfo function in Delphi 7

当我在 Delphi 7 中这样定义 class 时:

  TPerson = class(TObject)
  private
    FLName: string;
    FFName: string;
    FAge: integer;
    FBDate: TDate;
  public
  published
    property FName: string read FFName write FFName;
    property LName: string read FLName write FLName;
    property Age: integer read FAge write FAge;
    property BDate: TDate read FBDate write FBDate;
  end;

procedure ListComponentProperties(AObject: TObject; Strings: TStrings);
var
  Count, Size, I: Integer;
  List: PPropList;
  PropInfo: PPropInfo;
  PropValue: string;
begin
  Count := GetPropList(AObject.ClassInfo, tkAny, List);
  Size  := Count * SizeOf(Pointer);
  GetMem(List, Size);
  try
    Count := GetPropList(AObject.ClassInfo, tkAny, List);
    for I := 0 to Count - 1 do
    begin
      PropInfo := List^[I];
      PropValue := VarToStr(GetPropValue(AObject, PropInfo^.Name));
    end;
  finally
    FreeMem(List);
  end;
end;

并且我想使用 ListComponentProperties 获取其已发布属性的列表,错误消息将是 displayed.The 错误与以下命令相关并且 AObject.ClassInfo:

Count := GetPropList(AObject.ClassInfo, tkAny, List);

如有任何帮助,我们将不胜感激。

您必须为该类型启用 RTTI。默认情况下它是不启用的。像这样声明类型:

type
  {$M+}
  TPerson = class(TObject)
  ....
  end;
  {$M-}

您最初对 GetPropList 的调用也是错误的。它必须是:

Count := GetPropList(AObject.ClassInfo, tkAny, nil);

如果您启用了警告,编译器会告诉您您正在传递一个未初始化的变量。

我没有再检查您的代码。可能会有更多的错误。

除了使用 $M 编译器指令外,您还可以从任何启用了 RTTI 信息的 class 派生 classes。

其中一个 class 是 TPersistent,它应该用作任何需要分配和流式传输功能的 class 的基础 class。

TPersistent encapsulates the behavior common to all objects that can be assigned to other objects, and that can read and write their properties to and from a form file (.xfm or .dfm file).

Do not create instances of TPersistent. Use TPersistent as a base class when declaring objects that are not components, but that need to be saved to a stream or have their properties assigned to other objects.

在实践中,这意味着如果您想使用 TPerson class 发布的 属性 某些组件,可以通过对象检查器在 IDE 中编辑并流式传输要形成文件 (.dfm),您的 class 必须将 TPersistent 作为其 class 层次结构中的祖先。

type
  TPersonComponent = class(TComponent)
  protected
    FPerson: TPerson;
    procedure SetPerson(AValue: TPerson);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Person: TPerson read FPerson write SetPerson;
  end;

constructor TPersonComponent.Create(AOwner: TComponent);
begin
  inherited;
  FPerson := TPerson.Create;
end;

destructor TPersonComponent.Destroy;
begin
  FPerson.Free;
  inherited;
end;

procedure TPersonComponent.SetPerson(AValue: TPerson);
begin
  FPerson.Assign(AValue);
end;

如果您在上面的示例中使用声明为 TPerson = class(TObject) 的 class,当 TPersonComponent 在 Object Inspector 中编辑。