40、日期与时间应用程序开发指南

日期与时间应用程序开发指南

在软件开发中,处理日期和时间是常见的需求。本文将介绍几个用于处理日期和时间任务的应用程序,包括日期选择演示程序(VBCal)、模拟时钟程序(VBClock)。

1. VBCal 应用程序

在许多业务应用程序中,让用户选择日期是一项常见任务。传统的让用户在文本框中输入日期的方法,需要仔细验证输入的日期并考虑国际化问题。更好的方法是显示与日历相关的控件,让用户选择日期。VBCal 应用程序就演示了三种不同的日期选择控件。

1.1 向导式设计

VBCal 应用程序采用了向导式设计,这是一种方便且标准的与用户进行线性、顺序交互的方式。该项目包含五个外观几乎相同的窗体,用于逐步引导用户完成操作。代码模块 VBCALWIZ.BAS 中只有三行代码,用于使所有窗体都能访问用户选择的日期。

步骤 描述 控件
步骤 1 显示介绍屏幕 VBCal Wizard
步骤 2 使用 DTPicker 控件提示用户输入第一个日期 DTPicker
步骤 3 使用 MonthView 控件提示用户输入第二个日期 MonthView
步骤 4 使用 Calendar 控件提示用户输入第三个日期 Calendar
步骤 5 显示最终结果报告

mermaid 流程图如下:

graph LR
    A[步骤 1: 介绍屏幕] --> B[步骤 2: DTPicker 输入日期]
    B --> C[步骤 3: MonthView 输入日期]
    C --> D[步骤 4: Calendar 输入日期]
    D --> E[步骤 5: 显示报告]
1.2 日期选择控件
  • DTPicker 控件 :在向导的第二步,用户可以使用该控件通过键盘输入日期,也可以点击下拉箭头从一个小日历窗口中选择日期。其 CustomFormat 属性允许用户灵活定义日期(和/或时间)格式,并处理字段高亮、自动验证输入和显示小日历等细节。
' VBCAWIZ2.FRM 中设置 DTPicker 控件属性
dtpDemo.Format = 3 ' dtpCustom
dtpDemo.CustomFormat = "Date format: mm/dd/yyyy"
  • MonthView 控件 :向导的第三步使用该控件选择日期,其默认外观与 DTPicker 控件显示的小日历相似。该控件有许多选项可控制其外观和功能,例如可以设置 MonthColumns 和 MonthRows 属性以同时显示多个月份。
' VBCAWIZ3.FRM 中设置 MonthView 控件属性
mvwDemo.Value = gdtmDate2
  • Calendar 控件 :向导的第四步使用该控件让用户以另一种方式选择日期。该控件也显示一个月的日历,具有更多的格式化属性来控制其外观细节,并且日历可以根据需要调整大小。旁边添加了一个“Today”按钮,可让用户立即跳转到当前日期。
' VBCAWIZ4.FRM 中设置 Calendar 控件属性
calDemo.Value = gdtmDate3
1.3 代码实现

以下是部分关键代码示例:

' VBCALWIZ.BAS 中声明公共变量
Option Explicit
Public gdtmDate1 As Date
Public gdtmDate2 As Date
Public gdtmDate3 As Date

' VBCAWIZ1.FRM 中部分代码
Option Explicit
Private Sub cmdCancel_Click()
    Unload Me
End Sub
Private Sub cmdNext_Click()
    frmVBCalWiz2.Show
    Unload Me
End Sub
Private Sub Form_Load()
    If gdtmDate1 = 0 Then
        gdtmDate1 = Date
        gdtmDate2 = Date
        gdtmDate3 = Date
    End If
    lblPrompt.Caption = "This example wizard " & _
        "demonstrates three controls that let " & _
        "you select dates as it helps you " & _
        "calculate the number of days " & _
        "between two dates."
    Move (Screen.Width - Width) \ 2, _
         (Screen.Height - Height) \ 2
    Show
    cmdNext.SetFocus
End Sub
2. VBClock 应用程序

VBClock 应用程序创建了一个视觉上吸引人且有趣的模拟时钟,用于显示系统时间。该应用程序还演示了几种图形技术,并展示了一种向应用程序添加通用“关于”框的替代方法。

2.1 界面与功能

