(delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)

7.3.2 封装和窗体

​ 封装的主要理念之一是减少程序中使用的全局变量的数量。全局变量可以从程序的任何部分访问。因此,全局变量的改变会影响整个程序。另一方面,当你更改类字段的表示方法时,只需要修改该类中引用给定字段的某些方法的代码,而不需要修改其他代码。因此,我们可以说信息隐藏涉及封装更改。

​ 让我用一个实际例子来说明这个观点。当你有一个包含多个窗体的程序时,你可以通过在窗体单元的interface部分将某些数据声明为全局变量,从而使每个窗体都可以使用这些数据:

var
	Form1: TForm1;
	NClicks: Integer;

​ 这种方法可行,但有两个问题。首先,数据(NClicks)不与窗体的特定实例相关联,而是与整个程序关联。如果创建两个相同类型的窗体,它们将共享数据。如果想让同一类型的每个窗体都有自己的数据副本,唯一的解决办法就是将其添加到窗体类中:

type
  TForm1 = class(TForm)
  public
    FNClicks: Integer;
  end;

​ 第二个问题是,如果将数据定义为全局变量或窗体的公共字段,那么将来就无法在不影响使用数据的代码的情况下修改其实现。相反,如果只需从其他窗体读取当前值,则可以将数据声明为私有,并提供一个读取该值的方法:

type
  TForm1 = class(TForm)
    // 这里是组件和事件处理程序
  public
    function GetClicks: Integer;
  private
    FNClicks: Integer;
  end;

更好的解决方案是在窗体中添加一个属性,我们将在第10章中详细介绍。你可以通过打开ClicksCount示例来尝试此代码。简而言之,此项目的窗体有两个按钮和顶部的标签,大部分表面留给用户点击(或轻点)。在这种情况下,计数增加,并更新标签以显示新值:

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
  Inc(FNClicks);
  Label1.Text := FNClicks.ToString;
end;

你可以在图7.1中看到应用程序的运行情况。该项目的窗体还有两个按钮,一个用于创建相同类型的新窗体,另一个用于关闭它(这样你可以将焦点返回到以前的窗体)。

这是两种方法的代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  NewForm: TForm1;
begin
  NewForm := TForm1.Create(Application);
  NewForm.Show;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Close;
end;

图 7.1: ClicksCount 示例的窗体显示了表单上的点击或轻点次数(使用私有窗体数据进行跟踪)

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

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

相关文章

vue3父子通信、跨层通信

子传父 通过 ref标识 获取真实的 dom对象或者组件实例对象 父组件获取子组件内部属性和方法 顶层组件向任意的底层组件传递数据和方法,实现跨层组件通信 非响应式数据父修改不了子的内容 子组件调用父组件方法

若依微服务跑起来-微服务小白入门(1)

背景 若依的基本框架系列,已经构建起来,请参照 小白入门系列 - 鸡毛掸子 这些东西理解,并且实际板砖以后,有必要对现在流行的一些概念做一些升级,现在我们就进入到所谓的cloud版本,其实,前面的…

【C++】多态 (上)

在实际生活中我们也经常见到多态的例子,多态就是不同的对象完成同一个行为时会产生不同的状态,比如成人和儿童购票就是不一样的,多态是可以基于继承的,我们本篇博客的多态就是基于继承的,下面我们先看一个简单例子 cla…

JsonUtility.ToJson 和UnityWebRequest 踩过的坑记录

项目场景: 需求:我在做网络接口链接,使用的unity自带的 UnityWebRequest ,数据传输使用的json,json和自定义数据转化使用的也是unity自带的JsonUtility。使用过程中发现两个bug。 1.安全验证失败。 报错为&#xff1a…

.NET Framework 服务实现监控可观测性最佳实践

环境信息 系统环境:Windows Server开发语言:.NET Framework > 4.6.1APM探针包:ddtrace 准备工作 安装 Datakit 主机部署: 主机安装 - 观测云文档 打开采集 APM 采集器 Windows 主机配置 # 到如下路径,把ddtr…

Spring常用设计模式-实战篇之单例模式

