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 中编辑。
当我在 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 中编辑。