VBClock 窗体的背景是一个彩色位图图形,用户可以将任何位图文件加载到 picBackGround PictureBox 控件中来自定义时钟。选项菜单提供了手动设置时间和更改时钟指针颜色的选项,帮助菜单提供了访问相关帮助文件的入口。

菜单 功能
文件 包含退出等功能
选项 手动设置时间、更改指针颜色
帮助 访问帮助文件的内容和搜索入口

mermaid 流程图如下:

graph LR
    A[启动 VBClock] --> B[显示模拟时钟]
    B --> C{选择菜单选项}
    C -->|文件 - 退出| D[关闭程序]
    C -->|选项 - 设置时间| E[输入新时间]
    C -->|选项 - 更改指针颜色| F[选择颜色]
    C -->|帮助 - 内容/搜索| G[访问帮助文件]
2.2 关键控件与代码

VBClock 窗体只有三个控件:用于显示背景和时钟指针的 PictureBox 控件、用于更新时钟的 Timer 控件以及用于提供与相关帮助文件接口的 CommonDialog 控件。

' VBCLOCK.FRM 中部分代码
Option Explicit
Public gintHourHandColor As Integer
Public gintMinuteHandColor As Integer
Public gintSecondHandColor As Integer
Private mintHnum As Integer
Private mintMnum As Integer
Private mintSnum As Integer
Private mlngHcolor As Long
Private mlMcolor As Long
Private mlngScolor As Long
Private msngHlen As Single
Private msngMlen As Single
Private msngSlen As Single
Private mstrAppname As String
Private mstrSection As String
Private mstrKey As String
Private mstrSetting As String
Private Const sngPi = 3.141593!
Private Const sngTwoPi = sngPi + sngPi
Private Const sngHalfPi = sngPi / 2

Private Sub Form_Load()
    picBackGround.Move 0, 0
    Me.Width = picBackGround.Width + (Me.Width - ScaleWidth)
    Me.Height = picBackGround.Height + (Me.Height - ScaleHeight)
    picBackGround.Scale (-2, -2)-(2, 2)
    Me.Left = (Screen.Width - Me.Width) \ 2
    Me.Top = (Screen.Height - Me.Height) \ 2
    picBackGround.DrawWidth = 5
    msngHlen = 0.8
    msngMlen = 1.5
    msngSlen = 1
    mstrAppname = "VBClock"
    mstrSection = "Hands"
    mstrKey = "mlngHcolor"
    mstrSetting = GetSetting(mstrAppname, mstrSection, mstrKey)
    gintHourHandColor = Val(mstrSetting)
    mstrKey = "mlMcolor"
    mstrSetting = GetSetting(mstrAppname, mstrSection, mstrKey)
    gintMinuteHandColor = Val(mstrSetting)
    mstrKey = "mlngScolor"
    mstrSetting = GetSetting(mstrAppname, mstrSection, mstrKey)
    gintSecondHandColor = Val(mstrSetting)
End Sub
2.3 定时器问题与解决

Timer 控件的 Interval 属性设置为 100 毫秒(1/10 秒),而不是 1000 毫秒(1 秒)。因为将定时器设置为每秒触发一次会导致时钟指针的移动出现间歇性卡顿,这是由于 Visual Basic 定时器的激活不是基于精确的时间间隔。将 Interval 属性设置为小于半秒的值(如 100 毫秒)可以更准确地更新指针,并且用户不会注意到跳动。

' VBCLOCK.FRM 中 Timer 事件代码
Private Sub tmrClock_Timer()
    Dim dblHang As Double
    Dim dblMang As Double
    Dim dblSang As Double
    Dim dblHx As Double
    Dim dblHy As Double
    Dim dblMx As Double
    Dim dblMy As Double
    Dim dblSx As Double
    Dim dblSy As Double
    Static intLastSecond As Integer
    If Second(Now) = intLastSecond Then
        Exit Sub
    Else
        intLastSecond = Second(Now)
    End If
    mintHnum = Hour(Now)
    mintMnum = Minute(Now)
    mintSnum = Second(Now)
    dblHang = sngTwoPi * (mintHnum + mintMnum / 60) / 12 - sngHalfPi
    dblMang = sngTwoPi * (mintMnum + mintSnum / 60) / 60 - sngHalfPi
    dblSang = sngTwoPi * mintSnum / 60 - sngHalfPi
    dblHx = msngHlen * Cos(dblHang)
    dblHy = msngHlen * Sin(dblHang)
    dblMx = msngMlen * Cos(dblMang)
    dblMy = msngMlen * Sin(dblMang)
    dblSx = msngSlen * Cos(dblSang)
    dblSy = msngSlen * Sin(dblSang)
    picBackGround.Cls
    picBackGround.Line (0, 0)-(dblMx, dblMy), _
        QBColor(gintMinuteHandColor)
    picBackGround.Line (0, 0)-(dblHx, dblHy), _
        QBColor(gintHourHandColor)
    picBackGround.Line (0, 0)-(dblSx, dblSy), _
        QBColor(gintSecondHandColor)