实现案例,饿汉式 Double-Check机制 synchronized锁 /*** 以饿汉式为例* 使用Double-Check保证线程安全*/ public class Singleton {// 使用volatile保证多线程同一属性的可见性和指令重排序private static volatile Singleton instance;public static Singleton …

VUE中添加视频播放功能

转载https://www.cnblogs.com/gg-qq/p/10782848.html 常见错误 vue-video-player下载后‘vue-video-player/src/custom-theme.css‘找不到 解决方法 卸载原来的video-play版本 降低原来的版本 方法一 npm install vue-video-player5.0.1 --save 方法二 或者是在pack.json中直…

huggingface的transformers训练gpt

目录 1.原理 2.安装 3.运行 ​编辑 4.数据集 ​编辑 4.代码 4.1 model init​编辑 forward: 总结: 关于loss和因果语言模型: ​编辑 交叉熵:​编辑 记录一下transformers库训练gpt的过程。 transformers/examples/…

使用 Amazon SageMaker 微调 Llama 2 模型

本篇文章主要介绍如何使用 Amazon SageMaker 进行 Llama 2 模型微调的示例。 这个示例主要包括: Llama 2 总体介绍Llama 2 微调介绍Llama 2 环境设置Llama 2 微调训练 前言 随着生成式 AI 的热度逐渐升高,国内外各种基座大语言竞相出炉,在其基础上衍生出…

MIT的研究人员最近开发了一种名为“FeatUp”的新算法,这一突破性技术为计算机视觉领域带来了高分辨率的洞察力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

vuecli创建vue3项目

第一步: 在文件夹中输入 vue create xxx 第二步: 勾选下面带有*号的,经验最好把Linter/Formatter勾掉,不然会出现eslint报错 第三步: 选择3.x 第四步: 意思为是否用history模式来创建路由&#xff0…

mineadmin前端安装启动

在上一篇文章中, 我们已经搭建好了后端环境并启动 mineadmin 快速安装部署(docker环境) 一、下载前端项目 1、在搭建后端时候,使用php bin/hyperf.php mine:install 的时候,有一个步骤是安装前端项目的。安装目录为&a…

【有源码】buildroot根文件系统编译和常见问题

前言 编译好的含有QT5等工具包的buildroot根文件 仓库:https://gitee.com/wangyoujie11/atkboard_-linux_-driver 编译过程如下 1.下载源码,解压tar -vxjf xxx.tar.bz2 https://buildroot.org/ 这里以如下版本实验 2.在解压之后的buildroot-2019.02.…

智慧公厕的系统构成与功能解析

智慧公厕系统是通过传感器和云平台相结合的创新技术,旨在提供更好的公厕管理与服务。智慧公厕从系统的构成来看,主要分为感知层(数据收集)、传输层(数据传输)、平台层(数据处理)和应…

【vue-小知识】var、let 和 const之间的区别

文章目录 结论1、重复定义变量名var:允许重复定义变量名let和const:不可以重复定义变量名 2、修改值var:允许修改值let:允许修改值const:不允许修改值,会报错 3、变量提升var : 支持变量提升let和const&…

查看VMWare ESXi 6.5/6.7服务器上 GPU直通的状态

VMWare ESXi 6.5/6.7服务器状态 查看配置参数

Google的MELON: 通过未定位图像重建精确3D模型的突破性算法

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

OFC2023活动剪影

马上就要OFC 2024了,应该有些新图可以发一发了 先发点老图,丢在这里,怕下次不知道去哪里找 以上是以太网联盟Ethernet Alliance 在OFC2023上展示的一个演示机柜 以下是我们参与OFC2023的剪影,除了参与EA的演示,还有独…

从错误中进行上下文学习

1、写作动机: 在上下文学习中,也称为少样本提示(ICL),一直是调整LLM适应下游任务的标准方法,通过从少量输入-输出示例中学习。然而,所有基于ICL的方法都只从正确的输入-输出对中学习。 2、主要…

京东云开发者:DDD 学习与感悟 —— 向屎山冲锋

原文地址:https://mp.weixin.qq.com/s/Hvq1ttBopbxypatVcKcLiA 软件系统是通过软件开发来解决某一个业务领域或问题单元而产生的一个交付物。而通过软件设计可以帮助我们开发出更加健壮的软件系统。因此,软件设计是从业务领域到软件开发之间的桥梁。而DDD是软件设计…