(delphi11最新学习资料) Object Pascal 学习笔记---第7章第5节(完整的TDate类)

7.5.3 完整的TDate类

​ 在本章中,我向您展示了TDate类不同版本的源代码的片段。第一个版本基于三个整数来存储年份、月份和日期;第二个版本使用RTL提供的TDateTime类型的字段。以下是定义TDate类的单元的完整接口部分:

unit Dates;
interface
typeTDate = classprivateFDate: TDateTime;publicconstructor Create; overload;constructor Create(Month, Day, Year: Integer); overload;procedure SetValue(Month, Day, Year: Integer); overload;procedure SetValue(NewDate: TDateTime); overload;function LeapYear: Boolean;procedure Increase(NumberOfDays: Integer = 1);procedure Decrease(NumberOfDays: Integer = 1);function GetText: string;end;

新方法Increase和Decrease(它们都为其参数设置了默认值)的目的非常容易理解。如果没有参数调用它们,它们将更改日期的值为下一天或前一天。如果NumberOfDays参数是调用的一部分,调用将加上或减去该数字:

procedure TDate.Increase(NumberOfDays: Integer = 1);
beginFDate := FDate + NumberOfDays;
end;

GetText方法使用DateToStr函数进行转换,返回带有格式化日期的字符串:

function TDate.GetText: string;
beginGetText := DateToStr(FDate);
end;

​ 我们已经在前面的章节中看到了大部分的方法,所以我就不提供完整的列表了;你可以在我为测试该类而编写的 ViewDate 示例的代码中找到。这个窗体比书中的其他窗体要复杂一些,它有一个显示日期的标题和六个按钮,可以用来修改对象的值。 你可以在图 7.3 中看到 ViewDate 示例运行时的主窗体。为了让标签组件看起来更美观,我给了它一个大字体,让它和窗体一样宽,将其对齐属性设置为 taCenter,并将其 AutoSize 属性设置为 False

图 7.3:ViewDate 应用程序启动时的输出结果

​ 该程序的启动代码位于窗体的 OnCreate 事件处理程序中。在相应的方法中,我们创建一个 TDate 类的实例,初始化该对象,然后在标签的文本中显示其文字说明,如图 7.3 所示。

procedure TDateForm.FormCreate(Sender: TObject);
beginADay := TDate.Create;LabelDate.Text := ADay.GetText;
end;

​ ADay是该窗体类TDateForm的一个私有字段。顺便说一下,当您更改窗体的Name属性为DateForm时,开发环境会自动选择类的名称。具体的Date对象在窗体创建时创建(建立了我们之前看到的在person类和Date子对象之间相同的关系),然后随着窗体一起被销毁。

procedure TDateForm.FormDestroy(Sender: TObject);
beginADay.Free;
end;

​ 当用户点击六个按钮中的一个时,我们需要对 ADay 对象应用相应的方法,然后在标签中显示日期的新值:

procedure TDateForm.BtnTodayClick(Sender: TObject);
beginADay.SetValue(Today);LabelDate.Text := ADay.GetText;
end;

编写上述方法的另一种方式是销毁当前对象并创建一个新对象:

procedure TDateForm.BtnTodayClick(Sender: TObject);
beginADay.Free;ADay := TDate.Create;LabelDate.Text := ADay.GetText;
end;

​ 在这种特殊情况下,创建一个新对象并销毁现有对象并不是最好的方法,因为当我们只需要更改对象的值时,这样做会产生大量的开销。不过,它允许我演示一些 Object Pascal 技术。 首先要注意的是,在赋值新对象之前,我们要先销毁前一个对象。事实上,赋值操作会替换引用,将对象留在内存中(即使没有指针引用它)。当你将一个对象赋值给另一个对象时,编译器会简单地将内存中的对象引用复制到新的对象引用中。

​ 一个附带问题是如何将数据从一个对象复制到另一个对象。这种情况非常简单,因为只有一个字段和一个初始化方法。一般来说,如果要更改现有对象内部的数据,就必须复制每个字段,或者提供一个特定的方法来复制所有内部数据。有些类有一个 Assign 方法,可以执行深度复制操作。

注解:更准确地说,在运行时库中,所有继承自TPersisent的类都有Assign方法。然而,大多数继承自TComponent的类都没有实现它,所以在调用它时会引发异常。原因在于运行时库支持的流机制和对TPersisent类型属性的支持。不过,这一点过于复杂,本书目前还无法深入探讨。

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

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

相关文章

零基础入门多媒体音频(5)-alsa(1)

alsa是音频最重要的框架,没有之一。接下来一个月时间在总结工作知识的主线上。单开个音频支线讲解alsa。说实话,alsa这块我也不是很精通。只在过去的项目中增加 一路substream实现低延时。我打算从下面四个方面去学习alsa。 1.alsa官网。网址如下&#x…

汉明校验·简明教程

汉明校验 一、简介 汉明码是由 Richard Hanming 于 1950 年提出的,它具有一位纠错能力。 新增的汉明码校验位数应满足如下关系: 2 k ⩾ n k 1 2^{k}\geqslant nk1 2k⩾nk1,其中k为校验位位数,n位数据位数。 二、汉明码生成 确…

Python学习从0到1 day18 Python可视化基础综合案例 3.动态柱状图

夜色难免黑凉,前行必有曙光。 —— 24.3.25 目录: 01.基础柱状图 02.基础时间线柱状图 03.GDP动态柱状图绘制 一、基础柱状图构建 掌握构建一个基础的柱状图并能够反转x和y轴 1.通过Bar功能构建基础柱状图 基础柱状图的开发 # 导包 Bar包,生…

