(delphi11最新学习资料) Object Pascal 学习笔记---第10章第1节(为窗体添加属性)

10.1.4 为窗体添加属性

​ 让我们来看一个使用属性进行封装的具体示例。这一次,我不打算创建一个自定义类,而是要修改IDE为你创建的可视窗体生成的窗体类;同时,我还将充分利用类完成功能。

​ 当一个应用程序包含多个窗体时,通常希望能够从一个窗体中访问另一个窗体的信息。你可能会考虑添加一个公共字段,但这通常是一个不好的主意。每当你想要让某个窗体的信息对其他窗体可用时,最好使用属性。

​ 只需在窗体类的声明中编写属性的名称和类型:

property Clicks: Integer;

​ 然后按下Ctrl+Shift+C激活IDE的代码自动完成功能,你将看到以下效果:

typeTFormProp = class(TForm)privateFClicks: Integer;procedure SetClicks(const Value: Integer);publicproperty Clicks: Integer read FClicks write SetClicks;end;implementationprocedure TForm1.SetClicks(const Value: Integer);
beginFClicks := Value;
end;

​ 毫无疑问,这样可以节省很多击键的工作。现在,当用户单击窗体时,你可以通过编写以下代码来增加点击计数,就像我在FormProperties示例的窗体的OnMouseDown事件中所做的那样:

Clicks := Clicks + 1;

​ 你可能会想,直接增加FClicks怎么样?嗯,在这种特定情况下可能会起作用,但你也可以使用SetClicks方法来更新用户界面并实际显示当前值。如果绕过属性直接访问字段,用于更新用户界面的setter方法中的附加代码将不会执行,显示可能会不同步。

​ 这种封装的另一个优势是,你可以从另一个窗体中以一种恰当的抽象方式引用点击次数。实际上,窗体类中的属性除了可以用于访问自定义值,还可以用于封装对窗体组件的访问。例如,如果你有一个窗体包含一个用于显示某些信息的标签,并且你希望从其他窗体修改这个标签的文本,你可能会倾向于编写:

Form1.StatusLabel.Text := 'new text';

​ 这是一个常见的做法,但不是一个好的做法,因为它不提供对窗体结构或组件的任何封装。如果你在应用程序的许多地方都有类似的代码,然后稍后决定修改窗体的用户界面(也许你希望每次更新标签时都发生一些事情),那么你将不得不在许多地方修复代码。

​ 另一个选择是使用方法,而更好的选择是使用属性来隐藏特定的控件,如下所示:

property StatusText: string read GetStatusText write SetStatusText;

​ 如果你创建了上面的代码行,然后再次按下Ctrl+Shift+C组合键,编辑器将添加两个用于读取和写入属性的方法的定义:

function TFormProp.GetStatusText: string;
beginResult := LabelStatus.Text
end;procedure TFormProp.SetStatusText(const Value: string);
beginLabelStatus.Text := Value;
end;

​ 请注意,在这种情况下,属性不是映射到类的本地字段,而是映射到窗体子对象的字段,即Label的字段(如果你使用自动代码生成,请记住要实际删除编辑器可能已经为你添加的FStatusText属性)。

​ 在程序的其他窗体中,你可以简单地引用窗体的StatusText属性,如果用户界面发生变化,只有属性的Set和Get方法的实现会受到影响。即使在窗体的其他方法中,通常也应使用属性而不是访问底层实现:

procedure TFormProp.SetClicks(const Value: Integer);
beginFClicks := Value;StatusText := FClicks.ToString + ' clicks';
end;

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

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

相关文章

【python】启动一个公司级项目的完整报错和解决方案

启动一个项目对于新手都是不容易的事情 操作 打开项目 使用pyCharm打开python项目以后,先找main方法,一般在根目录有一个.py的文件 点进去以后会让你配置Python解释器 每个项目都有自己的一个虚拟环境,配置自己的解释器,可能…

windows驱动开发-设备栈

设备栈是windows内核中非常重要的部分,这部分理解可以让我们在调试中节省大量的时间, 在windows NT体系中,内核所有的设备被按照连接次序加载到设备树上,这棵树的根节点是ROOT节点,每一个设备可以从当前路径一直遍历到…

QMT和Ptrade有什么区别?该如何选择?

