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

private
  FControlType: TControlClass;
  FControlNo: Integer;

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

procedure TForm1.RadioButtonRadioChange(Sender: TObject);
begin
  FControlType := 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);
var
   NewCtrl: 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 章中有详细介绍。在同一章中,我们将看到除了类引用外,还有其他方法来引用类型和类信息。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL数据分析常用函数

SQL 中有许多常用的函数,可以用于处理和操作数据。以下是一些常见的SQL 函数: 1. 字符串函数: CONCAT(str1, str2, …): 用于把多个文本字符串合并成一个长字符串(参数中有null时返回null)。 select concat(一起,学, SQL); -- 输出结果:一…

基于朴素贝叶斯算法的微博舆情监控系统,flask后端,可视化丰富

背景: 微博作为中国最大的社交媒体平台之一,汇聚了海量用户生成的文本数据,承载着丰富的社会信息和舆论动向。随着互联网的快速发展,人们对于利用这些数据进行舆情分析和预测的需求日益增加。在这种情况下,以Python为…

汽车电子零部件(14):TMS热管理系统

前言: TMS(thermal management system)热管理系统,这是新能源汽车诞生后随之而产生的一种新汽车零部件,一旦热管理失控会触发自燃,这种现象也是对EV来说是件头疼的事。汽车的热管理系统(TMS)是一个关键部件,有助于调节汽车电池组、车厢和其他车辆系统的温度。TMS的主要…

遇到了导师放养,该怎么坚持?

最近收到学生读者的留言,抱怨科研的困难。导师忙碌且学生众多,自己只是众多学生之一,常常处于放养状态。除了每周的组会外,几乎无法接触到导师。在这种状态下,缺乏方向和动力,非常担心无法顺利毕业&#xf…

navicat连接过的库忘记密码

1、点击文件->导出连接 2、勾选想要知道密码的库 3、打开导出的文件搜索Password 4、复制Password解密 把下面的php代码复制到在线运行php的网站,替换最下面的decrypt(‘B7246A6E64D4F50A563FA20427A47991’)括号里的内容,然后执行php代码&#xff0…

PHP开发入门

PHP官网:PHP: Hypertext Preprocessor apache官网:https://httpd.apache.org/ 一、搭建PHP环境 下载apache 进入官网点击download 选择下载windows版本文件 点击进入下载界面 点击下载64位版本文件 下载后解压文件 解压文件后进入 D:\httpd-2.4.59-24…

高效写代码java-推荐插件1(格式转化 ConverterX )-日后待更新

ConverterX 主要功能:格式转化 字符串格式转换 日期转换 Json格式转义 字符格式 快捷键 ctrl shiftS Upper(CODEEASE)字符串全部变成大写Lower(codeease)字符串全部变成小写Camel(codeEase)字符串变成小驼峰ClassCaemel(CodeEase)字符串变成大驼峰UnderlineUpper(CODE_EAS…

《TCP/IP网络编程》(第十二章)I/O复用(1)

本章将讨论实现并发服务器的第二种办法,基于I/O复用的服务器端构建。 I/O复用它允许单个进程或线程同时处理多个输入/输出(I/O)操作,而无需为每个I/O操作创建一个独立的线程或进程。这种技术可以显著提高应用程序的效率和性能&…

多模态中的模态有哪些

“多模态”这个名字中的“模态”(modality),指的是不同的数据类型或信息源。在多模态大模型中,常见的模态包括: 文本模态: 包括自然语言文本、语音识别文本等。 图像模态: 指图像数据&#xff…

SEO之核心关键词(二)

初创企业或者需要建站的朋友看以下两篇文章,谢谢支持: 我给不会敲代码又想搭建网站的人建议新手上云 (接上一篇。。。。) 4、查询搜索次数 经过自己及朋友、同事的头脑风暴和检查竞争对手网站之后,再到Google 关键词…

力扣232. 用栈实现队列(两栈实现队列)

Problem: 232. 用栈实现队列 文章目录 题目描述思路Code 题目描述 思路 利用两个栈,一个入栈一个出栈搭配着实现队列的相关操作: 1.创建两个栈stack1和stack2; 2.void push(int x):将要入队的元素先入栈stack1; 3.int pop()&…

Vue3中点击关闭按钮后清除 el-table 表单内容

Vue3中点击关闭按钮后清除 el-table 表单内容 一、前言1、关闭事件2、清除函数实现3、具体代码 一、前言 在 Vue 3 中,通过使用 Element UI 的 el-table 组件来展示表格数据是一种常见的做法。有时候,当用户点击关闭按钮后,我们希望能够清除…

寒冬来了,字节跳动开启裁员新模式。。

大家好,我是白露啊。 不得不说,字节跳动还是真的会搞事啊。 最近一段时间,字节搞出了一个裁员新模式:“细水长流”。这个寓意和“财(裁)源(员)广进”计划差不多了,只不…

Docker安装Nginx 并实现通过nginx部署静态网址

Docker镜像就是一个只读的模板,可以用来创建Docker容器。 例如:一个镜像可以包含一个完整的centos操作系统环境,里面仅安装了mysql、nginx等或用户需要的其他应用程序。 Docker提供了一个非常简单的机制来创建镜像或者更新现有的镜像&#…

马斯克的 xAI 帝国!60亿融资背后的超级布局?

在全球科技竞技场,每个重大融资事件都是对行业格局的一次重塑。近日,埃隆马斯克的人工智能初创企业 xAI 成功完成了一轮规模空前的融资——60亿美元,此举无疑在业界投下了一枚震撼弹,标志着 AI 领域内一场新的竞赛拉开了序幕。 …

rk3568_mutex

文章目录 前言1、什么是mutex?1.1mutex互斥体API函数二、实验2.1实验目的2.2源码2.3结果图前言 本文记录的是rk3568开发板基础上做的mutex实验 1、什么是mutex? mutex是互斥体,它是比信号量semaphore更加专业的机制。 在我们编写Linux驱动的时候遇到需要互斥的地方建议使用…

【Unity程序】Unity游戏开发中常用的设计模式【一】

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

安全性基础知识

安全性基础知识 导航 文章目录 安全性基础知识导航一、网络攻击二、两类密码体制-对称密钥密码体制网络安全内容 三、数字签名与信息摘要四、数字信封五、PKI六、防火墙技术七、入侵检测系统八、计算机病毒九、常见的防病毒软件十、网络安全协议 一、网络攻击 二、两类密码体制…

解读makefile中的.PHONY

在 Makefile 中,.PHONY 是一个特殊的目标,用于声明伪目标(phony target)。伪目标是指并不代表实际构建结果的目标,而是用来触发特定动作或命令的标识。通常情况下,.PHONY 会被用来声明一组需要执行的动作&a…

accelerate在pycham中执行的方法

1. 简介 通常情况下我们在pycharm中默认执行python.exe xxx.py,在命令行中执行accelerate xxx.py。 下面介绍如何在pycharm中执行accelerate的方法,主要目的是便于后续的代码调试。 2. 内容 第一步,运行->编辑配置: 第二步…