吴恩达2022机器学习专项课程(一) 第一周课程实验:成本函数(Lab_04)

问题预览 1.实验目的是什么? 2.一元线性回归的一元是什么意思? 3.如何实现一元线性回归的成本函数? 4.b确定,w和成本函数走势的关系是? 5.w,b和等高线图的关系是? 6.什么情况下,可以…

linux查看本机开放哪些端口,以及某个端口是否开放

一、查看Linux系统上已经打开的端口 netstat -tuln二、查看某个端口是否开放 以3306端口为例: 1、nestat sudo netstat -tuln | grep 3306这条命令将列出当前正在运行的网络服务,并筛选出端口号为3306的服务。如果3306端口处于开放状态,则…

反相器的工艺结构原理及选型参数总结

🏡《总目录》 目录 1,概述2,工作原理3,结构特点3.1,输入与输出电平相反3.2,增益小于13.3,输入阻抗高,输出阻抗低4,工艺流程4.1,硅晶圆准备4.2,电路设计4.3,光刻图形定义4.4,离子注入4.5,沉积4.6

javaWeb个人日记(博客)管理系统

一、简介 在快节奏的生活中,记录生活点滴、感悟和思考是一种重要的方式。基于此,我设计了一个基于JavaWeb的个人日记本系统,旨在帮助用户轻松记录并管理自己的日记。该系统包括登录、首页、日记列表、写日记、日记分类管理和个人中心等功能&…

动态多态的注意事项

大家好: 衷心希望各位点赞。 您的问题请留在评论区,我会及时回答。 多态的基本概念 多态是C面向对象三大特性之一(多态、继承、封装) 多态分为两类: 静态多态:函数重载和运算符重载属于静态多态&#x…

深入了解 Linux 中的 MTD 设备:/dev/mtd* 与 /dev/mtdblock*

目录 前言一、什么是MTD子系统?二、 /dev/mtd* 设备文件用途注意事项 三、/dev/mtdblock* 设备文件用途注意事项 三、这两种设备文件的关系四、关norflash的一些小知识 前言 在嵌入式Linux系统的世界里,非易失性存储技术扮演着至关重要的角色。MTD&#…

Spring Aop 源码解析(下)

ProxyFactory选择cglib或jdk动态代理原理 ProxyFactory在生成代理对象之前需要决定到底是使用JDK动态代理还是CGLIB技术: config就是ProxyFactory对象,把自己传进来了,因为ProxyFactory继承了很多类,其中一个父类就是ProxyConfig // config就是ProxyFactory对象// 是不是…

开发npm上传发布

第一步:注册npm账号 首先去官网注册一个npm账号,npm官网 第二步:创建项目 新建文件夹,并执行npm init 填写对应的信息name就是插件名称。 文件夹下就会生成一个package.json文件。 你可以在项目编辑你的插件。 第三步&…

第十二届蓝桥杯物联网试题(省赛)

思路: 这个考了一个RTC的配置,RTC我只配过一次,所以有些生疏,还是不能大意,一些偏僻的考点还是要多练,在获取RTC时间的时候也遇到一些bug,这个后续会用一篇博客将最近遇到的BUG都总结一下 主要的难点还是…

wordpress将图片默认连接到媒体文件

wordpress上传图片后,图片链接可以选择链接到媒体文件或附件页面。如果选择链接到媒体文件,就是链接到了图片的地址了。如果选择链接到附件页面,就是链接到图片所在的attachment页面了。 具体链接到哪里,在wordpress模板制作时&a…

基于GA优化的CNN-LSTM-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1卷积神经网络(CNN)在时间序列中的应用 4.2 长短时记忆网络(LSTM)处理序列依赖关系 4.3 注意力机制(Attention) 5…

Android15功能和 API 概览

Android 15 面向开发者引入了一些出色的新功能和 API。以下部分总结了这些功能,以帮助您开始使用相关 API。 如需查看新增、修改和移除的 API 的详细列表,请参阅 API 差异报告。如需详细了解新的 API,请访问 Android API 参考文档&#xff0…

FastAPI+React全栈开发03 为什么使用MongoDB

Chapter01 Web Development and the FARM Stack 03 Why use MongoDB FastAPIReact全栈开发03 为什么使用MongoDB In the following paragraphs, we will go through the main features of our selected database system - MongoDB - and give a high-level overview of the …

VSCode基本配置(编辑器)

VSCode基本配置 设置快捷键:Ctrl , 下载中文插件:Chinese,重启一下,如果没有,Ctrl Shift P,搜索:Display Language 主题推荐:Solarized Dark,快捷键:Ct…

速盾:cdn加速效果好吗

CDN(Content Delivery Network)是一种通过分布在全球多个节点的服务器来加速网络内容传输的技术。CDN加速效果好不好,需要从几个方面来考量。 首先,CDN可以显著提高网站的加载速度。由于CDN服务器分布在全球各地,用户…

C++零基础入门学习视频课程

教程介绍 本专题主要讲解C基础入门学习,所以不会涉及很深入的语法和机制。但会让你整体多面的了解和学习C的核心内容,快速学习使用C,我们的目标是先宏观整体把握,在深入各个击破! 学习地址 链接:https:/…

多线程合并练习题,线程安全(售票任务引入)--学习JavaEE的day30

day30 练习(day29) 注意代码注释,里面涉及代码实现遇到问题及解决方案,由于理解方便没有单独出来 1.计算任务 1.计算任务,一个包含了2万个整数的数组,分拆了多个线程来进行并行计算,最后汇总出…