⊙ GetInterfaceProp / SetInterfaceProp 函数
==============================================================
GetInterfaceProp 函数用于获得 Interface 类型的属性值。
function GetInterfaceProp(Instance: TObject; PropInfo: PPropInfo): IInterface;
function GetInterfaceProp(Instance: TObject; const PropName: string): IInterface;
SetInterfaceProp 函数用于设置 Interface 类型的属性值。
procedure SetInterfaceProp(Instance: TObject; PropInfo: PPropInfo;
const Value: IInterface);
procedure SetInterfaceProp(Instance: TObject; const PropName: string;
const Value: IInterface);
* 不太熟悉 Interface,以后再看实现过程。
==============================================================
⊙ GetPropValue / SetPropValue 函数
==============================================================
GetPropValue 函数用于获得任何类型的属性值,它返回 Variant 类型。
注意,这个函数没有重载函数,只能使用属性名称字符串为参数。
GetPropValue 先调用 GetPropInfo 函数获得属性的类型,然后根据属性的数据类型选择调用以上介绍的 GetOrdProp、GetEnumProp、GetSetProp、GetStrProp 等函数实现具体的功能。
GetPropValue 的参数 PreferStrings 如果设置为 True,那么对于枚举、集合类型,将返回字符串值,否则返回整数值。GetPropValue 还可以返回动态数组类型的属性值。(目前对动态数组不太熟悉,先记下来。)
function GetPropValue(Instance: TObject; const PropName: string;
PreferStrings: Boolean): Variant;
SetPropValue 函数用于设置任何类型的属性值。SetPropValue 的实现与 GetPropValue 类似。并且 SetPropValue 内部分析 Value 参数是否是字符串来设置枚举和集合类型的属性,所以不需要 PreferStrings 参数。SetPropValue 也可以设置动态数组属性,它使用了 SetOrdProp 函数实现这一功能,看来动态数组在内存中的表现是一个指针。
procedure SetPropValue(Instance: TObject; const PropName: string;
const Value: Variant);
==============================================================
⊙ TPublishableVariantType class
==============================================================
在 TypInfo.pas 的代码注释中说 TPublishableVariantType 是用来代替 TCustomVariantType 以便更容易在 RTTI 中使用自定义的 Variant 类型。
* 现在对这两个类型都不太了解,先记在这里以后再学。
==============================================================
⊙ RegisterClass / FindClass 系列函数 (Classes.pas)
==============================================================
Delphi 提供了一种机制,可以使用类(class)的名称获得类(class VMTptr)。缺省情况下这些类必须是从 TPersistent 类继承下来的。使用这项功能之前必须在先把类信息注册到全局对象 RegGroup 中。
RegisterClass 函数用于注册类信息至 RegGroup 中,注意该函数名称和 Win32 API 中注册窗口类的函数同名。如果类已经被注册过了,RegisterClass 将直接返回。如果有一个不同的类以相同的名称注册了,RegisterClass 将触发异常(EFilerError)。
procedure RegisterClass(AClass: TPersistentClass);
RegisterClasses 函数可以方便地注册一批类:
procedure RegisterClasses(AClasses: array of TPersistentClass);
RegisterClassAlias 函数可以为类以其它的名称注册,以避免名称冲突。
procedure RegisterClassAlias(AClass: TPersistentClass; const Alias: string);
GetClass 函数根据类名称字符串获得类(class),如果没找到,将返回 nil:
function GetClass(const AClassName: string): TPersistentClass;
FindClass 函数包装了 GetClass,不同的是如果没找到该类,则触发异常(EClassNotFound):
function FindClass(const ClassName: string): TPersistentClass;
UnRegisterClass 系列函数执行 RegisterClass 相反的工作:
procedure UnRegisterClass(AClass: TPersistentClass);
procedure UnRegisterClasses(AClasses: array of TPersistentClass);
procedure UnRegisterModuleClasses(Module: HMODULE);
缺省的 RegGroup 用于组织从 TPersistent 继承下来的类,下面五个函数可以设置自己的 RegGroup:
procedure StartClassGroup(AClass: TPersistentClass);
procedure GroupDescendentsWith(AClass, AClassGroup: TPersistentClass);
function ActivateClassGroup(AClass: TPersistentClass): TPersistentClass;
function ClassGroupOf(AClass: TPersistentClass): TPersistentClass; overload;
function ClassGroupOf(Instance: TPersistent): TPersistentClass; overload;
==============================================================
⊙ IdentToInt / IntToIdent 系列函数 (Classes.pas)
==============================================================
IdentToInt 和 IntToIdent 函数用于实现字符串值和数值之间的转换。它的原理很简单,就是通过数组一一映射查找。不过一般不用直接使用这两个函数,而是使用 Delphi 中已经包装好的函数。这些函数的返回值都是 Boolean,表示转换是否成功。
function IdentToInt(const Ident: string; var Int: Longint;
const Map: array of TIdentMapEntry): Boolean;
function IntToIdent(Int: Longint; var Ident: string;
const Map: array of TIdentMapEntry): Boolean;
{ Graphics.pas }
function CharsetToIdent(Charset: Longint; var Ident: string): Boolean;
function IdentToCharset(const Ident: string; var Charset: Longint): Boolean;
function ColorToIdent(Color: Longint; var Ident: string): Boolean;
function IdentToColor(const Ident: string; var Color: Longint): Boolean;
{ Controls.pas }
function CursorToIdent(Cursor: Longint; var Ident: string): Boolean;
function IdentToCursor(const Ident: string; var Cursor: Longint): Boolean;
例子:
var
NewColor: Integer;
begin
if IdentToColor('clWindow', NewColor) then
Self.Color := NewColor;
end;
上一页 [1] [2] [3] [4] [5] [6] [7] [8]