TObject 对象模型

TObject 对象模型创建步骤
1.分配和初始化内存(内存切换【未开放】)
 1.1:Object Pascal 的对象模型会先初始化所有的内存内容为0,String 类型为空字符串
 1.2:为类中声明的特别字段进行初始化的工作
2.设定字段变量数据结构
3.设定执行框架

 

Object Pascal 对象模型提供的基础服务
1.对象创建服务: 提供创建对象机制
  TObject = class
    ...
    constructor Create;
    class function NewInstance: TObject; virtual;           
    class function InitInstance(Instance: Pointer): TObject;
    class function InstanceSize: Longint;
    procedure AfterConstruction; virtual;
    ...   
  end;
  NewInstance 是虚拟方法,功能是为对象分配内存,并且调用InitInstance 方法为对象设定对象支持的借口。
  NewInstance 的返回值是TObject,代表调用了NewInstance之后Object Pascal的对象模型已经在内存形成了
  TObject的实体(instance),此时仍然无发使用,要设定对象的执行框架
 
2.对象释放服务: 提供对象释放机制
  TObject = class
     
    procedure CleanupInstance;
    procedure FreeInstance; virtual;
    destructor Destroy; virtual;
    procedure Free;
   
  end;
  
  Destroy 派生类分配的资源释放需要:
  1.Destroy:在派生类中需要重载(override)
  2.在改写的Destroy中先释放派生类自己的资源
  3.最后调用父类的Inherited 关键字调用父类的虚拟析构函数


3.对象识别服务: 提供对象判断,识别的机制
  TObject = class
   ...
    class function ClassName: ShortString;
    class function ClassNameIs(const Name: string): Boolean;
    class function ClassParent: TClass;
    class function InstanceSize: Longint;
    class function InheritsFrom(AClass: TClass): Boolean;
    ...
  end;
 
  ClassName:返回类名称
  ClassNamels:判断特定类的名称
  ClassParent:返回类的父类
  InstanceSize:返回类对象占据的内存的大小
  InheritsFrom:判断类是否从特定的类继承下来的
 
  对象识别服务方法都是声明称类方法(Class Method),所谓类方法就是程序代码中不需要这个类的对象实体来调用,可直接使用:
 
  类.类方法

4.对象信息服务: 提供程序代码存取对象信息的服务
  TObject = class
  ...
    class function ClassInfo: Pointer;
    class function MethodAddress(const Name: ShortString): Pointer;
    class function MethodName(Address: Pointer): ShortString;
    function FieldAddress(const Name: ShortString): Pointer;
    function GetInterface(const IID: TGUID; out Obj): Boolean;
    class function GetInterfaceEntry(const IID: TGUID): PInterfaceEntry;
    class function GetInterfaceTable: PInterfaceTable;
    function SafeCallException(ExceptObject: TObject;
      ExceptAddr: Pointer): HResult; virtual;
     ...
  end;
 
  ClassInfo: 返回类的RTTI表格信息
 MethodAddress: 返回Published 类方法的地址
 MethodName: 返回类名方法的名称
 FieldAddress: 返回Published 的字段变量
 GetInterface: 返回类实现的接口信息
 GetInterfaceEntry: 返回特定接口的信息
 GetInterfaceTable: 返回类所有实现接口的表格信息
 SafeCallException: 处理使用 Safe Call 异常的虚拟方法
 
5.对象消息分派服务: 提供Object Pascal分派消息的服务,和VCL封装窗口消息有密切的关系

 

VCL FrameWork 方法种类
1.类方法(Class Method),也叫静态方法(Static Method):类范围内的方法,可直接使用类名称来调用,无需经由类对象来调用
2.对象方法(Object Method):类一般定义的方法,经由类对象来调用
3.虚拟方法(Virtual Method): 提供派生类(derived Class)改写(override)父类(Parent Class)定义的方法机制
4.重载方法(Overload Method): 定义同名,但具有不同参数原型的方法,主要是定义多个构造函数,活接受不同参数,但有相同名称的函数
5.动态方法(Dymanic Method):类似于虚拟方法,但可以大幅减少VMT的大小,效率比虚拟方法稍微慢一点
6.事件处理函数(Event Handler):组件阶层VCL对象的特别方法,可结合图形用户界面提供反应外界触发事件的能力

注意:
 1.在父类中同时是虚拟方法和重载方法,派生类必须要加 reintroduce 来声明

 