End Sub
2.4 注册表的使用

用户可以选择更改时钟指针的颜色,为了在会话之间保持这些颜色信息,应用程序在窗体的 Load 事件中从注册表中检索最后已知的颜色设置,并在窗体的 Unload 事件中保存当前的颜色设置。

' VBCLOCK.FRM 中保存和读取注册表代码
Private Sub Form_Load()
    ' 从注册表读取颜色设置
    mstrAppname = "VBClock"
    mstrSection = "Hands"
    mstrKey = "mlngHcolor"
    mstrSetting = GetSetting(mstrAppname, mstrSection, mstrKey)
    gintHourHandColor = Val(mstrSetting)
    ' ... 其他指针颜色设置
End Sub

Private Sub Form_Unload(Cancel As Integer)
    ' 保存当前指针颜色到注册表
    mstrKey = "mlngHcolor"
    mstrSetting = Str$(gintHourHandColor)
    SaveSetting mstrAppname, mstrSection, mstrKey, mstrSetting
    ' ... 其他指针颜色保存
End Sub
2.5 选择指针颜色的窗体

VBClock2 窗体提供了一种图形化的方式让用户选择时钟指针的颜色。通过在三个 PictureBox 控件中绘制 16 种主要颜色,用户可以直观地选择颜色。

' VBCLOCK2.FRM 中部分代码
Option Explicit
Private mintHourMouseX As Integer
Private mintMinuteMouseX As Integer
Private mintSecondMouseX As Integer
Private mintHourHand As Integer
Private mintMinuteHand As Integer
Private mintSecondHand As Integer

Private Sub Form_Load()
    mintHourHand = frmVBClock.gintHourHandColor
    mintMinuteHand = frmVBClock.gintMinuteHandColor
    mintSecondHand = frmVBClock.gintSecondHandColor
    picHourColor.Scale (0, 0)-(16, 1)
    picMinuteColor.Scale (0, 0)-(16, 1)
    picSecondColor.Scale (0, 0)-(16, 1)
End Sub

Private Sub Form_Paint()
    Dim i As Integer
    For i = 0 To 15
        picHourColor.Line (i, 0)-(i + 1, 1), QBColor(i), BF
        picMinuteColor.Line (i, 0)-(i + 1, 1), QBColor(i), BF
        picSecondColor.Line (i, 0)-(i + 1, 1), QBColor(i), BF
    Next i
    picHourColor.DrawWidth = 2
    picHourColor.Line (mintHourHand + 0.3, 0.5) _
        -(mintHourHand + 0.5, 0.7), QBColor(mintHourHand Xor 15)
    ' ... 其他指针颜色标记
End Sub
2.6 “关于”窗体

ABOUT2.FRM 是一个通用的“关于”窗体,所有显示的数据都由调用的应用程序修改,只需调用该窗体的 Display 方法即可激活。通过设置 App 对象的属性,可以自动填充窗体上的标签信息。

' ABOUT2.FRM 中部分代码
Option Explicit
Private Sub Form_Load()
    Left = (Screen.Width - Width) \ 2
    Top = (Screen.Height - Height) \ 2
    lblHeading.Caption = App.Title
    lblApplication.Caption = App.ProductName
    lblVB.Caption = App.Comments
    lblCopyright.Caption = App.LegalCopyright
End Sub

Public Sub Display()
    Me.Show vbModal
End Sub

通过以上这些应用程序和代码示例,我们可以看到如何在软件开发中有效地处理日期和时间任务,以及如何运用各种控件和技术来提升用户体验。

日期与时间应用程序开发指南

3. 总结与拓展

