(delphi11最新学习资料) Object Pascal 学习笔记---第12章第3节 ( RTL 中的类引用 )

12.3.1 RTL 中的类引用**

System 单元和其他核心 RTL 单元声明了许多类引用,包括以下几种:

TClass = class of TObject;
ExceptClass = class of Exception;
TComponentClass = class of TComponent;
TControlClass = class of TControl;
TFormClass = class of TForm;

​ 特别是 TClass 类引用类型可用于存储对 Object Pascal 中编写的任何类的引用,因为每个类最终都是从 TObject 派生的。相反,TFormClass 引用则在基于 FireMonkey 或 VCL 的默认 Object Pascal 项目的源代码中使用。实际上,这两个库的 Application 对象的 CreateForm 方法作为参数需要要创建的窗体的类:

Application.CreateForm(TMyForm1, MyForm);

​ 第一个参数是一个类引用,第二个是将接收对创建的对象实例的引用的变量。

12.3.2 使用类引用创建组件

​ 在 Object Pascal 中,类引用有什么实际用途呢?能够在运行时使用数据类型是运行环境的基本能力。当你从Component Palette(组件面板)中选择一个新组件添加到窗体中时,你就选择了一种数据类型并创建了该数据类型的对象。(实际上,这就是开发环境在幕后为你做的事情)。

​ 为了让你更好地了解类引用是如何工作的,我创建了一个名为 ClassRef 的示例。这个示例显示的窗体非常简单。窗体的上半部分的面板中放置了三个单选按钮。当你选择其中一个单选按钮并单击窗体时,就可以创建按钮标签所示的三种类型的新组件:单选按钮、普通按钮和编辑框。要使程序正常运行,需要更改这三个组件的名称,因为组件名称必须是唯一的。窗体还必须有一个类引用字段:

privateFControlType: TControlClass;FControlNo: Integer;

​ 每当用户点击三个单选按钮中的一个,第一个字段就会存储一个新的数据类型,从而改变其状态。以下是三种方法之一:

procedure TForm1.RadioButtonRadioChange(Sender: TObject);
beginFControlType := TRadioButton;
end;

​ 其他两个单选按钮的 OnChange 事件处理器与此类似,都将 TEdit 或 TButton 的值赋值给 FControlType 字段。类似的赋值也出现在窗体的 OnCreate 事件处理器中,用作初始化方法。当用户点击覆盖窗体大部分表面的 TLayout 控件时,代码中有趣的部分就会被执行。我选择了窗体的 OnMouseDown 事件来保持鼠标点击的位置:

// 另外两个单选按钮有类似于这个的 OnChange 事件处理程序,将值 TEdit 或 TButton 分配给 FControlType 字段。一个类似的赋值也出现在表单的 OnCreate 事件处理程序中,用作初始化方法。代码的有趣部分是在用户点击覆盖整个表单表面的 TLayout 控件时执行的。我选择使用表单的 OnMouseDown 事件来保存鼠标点击的位置:
procedure TForm1.Layout1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
varNewCtrl: TControl;NewName: string;
begin// 创建控件NewCtrl := FControlType.Create(Self);// 暂时隐藏它,以避免闪烁NewCtrl.Visible := False;// 设置父级和位置NewCtrl.Parent := Layout1;NewCtrl.Position.X := X;NewCtrl.Position.Y := Y;// 计算唯一的名称(和文本)Inc(FControlNo);NewName := FControlType.ClassName + FControlNo.ToString; Delete(NewName, 1, 1);NewCtrl.Name := NewName;// 现在显示它NewCtrl.Visible := True;
end;

​ 该方法的第一行代码是关键。它将创建一个存储在 FControlType 字段中的类数据类型的新对象。我们只需将 Create 构造函数应用于类引用即可实现这一目的。

​ 现在,您可以设置父属性的值、设置新组件的位置、为其命名(名字会自动用作文本)并使其可见。

​ 请特别注意用来创建名称的代码:为了模仿 Object Pascal 的默认命名约定,我通过表达式 FControlType.ClassName 获取了类的名称,这是TObject 类的类方法。然后,我在名称末尾添加了一个数字,并删除了字符串的首字母。