<think>好的,我现在需要回答用户关于Excel VBA中Application对象的详细属性和方法的问题。首先,用户引用了四篇相关的资料,我需要仔细查看这些引用内容,确保回答准确并正确引用。 首先,引用[1]提到VBA可以控制Excel中的各种对象,包括工作簿、工作表、单元格区域等,而Application对象是这些对象的根。引用[3]明确指出Application代表Excel程序本身,是对象模型的起点,并提到了ScreenUpdating属性。引用[2]给出了一个例子,使用Application对象在其他应用中创建Excel工作簿。引用[4]讨论了对象的事件,比如工作簿的Open事件,但Application对象的事件可能需要进一步确认。 接下来,我需要整理Application对象的主要属性和方法。根据已有的知识和引用,常见的属性包括ScreenUpdating、DisplayAlerts、EnableEvents、Visible、Calculation等。方法可能包括Quit、Calculate、Run等。另外,用户可能需要了解事件,但Application对象的事件可能较少,如SheetActivate、WorkbookOpen等。 需要确保回答结构清晰,分点列出属性和方法,并给出示例代码。同时,根据用户要求生成相关问题,可能涉及属性使用场景、常见错误处理、性能优化等。还要注意引用标记的正确使用,比如引用[3]提到的ScreenUpdating属性,引用[2]中的CreateObject方法。 需要验证一些不确定的信息,比如Application对象的事件,是否有OnKey或OnTime方法,这些可能需要查阅文档确认。另外,确保示例代码正确,比如设置DisplayAlerts为False,然后保存工作簿,再恢复为True。 最后,生成的相关问题应围绕Application对象展开,可能包括属性应用、方法使用技巧、与其他对象的关系等。确保问题有针对性,帮助用户深入理解。</think>### Excel VBA Application对象详解 Application对象是Excel对象模型的根对象,所有其他对象(如工作簿、工作表、单元格等)都通过它访问。以下是其主要属性和方法: --- #### **核心属性** 1. **ScreenUpdating** 控制屏幕刷新以提高代码执行效率 ```vba Application.ScreenUpdating = False '关闭屏幕更新 '执行操作... Application.ScreenUpdating = True '恢复更新 ``` [^3] 2. **DisplayAlerts** 禁止弹出警告对话框(如保存提示) ```vba Application.DisplayAlerts = False ThisWorkbook.SaveAs "NewFile.xlsx" Application.DisplayAlerts = True ``` 3. **EnableEvents** 禁用事件触发(避免递归调用) ```vba Application.EnableEvents = False Range("A1").Value = "Test" Application.EnableEvents = True ``` 4. **Visible** 设置Excel窗口可见性 ```vba Application.Visible = False '隐藏Excel窗口 ``` 5. **Calculation** 控制计算模式(手动/自动) ```vba Application.Calculation = xlCalculationManual Range("A1").Formula = "=SUM(B1:B10)" Application.Calculate '手动触发计算 ``` --- #### **常用方法** 1. **Quit** 退出Excel应用程序 ```vba Application.Quit ``` 2. **Run** 执行宏或自定义函数 ```vba Application.Run "MacroName" ``` 3. **InputBox** 显示输入对话框 ```vba Dim userInput As String userInput = Application.InputBox("请输入内容") ``` 4. **OnKey** 定义快捷键绑定操作 ```vba Application.OnKey "^{t}", "TestMacro" 'Ctrl+T触发TestMacro ``` 5. **Intersect/Union** 处理区域交集或联合 ```vba Set rng = Application.Intersect(Range("A1:B10"), Range("B5:C15")) ``` --- #### **特殊功能** - **跨程序控制** 通过CreateObject操作其他Office应用[^2]: ```vba Dim pptApp As Object Set pptApp = CreateObject("PowerPoint.Application") pptApp.Visible = True ``` - **获取系统信息** 使用PathSeparator、OperatingSystem等属性: ```vba MsgBox Application.PathSeparator '返回"\"或":"(Mac) ``` --- #### **事件处理** Application对象支持事件如: - `WorkbookOpen`:打开工作簿时触发 - `SheetActivate`:切换工作表时触发 需在类模块中声明WithEvents变量[^4]: ```vba Public WithEvents App As Application Private Sub App_WorkbookOpen(ByVal Wb As Workbook) MsgBox "已打开:" & Wb.Name End Sub ``` --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值