方法 |
描述 |
public: |
|
TGraphicsObject |
__fastcall TGraphicsObject(void);
构造函数 |
~TGraphicsObject |
__fastcall virtual ~TGraphicsObject(void);
析构函数 |
HandleAllocated |
bool __fastcall HandleAllocated(void);
返回 GDI 对象是否已经创建,即 Handle 属性是否为有效的 GDI 对象句柄。
读取 Handle 属性的时候,如果 GDI 对象没有创建,会自动创建出来,所以无法通过 Handle 属性判断当前 GDI 对象是否已经创建了的真实情况,而 HandleAllocated 不会自动创建 GDI 对象,反映的是当前 GDI 创建的真实情况。 |
TPersistent:: |
从 TPersistent 继承过来的 |
Assign |
virtual void __fastcall Assign(TPersistent *Source);
把 Source 对象的所有的属性和数据赋值到当前对象,包括类型和格式转换再赋值。
【例:jpg, gif, png, bmp 之间的格式转换】 |
GetNamePath |
DYNAMIC System::UnicodeString __fastcall GetNamePath(void);
返回在 Object Inspector 属性面板里面的名称。对于控件,返回控件的名称,对于 TCollectionItem 对象,返回宿主控件的名称、属性名和 [索引号]。 |
TObject:: |
从 TObject 继承过来的 |
Free |
void __fastcall Free(void);
C++ 程序需要用 delete 来销毁对象,不要调用 Free 方法。
Delphi 程序可以通过调用 Free 方法来调用析构函数释放分配的内存,空指针和未初始化的对象调用 Free 不会出错。 |
DisposeOf |
void __fastcall DisposeOf(void);
PC 版本,相当于 Free;移动版本,会强制销毁对象无论 RefCount 的值是多少,并且置 Disposed 属性为 true. |
InitInstance |
__classmethod __unsafe TObject* __fastcall InitInstance(void * Instance);
初始化成员,给他们清零。这是 NewInstance 内部调用的函数,不要直接调用 InitInstance。
重载 NewInstance 的时候,在 NewInstance 的最后一句要调用 InitInstance。
不要重载 InitInstance,因为它不是 virtual 函数。 |
NewInstance |
__classmethod virtual __unsafe TObject* __fastcall NewInstance();
NewInstance 给实例分配内存,并且返回新的实例的地址,通过调用 InstanceSize 获取需要的内存的字节数。
构造函数会自动调用 NewInstance,不要直接调用 NewInstance。
如果重载了 NewInstance 分配内存,就必须重载 FreeInstance 释放内存。 |
InstanceSize |
__classmethod int __fastcall InstanceSize();
返回给实例数据分配内存需要多少字节数。
不要重载 InstanceSize 因为它不是 virtual 函数。
只有在重载的 NewInstance 函数里面需要调用 InstanceSize。 |
FreeInstance |
virtual void __fastcall FreeInstance(void);
释放 NewInstance 分配的内存。
析构函数会自动调用 FreeInstance,不要直接调用 FreeInstance。
如果重载了 NewInstance 就必须重载 FreeInstance 与之对应。
和 NewInstance 一样,FreeInstance 也是通过 InstanceSize 获取释放内存的字节数。 |
CleanupInstance |
void __fastcall CleanupInstance(void);
清除长字符串、Variants、接口变量等,把长字符串置为 Empty,Variant 置为 Unassigned 状态。
不要直接调用 CleanupInstance,会在销毁实例的时候自动调用。 |
ClassType |
TClass __fastcall ClassType(void);
返回类的类型信息【例1:获取控件对象的类及这个类的祖先】
C++ 程序可以使用 dynamic_cast 或 InheritsFrom 来代替 ClassType 方法。 |
ClassName |
__classmethod UnicodeString __fastcall ClassName();
获取类名。如果父类指针指向的是子类,通过父类指针获取类名,得到的是子类的类名。 |
ClassNameIs |
__classmethod bool __fastcall ClassNameIs(const UnicodeString Name);
判断类名是否为 Name。如果父类指针指向的是子类,通过父类指针判断类名,用的是子类的类名进行判断。 |
QualifiedClassName |
__classmethod UnicodeString __fastcall QualifiedClassName();
返回包含命名空间的类名,例如 TButton 类型返回的是 "Vcl.StdCtrls.TButton"
UnitName 和 ClassName 合在一起就是 QualifiedClassName |
UnitName |
__classmethod UnicodeString __fastcall UnitName();
返回类所在的命名空间,例如 TButton 类型返回的是 "Vcl.StdCtrls"
UnitName 和 ClassName 合在一起就是 QualifiedClassName |
UnitScope |
__classmethod UnicodeString __fastcall UnitScope();
和 UnitName 返回的结果相同。 |
ClassParent |
__classmethod TClass __fastcall ClassParent();
返回父类的类型信息【例1:获取控件对象的类及这个类的祖先】
C++ 程序可以使用 dynamic_cast 或 InheritsFrom 来代替 ClassParent 方法。 |
ClassInfo |
__classmethod void * __fastcall ClassInfo();
返回运行时类型信息表 (RTTI table)。
不是所有的类都提供 RTTI 信息表,如果没有提供,返回值为 NULL。
从 TPersistent 继承的类会提供 RTTI 信息表。 |
InheritsFrom |
__classmethod bool __fastcall InheritsFrom(TClass AClass);
当前对象的类是否从 AClass 继承过来的。AClass 是父类、父类的父类,…… 一直到祖先,返回为真。 |
MethodAddress |
__classmethod void * __fastcall MethodAddress(const ShortString &Name)/* overload */;
__classmethod void * __fastcall MethodAddress(const UnicodeString Name)/* overload */;
通过名称返方法的地址。 |
MethodName |
__classmethod UnicodeString __fastcall MethodName(void *Address);
通过方法的地址返回名称。 |
FieldAddress |
void * __fastcall FieldAddress(const ShortString &Name)/* overload */;
void * __fastcall FieldAddress(const UnicodeString Name)/* overload */;
返回 __published: 成员的地址。 |
GetInterface |
bool __fastcall GetInterface(const GUID &IID, /* out */ void *Obj);
template <typename T>
bool __fastcall GetInterface(DelphiInterface<T>& smartIntf)
{
return GetInterface(__uuidof(T), reinterpret_cast<void*>(static_cast<T**>(&smartIntf)));
}
Delphi 的 IID 允许用接口名称,编译器会自动采用类型的 GUID。
C++ 可以用模板版本的 GetInterface,相当于 dynamic_cast,GetInterface 在转为不支持的类型的时候不会抛出异常,只是得到的指针为 NULL,请参考 TInterfacedPersistent 的 operator
_di_IInterface()。
参数 Obj 虽然是 void * 类型的,但是实质上是 void ** 类型的,必须把 void ** 强制转为 void * 作为 Obj 参数。 |
GetInterfaceEntry |
__classmethod PInterfaceEntry __fastcall GetInterfaceEntry(const GUID &IID);
获取接口项目 |
GetInterfaceTable |
__classmethod PInterfaceTable __fastcall GetInterfaceTable();
获取接口表 |
Equals |
virtual bool __fastcall Equals(TObject *Obj);
比较当前对象和 Obj 对象是否相同。从 TObject 继承的子类需要重载 Equals 来提供比较相同的方法。 |
GetHashCode |
virtual int __fastcall GetHashCode(void);
返回一个整数的 hash 值,默认的,返回的整数值为对象的地址。
测试程序:int a = Sender->GetHashCode();
int b = (int)Sender; 发现 a 和 b 的值相等。 |
ToString |
virtual UnicodeString __fastcall ToString(void);
转为字符串。默认的,ToString 返回类名,和 ClassName 的返回值相同。
如果需要其他的转字符串方式,需要用重载 ToString 来提供转为字符串的方法。 |
SafeCallException |
virtual HRESULT __fastcall SafeCallException(TObject *ExceptObject, void *ExceptAddr);
处理异常的函数,TObject 的这个函数只是简单的返回 E_UNEXPECTED
从 TObject 继承的子类可以重载这个函数来处理异常。 |
AfterConstruction |
virtual void __fastcall AfterConstruction(void);
在构造函数结束的时候会自动调用 AfterConstruction,不要直接调用这个函数。
重载这个函数可以处理在构造函数结束时需要运行的代码,
例如 TCustomForm 利用重载的 AfterConstruction 来产生 OnCreate 事件。 |
BeforeDestruction |
virtual void __fastcall BeforeDestruction(void);
在执行析构函数之前会自动调用 BeforeDestruction,不要直接调用这个函数。
在调用 BeforeDestruction 的时候,还没做任何销毁动作呢。
只有当构造函数完整执行完成的情况下,析构之前才会调用 BeforeDestruction,如果在构造函数里面抛出了异常,会调用析构函数,但是不会调用 BeforeDestruction。
重载这个函数可以处理析构函数调用之前需要运行的代码,
例如 TCustomForm 利用重载的 BeforeDestruction 来产生 OnDestroy 事件。 |
Dispatch |
virtual void __fastcall Dispatch(void *Message);
如果从 TObject 类继承的类处理了消息,Dispatch 为处理消息的函数。
如果没有处理的消息,会调用父类的消息处理,如果仍然没有处理,调用 DefaultHandler。 |
DefaultHandler |
virtual void __fastcall DefaultHandler(void *Message);
默认的消息处理。如果 Dispatch 处理消息的过程,没有找到处理的方法,会调用 DefaultHandler 进行默认的消息处理。 |
protected: |
|
Changed |
virtual void __fastcall Changed(void);
当属性变化的时候,调用这个函数来触发 OnChange 事件。 |
Lock |
void __fastcall Lock(void);
阻止其他线程访问这个 TGraphicsObject 对象,同时也会锁定关联的画布 (Canvas),一直持续到调用 Unlock 方法。 |
Unlock |
void __fastcall Unlock(void);
解除锁定线程访问,调用 Lock 方法之后,需要用 Unlock 方法解锁。 |
TPersistent:: |
从 TPersistent 继承过来的 |
AssignTo |
virtual void __fastcall AssignTo(TPersistent* Dest);
把当前对象的所有属性和数据都赋值到 Dest 对象。
TPersistent 的 AssignTo 是 protected: 方法,只是简单的抛出 EConvertError 异常,
从 TPersistent 继承的子类必须重载 AssignTo 来实现这个方法。 |
DefineProperties |
virtual void __fastcall DefineProperties(TFiler* Filer);
提供把非 __published: 属性和数据存入流中,是 protected: 方法。
如果子类需要这个功能,需要重载这个函数,在重载的 DefineProperties 需要调用父类的 DefineProperties,Filter 的 DefineProperty 和 DefineBinaryProperty。 |
GetOwner |
DYNAMIC TPersistent* __fastcall GetOwner(void);
返回对象的拥有者,是 protected: 方法。GetNamePath 方法会调用 GetOwner。
TPersistent 的 GetOwner 只是简单的返回 NULL。
例如,TOwnedCollection 的 GetOwner 返回这个 collection 的 owner;TCollectionItem 的 GetOwner 返回这个项目添加在哪个 collection object 里面了,组件 (TComponent) 的 GetOwner 返回组件的 Owner 属性。 |