​ 对于第一个单选按钮,假设 FControlNo 是 1,那么 FControlType 就是 TRadioButton;因此,FControlType.ClassName 返回字符串 “TRadioButton”,FControlNo.AsString 返回 “1”,我们在复制字符串减去第一个字符(即减去字符串开头的 “T”)之前将 "1 "追加到字符串末尾,从而得到新实例使用的最终字符串 “RadioButton1”。看起来熟悉吗?

图 12.1:在 Window 下运行 ClassRef 应用程序的输出示例

​ 图 12.1 是该程序的输出示例。请注意,该程序的命名与集成开发环境的命名并不完全相同,集成开发环境会为每种类型的控件使用单独的计数器。

​ 该程序对所有组件都使用一个计数器。因此,在运行 ClassRef 应用程序时,如果先放置一个按钮,然后是一个单选按钮,接着是两个编辑按钮,然后是另一个按钮,它们的名称将是 Button1、RadioButton2、Edit3、Edit4、Button5,如图所示。

​ 请注意,与设计器不同,创建的编辑控件名称不可见。

​ 顺便提一下,一旦创建了通用组件,就可以使用反射以非常动态的方式访问其属性,这在第 16 章中有详细介绍。在同一章中,我们将看到除了类引用外,还有其他方法来引用类型和类信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/13700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx企业级负载均衡:技术详解系列(9)—— Nginx核心配置详解(全局配置)

你好,我是赵兴晨,97年文科程序员。‍‍‍‍‍ 在 Nginx企业级负载均衡:技术详解系列(8)—— Nginx核心配置详解(默认配置文件)文章中,咱们讨论了Nginx核心配置文件的基础知识&#…

【Python设计模式11】建造者模式

建造者模式(Builder Pattern)是一种创建型设计模式,它将一个复杂对象的构建过程分离出来,使得同样的构建过程可以创建不同的表示。建造者模式通过使用多个简单的对象一步一步构建成一个复杂的对象。 建造者模式的结构 建造者模式…

centos9 stream在线安装NVIDIA驱动(rockylinux9.4也成功安装nvidia驱动)

Install NVIDIA Drivers on CentOS Stream 9(rockylinux9.4成功) 主板为技嘉mz72-hb2 显卡为4090 一.Disable Secure Boot From the BIOS 二.Enabling the EPEL Repository on CentOS Stream 9 1.update the DNF package repository cache sudo dnf …

STM32控制HC-SR04超声模块获取距离