QMT(Quantitative Model Trading)和Ptrade(Professional Trading)是两种不同的交易策略和方法,它们在金融市场中被广泛应用。了解它们的区别有助于投资者根据自己的需求和目标做出选择: QMT(量…

将记录从excel当中导出为.sql文件,再新增到数据库

一、背景 临时遇到了一个需求,比如根据人员的名字查询对应记录,看起来还是很简单的,直接用select查询就可以,然而如果此时存在以下情况: 数据库根本就没有人员信息表;------这个倒是好操作;现…

AlDente Pro for mac最新激活版:电池长续航软件

AlDente Pro是一款专为Mac用户设计的电池管理工具,旨在提供电池安全和健康管理的一站式解决方案。它具备实时监控电池状态的功能,让用户随时了解电池的电量、充电次数、健康状态等信息。 AlDente Pro for mac最新激活版下载 同时,AlDente Pro…

Centos7 的 Open Stack T 版搭建流程 --- (四)配置 Memcached 和 RTCD

文章目录 配置 Memcached(1)安装 Memcached 服务器和 Python 的 Memcached 客户端controller (2)配置 Memcached 配置文件 六、配置 ETCD 服务(搭建 T 版平台没有用上,可以跳过)(1&a…

分类预测 | Matlab实现CNN-LSTM-SAM-Attention卷积长短期记忆神经网络融合空间注意力机制的数据分类预测

分类预测 | Matlab实现CNN-LSTM-SAM-Attention卷积长短期记忆神经网络融合空间注意力机制的数据分类预测 目录 分类预测 | Matlab实现CNN-LSTM-SAM-Attention卷积长短期记忆神经网络融合空间注意力机制的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Mat…

Vue3 + Js + Element-Plus + VueX后台管理系统通用解决方案

前言 本文是作为学习总结而写的一篇文章,也是方便以后有相关需求,可以直接拿来用,也算是记录吧,文中有一些文件的引入,没给出来,完整项目地址(后续代码仓库放这里) 1、layout解决方…

【Python性能优化】list、array与set

list、array与set 详述测试代码 详述 本文对比 list 与 set 在插入和取值时的性能差异,以提供一条什么时候该选择什么数据类型的建议。先上结果: array 与 list 的不同: 内存方面 array 是 C array 的包装,它直接存储数据&#xf…

【002_音频开发_基础篇_Linux音频架构简介】

002_音频开发_基础篇_Linux音频架构简介 文章目录 002_音频开发_基础篇_Linux音频架构简介创作背景Linux 音频架构ALSA 简介ASoC 驱动硬件架构软件架构MachinePlatformCodec ASoC 驱动 PCMALSA设备文件结构 ALSA 使用常用概念alsa-libALSA Open 流程ALSA Write 流程2种写入方法…

Eclipse+Java+Swing实现学生信息管理系统-TXT存储信息

一、系统介绍 1.开发环境 操作系统:Win10 开发工具 :Eclipse2021 JDK版本:jdk1.8 存储方式:Txt文件存储 2.技术选型 JavaSwingTxt 3.功能模块 4.工程结构 5.系统功能 1.系统登录 管理员可以登录系统。 2.教师-查看学生…

打破国外垄断|暴雨发布纯血国产电脑

要说现在国产手机这边已然进入纯自研模式,但电脑这边却还是仍未打破国外技术垄断。但就在刚刚,暴雨发布自研架构台式机open Station X ,这是纯血鸿蒙系统之后国产又一款纯血产品发布!标志的我们已经彻底打破西方在硬件及软件方面的…

c++ - 空间申请和释放 new/delete

文章目录 一、c/c内存分布二、new/delete 的使用三、malloc/free 和 new/delete 的对比四、new/delete 的实现原理五、匹配问题 一、c/c内存分布 求下面各个变量的位置 // c/c内存分布int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar …

PyTorch与深度学习:探索现代神经网络的魅力

在科技飞速发展的今天,深度学习作为人工智能领域的重要分支,已经在图像识别、自然语言处理、语音识别等多个领域取得了突破性的进展。而PyTorch,作为一款开源的深度学习框架,以其简洁易用、动态计算图等特性,赢得了广大…

2024年3月青少年软件编程(Python) 等级考试试卷(一级)

2024.3 青少年软件编程(Python) 等级考试试卷(一级) 一、 单选题(共 25 题, 共 50 分) 1.下列哪个命令, 可以将 2024 转换成 2024 呢? ( ) A.str(2024) B.int(2024) C.fl…

Django中间件的源码解析流程(上)——中间件载入的前置

目录 1. ​前言​ 2. 请求的入口 3. 中间件加载的入口 4. 源码中的闭包实现 5. 最后 1. 前言 哈喽,大家好,我是小K,今天咋们分享的内容是:在学会Django中间件之后, 我们继续深入底层源码。 在执行中间件时请求到来总是从前往后…

ChatGPT研究论文提示词集合3-【数据收集】、【数据分析】和【解释与讨论】

点击下方▼▼▼▼链接直达AIPaperPass ! AIPaperPass - AI论文写作指导平台 目录 1.数据收集 2.数据分析 3.讨论与解释 4.书籍介绍 AIPaperPass智能论文写作平台 近期小编按照学术论文的流程,精心准备一套学术研究各个流程的提示词集合。总共14个步…

【IDEA】用idea导入eclipse的项目后,提示:The file was loaded in a wrong encoding ‘utf-8‘

前言 最近用IDEA导入一个exlipse项目后,窗口出现这个红色提示: 可以项目中的中文,包括注释都是乱码,要解决问题就跟我开始做吧。 一定要看仔细在操作! 一定要看仔细在操作! 一定要看仔细在操作&#xf…

for循环的用法

for循环的用法 for 循环是一种在 Python 中用于迭代序列(如列表、元组或字符串)或其他可迭代对象的循环结构。下面是一些常见的 for 循环用法: 遍历列表:使用 for 循环遍历列表中的元素。 fruits ["apple", "b…

rmallox勒索病毒威胁网络安全:如何避免数据被锁定

尊敬的读者: 随着信息技术的飞速发展,网络空间的安全问题日益凸显。近年来,一种名为.rmallox的勒索病毒频繁出没,给广大计算机用户带来了严重的困扰。本文将对该病毒进行深入剖析,并探讨相应的应对策略。在面对被勒索…