C++ Builder 参考手册 ➙ System ➙ TObject
System::TObject 是所有的 VCL 和 FMX 控件的顶级父类。
- System::TObject 简介
- System::TObject 成员
- 例子:
多个控件共用一个事件函数
获取一个控件的所有的父类一直到顶级父类
枚举所有的属性、方法、事件和成员变量
一. System::TObject 简介
System::TObject 是所有的 VCL 和 FMX 控件的顶级父类。
- 头文件:
#include <systobj.h>
- 命名空间:
System
- 对象实例的创建、维护、和销毁时的内存管理
- 响应对象实例的创建和销毁
- 提供返回对象的类型 (class-type) 和实例信息 (instance information),
- 支持返回 __published: 属性的运行时类型信息 (RTTI, runtime type information)。
- 支持消息处理
- 支持接口的实现 (interfaces implemented)
- TObject 和从 TObject 继承来的类不能直接定义为对象,必须定义为指针,用 new 创建出来;
- TObject 是一个抽象类,虽然在程序代码上没有限制直接创建一个 TObject 实例;
二. System::TObject 的成员
成员函数 | 说明 |
---|---|
public: | |
AfterConstruction | 在构造函数结束的时候会自动调用 AfterConstruction |
BeforeDestruction | 在执行析构函数之前会自动调用 BeforeDestruction |
ClassInfo | 返回运行时类型信息表 (RTTI table) |
ClassName | 获取类名,不包含命名空间的类名字符串 |
ClassNameIs | 判断类名是否为参数指定的字符串 |
ClassParent | 返回父类的类型信息 |
ClassType | 返回类的类型信息 |
CleanupInstance | 清除长字符串、Variants、接口变量等 |
DefaultHandler | 默认的消息处理 |
Dispatch | 处理消息的函数 |
DisposeOf | 强制销毁对象 |
Equals | 比较当前对象和 Obj 对象是否相同 |
FieldAddress | 通过成员名称返回成员的地址 |
Free | 销毁对象 (Delphi) |
FreeInstance | 释放 NewInstance 分配的内存 |
GetHashCode | 返回对象的 hash 值 |
GetInterface | 获取指定的接口 |
GetInterfaceEntry | 获取接口项目 |
GetInterfaceTable | 获取接口表 |
InheritsFrom | 当前对象的类是否从 AClass 继承过来的 |
InitInstance | 初始化成员,给他们清零 |
InstanceSize | 返回给实例数据分配内存需要多少字节数 |
MethodAddress | 通过名称返方法的地址 |
MethodName | 通过方法的地址返回名称 |
NewInstance | 给实例分配内存,并且返回新的实例的地址 |
QualifiedClassName | 返回包含命名空间的类名 |
SafeCallException | 处理异常的函数 |
TObject | 构造函数 |
~TObject | 析构函数 |
ToString | 转为字符串 |
UnitName | 返回类所在的命名空间 |
UnitScope | 返回类所在的命名空间 |
三. 例子
1. 多个控件共用一个事件函数
- 控件的事件一般都有一个参数是 TObject *Sender,这个指针指向产生事件的控件,可以通过这个指针来区分不同的控件。
- 除了可以通过控件的 Name 属性区分不同的控件之外,还可以使用控件的 Tag 属性来区分,这个属性是整数,可以随意指定不同的整数值来区分不同的控件,整数可以方便的使用 switch 语句。
这个例子把 Button1、Button2、Button3 的 Tag 属性分别设为 101、102、103。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Memo1->Lines->Add(Sender->ClassName());
TButton *lpButton = dynamic_cast<TButton *>(Sender);
if(lpButton)
{
Memo1->Lines->Add(lpButton->Name);
Memo1->Lines->Add(lpButton->Tag);
switch(lpButton->Tag)
{
case 101: break; // Tag 编号为 101 的按钮
case 102: break; // Tag 编号为 102 的按钮
case 103: break; // Tag 编号为 103 的按钮
}
}
}
运行结果:点击按钮 Button2,可以得到控件的类名 "TButton",名称 "Button2" 和 Tag 编号 102。
2. 获取一个控件的所有的父类一直到顶级父类
void __fastcall TForm1::Button4Click(TObject *Sender)
{
TObject *p = Button1;
TClass c = p->ClassType();
while(c)
{
Memo1->Lines->Add(c->ClassName());
c = c->ClassParent();
}
}
运行结果:可以看到,Button1 是 TButton 类,父类是 TCustomButton,TCustomButton 的父类是 TButtonControl,……一直到顶级父类 TObject。
3. 枚举所有的属性、方法、事件和成员变量
请参考《C++ Builder 枚举控件所有的属性、事件和方法》的 void ShowAllMembers(TObject *pObject) 函数,可以枚举从 TObject 继承的类的所有的成员,包括属性、事件、方法和成员变量。
参考:
- System::Classes::TComponent
- System::Classes::TPersistent
- System::Classes
- System
- 枚举控件所有的属性、事件和方法
- VCL 类继承关系
C++ Builder 参考手册 ➙ System ➙ TObject