当前位置: 首页 > news >正文

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

7.3.2 封装和窗体

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

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

varForm1: TForm1;NClicks: Integer;

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

typeTForm1 = class(TForm)publicFNClicks: Integer;end;

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

typeTForm1 = class(TForm)// 这里是组件和事件处理程序publicfunction GetClicks: Integer;privateFNClicks: Integer;end;

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

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

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

这是两种方法的代码:

procedure TForm1.Button1Click(Sender: TObject);
varNewForm: TForm1;
beginNewForm := TForm1.Create(Application);NewForm.Show;
end;procedure TForm1.Button2Click(Sender: TObject);
beginClose;
end;

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

相关文章:

  • PHP7 用 Exception catch不到error,Throwable 才可以
  • 剑指offer经典题目整理(七)
  • Vue3 大量赋值导致reactive响应丢失问题
  • 显卡基础知识及元器件原理分析
  • Linux hdparm命令教程:优化硬盘性能和读写速度(附实例详解和注意事项)
  • Design Script官方案例解析2:程序简写
  • 从后端获取文件数据并导出
  • 应急响应靶机训练-Web3题解
  • 【Frida】10_用鼠标自动标记棋盘上的雷区(一键过关)
  • C/C++炸弹人游戏
  • spring cloud gateway k8s优雅启停
  • (C语言)球球大作战
  • 十、C#基数排序算法
  • 实时数仓之实时数仓架构(Doris)
  • Svg Flow Editor 原生svg流程图编辑器(三)
  • ES6指北【2】—— 箭头函数
  • @angular/forms 源码解析之双向绑定
  • [iOS]Core Data浅析一 -- 启用Core Data
  • “大数据应用场景”之隔壁老王(连载四)
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • HTML5新特性总结
  • JAVA多线程机制解析-volatilesynchronized
  • JDK 6和JDK 7中的substring()方法
  • js递归,无限分级树形折叠菜单
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • js中forEach回调同异步问题
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • spring学习第二天
  • vue2.0项目引入element-ui
  • Webpack 4 学习01(基础配置)
  • 从PHP迁移至Golang - 基础篇
  • 关于使用markdown的方法(引自CSDN教程)
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 开发基于以太坊智能合约的DApp
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 提醒我喝水chrome插件开发指南
  • 微信支付JSAPI,实测!终极方案
  • UI设计初学者应该如何入门?
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 交换综合实验一
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (1)(1.9) MSP (version 4.2)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (推荐)叮当——中文语音对话机器人
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)Sql Server 保留几位小数的两种做法
  • .cfg\.dat\.mak(持续补充)
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET Core 通过 Ef Core 操作 Mysql