欢迎入群共同学习交流 时间记录:2024/5/23 一、模块介绍 (1)引脚介绍 VCC:电源引脚,接单片机3.3/5V GND:电源地 Trig:超声信号触发引脚 Echo:超声信号接收引脚 (2&…

java.util.Arrays 详解

排序 sort(int[] a): 对指定 int 型数组按数字升序进行排序。sort(Object[] a): 对指定对象数组进行排序&#xff08;对象的类必须实现 Comparable 接口&#xff09;。sort(T[] a, Comparator<? super T> c): 使用指定的比较器对数组进行排序。sort(int[] a, int fromI…

给你一把接口响应断言神器,你要不要?

JSON Schema是用来标记和校验JSON数据&#xff0c;类似于XMLSchema,可用在自动化测试验证JSON数据。 官网&#xff1a;http://json-schema.org/ 最常用版本&#xff1a;draft 04。&#xff08;目前各类编程语言对draft 04支持最广泛&#xff09; 举个例子 假如你有一个接口…

202473读书笔记|《但愿呼我的名为旅人:松尾芭蕉俳句300》——围炉夜话,身顿心安,愿每个人都能在爱里自由驰骋

202473读书笔记|《但愿呼我的名为旅人&#xff1a;松尾芭蕉俳句300》——围炉夜话&#xff0c;身顿心安&#xff0c;愿每个人都能在爱里自由驰骋 &#x1f60d;&#x1f60d;&#x1f929;&#x1f929; 译者序正文二正文三正文四正文五正文六正文七 《但愿呼我的名为旅人&…

Lua中table.sort()使用方式

table.sort(tab,compare) 参数如下&#xff1a; tab:表名 compare:比较规则函数名 简略写法&#xff1a; a {1,2,3} table.sort(a,function(a,b) return a>b end) compare这个参数是一个函数&#xff0c;它有两个参数&#xff0c;你可以理解为表中的两个不同元素&…

智能进化:让AI大模型变得更聪明的路径探索

前言 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;大模型在多个领域展现出了前所未有的能力。然而&#xff0c;它们仍然面临着理解力、泛化能力和适应性等方面的挑战。如何让大模型变得更聪明&#xff0c;是当前AI研究和应用的一个重要课题。本文将探讨…

解除网页禁止选择

控制台输入以下命令 复制&#xff1a;javascript:void(document.body.οncοpy) 可选&#xff1a;javascript:void(document.body.onselectstart) 拖拉&#xff1a;javascript:void(document.body.οnmοuseup)

C++实现基于http协议的epoll非阻塞模型的web服务器框架(支持访问服务器目录下文件的解析)

使用方法&#xff1a; 编译 例子&#xff1a;./httpserver 9999 ../ htmltest/ 可执行文件 端口 要访问的目录下的 例子&#xff1a;http://192.168.88.130:9999/luffy.html 前提概要 http协议 &#xff1a;应用层协议&#xff0c;用于网络通信&#xff0c;封装要传输的数据&…

npm install [Error]

npm install 依赖的时候报错 依赖版本问题的冲突&#xff0c;忽视即可 使用 npm install --legacy-peer-deps

剪画小程序:3个分离人声提取小技巧,赶紧收藏起来吧!

Hello&#xff01;大家好呀&#xff01;这里是社会主义搬砖人小画&#xff01; 人声分离&#xff0c;是指将混合在一起的人声和其他声音&#xff08;如背景音乐、环境噪音等&#xff09;分离开来&#xff0c;提取出单独的人声部分的过程。 在实际应用中&#xff0c;人声分离技…

leetcode654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索

654.最大二叉树 构造树一般采用的是前序遍历&#xff0c;因为先构造中间节点&#xff0c;然后递归构造左子树和右子树 确定递归函数的参数和返回值 参数传入的是存放元素的数组&#xff0c;返回该数组构造的二叉树的头结点&#xff0c;返回类型是指向节点的指针。 TreeNode…

Unity 开发Hololens,制作面板跟随眼镜一起移动,(面板跟踪)

Hololens滑动框以及面板跟踪 创建空物体&#xff0c;并添加组件 SolverHandler、RedialView、FollowMeToggle 创建按钮&#xff0c;控制停止/开始跟踪 创建一个Hololens自带的按钮放到右上角&#xff0c;并添加事件 创建蓝色背景板 创建空物体Backplate&#xff0c;下面再…

个体因果效应估计|EDVAE:用于个体治疗效果估计的反事实推理中的解开潜在因素模型

【摘要】根据观察数据估计个体治疗效果&#xff08;ITE&#xff09;是一项至关重要但具有挑战性的任务。解缠结表示已用于将代理变量分为混杂变量、工具变量和调整变量。然而&#xff0c;根据观测数据准确地进行反事实推理来识别 ITE 仍然是一个悬而未决的问题。在本文中&#…

AppInventor2要在界面上做一个电量图标,有什么好的思路吗?

问&#xff1a;要在界面上做一个电量图标&#xff0c;有什么好的思路吗&#xff1f; 答&#xff1a;首先&#xff0c;很容易想到使用进度条相关的组件&#xff0c;原生”滑动条“组件可以吗&#xff1f; 答案显而易见&#xff0c;首先它的样式自定义不够&#xff0c;UI不外乎上…

STM32_ADC

1、ADC简介 ADC&#xff0c;即Analog-Digital Converter&#xff0c;模拟-数字转换器。 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁。 12位逐次逼近型ADC&#xff0c;1us转换时间。 输入电压范围&#xff1a;0~3.3…

P6【力扣144,94,145】【数据结构】【二叉树遍历】C++版

【144】二叉树的前序遍历 1、递归法&#xff1a; class Solution { public:void preorder(TreeNode* root, vector<int> &res){if(root nullptr){return;}res.push_back(root->val);preorder(root->left, res);preorder(root->right, res);}vector<in…

没有密码如何卸载卡巴斯基?

如果忘记卡巴斯基6.0的保护密码&#xff0c; &#xff08;1&#xff09;进入安全模式下 &#xff08;2&#xff09;打开6.0的安装目录 Kaspersky Anti-Virus 6.0: C://Program Files//Kaspersky Lab//Kaspersky Anti-Virus 6.0 &#xff08;3&#xff09;将目录中的avp.exe改…