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

news/2024/7/20 17:23:51/文章来源:https://blog.csdn.net/langfengyl/article/details/139073983
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.luyixian.cn/news_show_1052168.aspx

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

相关文章

BEVFormer论文详细解读

文章目录 1. 前言1.1 3D VS 4D1.2 .特征融合过程中可能遇到的问题1.3 .BEV提出背景1.4 .BEV最终得到了什么1.5 .输入数据格式 2. 背景/Motivation2.1 为什么视觉感知要用BEV?2.2 生成BEV视角的方法有哪些?为何选用Transformer呢? 3. Method/S…

【Typescript】通过变量的值即可获取变量的类型【typeof 变量】

注意:只要变量的类型准确,则typeof获取变量的类型就不会错 enum Test {a "a0",b "b0" }// 这里的a是一个变量的值 let a: Test.a "a0" as Test.a// 这里的typeof a是一个类型【Test.a】 let x: typeof a Test.a

基于Cortex的MCU设计

基于Cortex的MCU设计 今日更新的存货文档,发现日更文章还是很花时间的。保证一周更新三篇文章就行啦,本篇文章的内容起始主要取自于《Cortex-M3 权威指南》和知网下载的论文。写的不详细,想进一步了解的就去看这篇文档或网上找别的资料&#…

3.5 四个子空间的维度

一、概述 这一节的主要定理是将秩与维度联系在一起。矩阵的秩就是主元的个数,子空间的维度是基向量的个数,我们计算出这两个数就可以得到秩与维度。 A A A 的秩揭露了四个基本子空间的维度。 四个子空间中,两个子空间来自 A A A&#xff0c…

C++ 函数模板与模板函数

一 代码重用技术 函数 类与对象 继承与派生 多态(函数重载、运算符重载、虚函数、纯虚函数与抽象类) 泛型程序设计 通用的代码需要补受数据类型的影响,并且可以自动适应数据类型的变化,这种程序设计类型称为泛型程序设计。 二 模…

雷军-2022.8小米创业思考-9-爆品模式:产品力超群,具有一流口碑,最终实现海量长销的产品。人人都向往;做减法;重组创新;小白模式

第九章 爆品模式 小米方法论的第三个关键词,就是一切以产品为出发点,打造爆品模式。 大多数人对“爆品”的着眼点仅在于“爆”,也就是产品卖得好。希望产品大卖这没有错,但是“爆”是“品”的结果,爆品是打造出来的&…

服务器软件架构演进

服务器软件架构演进 背景介绍阶段一:单机部署阶段二:应用与数据分离部署阶段三:启用缓存优化阶段四:启用应用服务器集群阶段五:数据库读写分离阶段六:启用反向代理及CDN加速阶段七:启用分布式文…

探索亚马逊云科技技术课程:大模型平台与提示工程的应用与优化

上方图片源自亚马逊云科技【生成式 AI 精英速成计划】技术开发技能课程 前言 学习了亚马逊云科技–技术开发技能课程 本课程分为三个部分,了解如何使用大模型平台、如何训练与部署大模型及生成式AI产品应用与开发,了解各类服务的优势、功能、典型使用案…

【简单介绍下容器是什么?】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

专为汽车内容打造的智能剪辑解决方案

汽车内容创作已成为越来越多车主和汽车爱好者热衷的活动。然而,如何高效、便捷地将行车途中的精彩瞬间转化为高质量的视频作品,一直是困扰着广大用户的一大难题。美摄科技凭借其深厚的视频处理技术和智能分析能力,推出了专为汽车内容记录而生…

斯洛文尼亚普利雅玛城堡:吉尼斯世界纪录认证的世界最大溶洞城堡

除了著名的波斯托伊纳溶洞(Postojna Cave),普利雅玛城堡(Predjama Castle)也是波斯托伊纳洞穴公园(Postojna Cave Park)不容错过的景点之一。这座城堡坐落在斯洛文尼亚(Slovenia&…

Java入门基础学习笔记47——ArrayList

什么是集合呢? 集合是一种容器,用来装数据的,类似数组。 有数组,为什么还要学习集合呢? 数组定义完成并启动后,长度就固定了。 而集合是大小可变,开发中用的最多的。 集合的特点:大…

基于docxtpl的模板生成Word

docxtpl是一个用于生成Microsoft Word文档的模板引擎库。它结合了docx模块和Jinja2模板引擎,使用户能够使用Microsoft Word模板文件并在其中填充动态数据。这个库提供了一种方便的方式来生成个性化的Word文档,并支持条件语句、循环语句和变量等控制结构&…

从零开始构建 Vision Transformer(ViT) 模型

Transformer 模型最早由 Vaswani 等人在 2017 年论文 Attention Is All You Need 中提出,并已广泛应用于自然语言处理。 2021年,Dosovitsky 等人在论文An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale中提出将 Transforme…

PyQt5-新手避坑指南(持续更新)

文章目录 一.前言二.开发环境三.坑1.程序没有详细报错就退出了2.qrc资源文件的使用3.QLabel文字自动换行4.图片自适应大小5.checkbox自定义样式后✓不见了6.多线程 四.记录 一.前言 本篇博客整理了一些初学者容易犯的…

211大学计算机专业不考408,新增的交叉专业却考408!南京农业大学计算机考研考情分析!

南京农业大学信息科技学院可追溯至1981年成立的计算中心和1985年筹建的农业图书情报专业。1987年设立了农业图书情报系,1993 年农业图书情报系更名为信息管理系,本科专业名称也于1999年更名为信息管理与信息系统专业。1994年计算中心开始招收计算机应用专…

YOLOv10来了

B站:啥都会一点的研究生公众号:啥都会一点的研究生 前言 YOLOv10 由清华大学研究人员在 Ultralytics版基础上进行进一步开发,引入了一种新的实时目标检测方法,解决了以前版本 YOLO 在后处理和模型架构方面的不足。通过消除非最大…

英码科技算能系列边缘计算盒子再添新成员!搭载TPU处理器BM1688CV186AH,功耗更低、接口更丰富

在数据呈现指数级增长的今天,越来越多的领域和细分场景对实时、高效的数据处理和分析的需求日益增长,对智能算力的需求也不断增强。为应对新的市场趋势,英码科技凭借自身的硬件研发优势,携手算能相继推出了基于BM1684的边缘计算盒…

探索循环逻辑:for逻辑分支与容器遍历的深度剖析

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言:for逻辑与循环体的奥秘 二、for逻辑与循环体的结合使用 1. 函数与循环…

数字水印 | 离散余弦变换 DCT 基本原理及 Python 代码实现

目录 1 基本原理2 代码实现3 图像压缩 1 基本原理 参考博客:https://www.cnblogs.com/zxporz/p/16072580.html D C T \mathsf{DCT} DCT 全称为 D i s c r e t e C o s i n e T r a n s f o r m \mathsf{Discrete\ Cosine\ Transform} Discrete Cosine Transfo…