在前面的内容中,我们详细介绍了 VBCal 和 VBClock 两个应用程序的开发过程,包括它们的功能实现、关键控件的使用以及代码示例。下面我们对这些内容进行总结,并探讨一些可能的拓展方向。

3.1 应用程序总结
  • VBCal 应用程序 :通过向导式设计,利用 DTPicker、MonthView 和 Calendar 三种不同的日期选择控件,为用户提供了直观、便捷的日期选择方式。同时,通过公共变量在不同窗体间传递数据,确保了日期选择的连贯性。
  • VBClock 应用程序 :创建了一个视觉上吸引人的模拟时钟,展示了图形技术的应用。通过定时器更新时钟指针,解决了指针跳动问题。利用注册表保存指针颜色设置,实现了用户个性化设置的持久化。
应用程序 主要功能 关键技术
VBCal 日期选择演示 向导式设计、日期选择控件
VBClock 模拟时钟显示 图形绘制、定时器、注册表操作

mermaid 流程图如下:

graph LR
    A[VBCal 应用程序] --> B[日期选择功能]
    B --> C[DTPicker 控件]
    B --> D[MonthView 控件]
    B --> E[Calendar 控件]
    F[VBClock 应用程序] --> G[模拟时钟显示]
    G --> H[图形绘制技术]
    G --> I[定时器更新]
    G --> J[注册表保存设置]
3.2 拓展方向
  • VBCal 应用程序拓展
    • 增加日期计算功能 :除了计算日期之间的天数,还可以实现更多复杂的日期计算,如计算工作日天数、特定节假日之间的日期等。
    • 支持更多日期格式 :虽然 DTPicker 控件的 CustomFormat 属性提供了一定的灵活性,但可以进一步扩展,支持更多的国际日期格式。
    • 优化用户界面 :可以添加动画效果或提示信息,提升用户在向导步骤中的交互体验。
  • VBClock 应用程序拓展
    • 添加更多时钟样式 :除了模拟时钟,还可以添加数字时钟样式,满足不同用户的需求。
    • 支持网络时间同步 :结合 NISTTime 应用程序的原理,实现更精确的网络时间同步功能。
    • 增加时钟特效 :如时钟指针的闪烁效果、背景的动态变化等,增强视觉效果。
4. 开发建议与注意事项

在开发类似的日期与时间应用程序时,以下是一些建议和注意事项:

4.1 代码优化
  • 减少重复代码 :在多个窗体或模块中,如果有相同的功能代码,可以提取为公共函数或过程,提高代码的可维护性。
  • 合理使用全局变量 :虽然全局变量可以方便数据的传递,但过多使用会增加代码的耦合度。尽量使用局部变量和参数传递数据。
  • 优化定时器使用 :如 VBClock 应用程序中,合理设置定时器的 Interval 属性,避免出现指针跳动等问题。
4.2 用户体验
  • 界面设计简洁明了 :确保用户能够轻松理解每个控件的功能和操作方法,避免界面过于复杂。
  • 提供反馈信息 :在用户进行操作时,及时提供反馈信息,如操作成功提示、错误信息等。
  • 支持多种输入方式 :对于日期选择等功能,除了提供控件选择,还可以支持手动输入,满足不同用户的习惯。
4.3 兼容性与可维护性
  • 考虑不同操作系统和屏幕分辨率 :确保应用程序在不同的操作系统和屏幕分辨率下都能正常显示和运行。
  • 编写清晰的注释 :在代码中添加详细的注释,方便后续的维护和扩展。
  • 进行充分的测试 :对应用程序进行全面的测试,包括功能测试、边界条件测试等,确保程序的稳定性。
5. 结语

日期与时间应用程序在软件开发中具有广泛的应用场景,通过 VBCal 和 VBClock 这两个示例,我们展示了如何运用各种控件和技术来实现这些功能。在实际开发中,我们可以根据具体需求进行拓展和优化,同时遵循开发建议和注意事项,提高应用程序的质量和用户体验。希望本文能够为开发者提供一些有益的参考,帮助大家更好地处理日期与时间相关的开发任务。

总之,无论是简单的日期选择还是复杂的时钟显示,都需要我们精心设计和编码,不断探索和创新,以满足用户日益增长的需求。相信在未来的软件开发中,日期与时间应用程序将会有更加丰富的功能和更加出色的表现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值