【PB案例学习笔记】-14使用次数和日期限制

2024-06-03 07:44

本文主要是介绍【PB案例学习笔记】-14使用次数和日期限制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写在前面

这是PB案例学习笔记系列文章的第14篇,该系列文章适合具有一定PB基础的读者。

通过一个个由浅入深的编程实战案例学习,提高编程技巧,以保证小伙伴们能应付公司的各种开发需求。

文章中设计到的源码,小凡都上传到了gitee代码仓库https://gitee.com/xiezhr/pb-project-example.git

gitee代码仓库

需要源代码的小伙伴们可以自行下载查看,后续文章涉及到的案例代码也都会提交到这个仓库【pb-project-example

如果对小伙伴有所帮助,希望能给一个小星星⭐支持一下小凡。

一、小目标

这篇文章我们制作一个限制使用次数和日期的窗口。在实际工作中的使用场景是:当我们程序完成后需要将它提供给

客户试用时可以用到。用户通过试用,觉得程序🆗了,再进行购买。

案例中我们需要用到Profilestring()Profileint() 读取和操作配置文件来记录使用次数和时间。

然后利用结构来进行数据交互。用到的这些我们会在后面的小节中详细介绍

限制使用

二、 配置文件读取函数

2.1 ProfileString函数

获取配置文件中指定节点内容

① 语法

ProfileString(filename,nodename,default_value)

② 参数

  • filename–> 配置文件名称
  • nodename–> 配置文件中的节点名称
  • default_value–> 未找到指定的节或键,则返回的默认值

③ 返回

  • 返回值:string
  • 如果找到指定的节和键,则返回对应的值
  • 如果未找到指定的节或键,则返回默认值default_value

④ 举个栗子

我们来获取项目根目录下xiezhr.in配置文件中的数据库用户名、密码、连接信息

ls_username = ProfileString("xiezhr.ini","transaction","username","scott")
ls_password = ProfileString("xiezhr.ini","transaction","password","tiger")
ls_servername = ProfileString("xiezhr.ini","transaction","servername","127.0.0.1:1521/orcl")
2.2 SetProfileString 函数

设置配置文件中指定节点内容

① 语法

SetProfileString(filename,nodename,sourcename,value)

② 参数

  • filename–> 配置文件名称
  • nodename–>节点名称
  • sourcename–>节点下目标位置名称
  • value--> 需要设置的值

③ 返回

  • 返回值:Integer
  • 如果成功写入值,则返回0
  • 如果写入失败,则返回-1

④ 举个栗子

我们修改项目更目录下xiezhr.ini配置文件内容,将username值设置成xiezhr

SetProfileString('xiezhr.ini','transaction','username',xiezhr')

三、结构介绍

结构是多个相关变量的集合,这些变量可以具有相同的数据类型也可以具有不同的数据类型。

结构的所有元素可以作为一个整体引用

结构类型

  • 全程结构

​ 不与应用程序中的任何具体对象相关联,并且可以在应用程序的任何地方使用

  • 对象级结构

    与待定的窗口、菜单、用户对象或应用对象相关联,是对象定义的一部分。可以在对象本身的脚本中使用

注: 在定义结构时,如果定义的结构具有通用性并且在应用程序的任何地方都可以用到它,则把它定义为全程结构

如果要定义的结构只是用于某一特殊类型的对象,则定义为对象级结构即可

四、创建程序基本框架

在前面小节中已经把案例用到的相关知识做了简单介绍,还有一些文件打开FileOpen(),文件写入FileWrite()

在之前的文章中已经提到过,这里就不赘述了。接下来,我们就开始实操了

① 新建examplework工作区

② 新建exampleapp应用

③ 新建w_main窗口

④ 控件布局

在窗口中建立4个GroupBox控件和4个StaticEdit控件,调整控件大小位置,并修改text属性内容

修改完如下图所示,控件分别命名为gb_1 ~ gb_4 st_1 ~ st_4

窗口控件布局

⑤ 保存窗口

五、建立结构

① 添加结构

单击工具栏File—>New 命令,在弹出的New对话框中选择PB Object 选项卡中的Structure图标,单击【ok】按钮完成创建

添加结构

② 定义结构

上一步中单击【ok】按钮之后,会出现结构定义画版,具体如下图所示,在滑板中定义结构

定义结构

③ 保存为结构stru_test

定义完成后将结构命名为stru_test

六、编写代码

① 定义全局变量

双击系统视窗中exampleapp应用图标,在Declare Global Variables选项卡中输入如下代码

string ls_docname="c:\windows\action.ini"

② 定义实例变量

Declare Instance Variables 选项卡中添加如下代码

date id_firstdate  //首次使用日期
date id_lastdate //本次使用日期
integer ii_CanUseDays   //限制使用天数
integer ii_count  //统计启动次数
stru_test stru      //向主窗口传递参数

③ 在exampleapp 应用中添加u_openwin(integer ai_usedays) return boolean 函数,代码如下

/*
函数:u_openwin
功能:如果剩余天数<=0,返回false;否则向结构赋值,返回true
*/if ai_usedays>ii_canusedays thenreturn false
elsestru.d_fdate=id_firstdatestru.d_ldate=id_lastdatestru.i_time=ii_canusedays - ai_usedaysstru.i_count=ii_countreturn true
end if

④ 在exampleapp应用中添加u_lastdays() return integer 函数,代码如下

/* function: u_lastdays功能:1.判断系统日期是否被推后,系统日期被推后,返回-1  2.正常,返回剩余天数3.将last_data设位当前日期
*/
boolean lb_exist
int li_retid_lastdate=date(profilestring(ls_docname, "data", "last_data", string(today())))
id_firstdate=date(profilestring(ls_docname, "data", "first_data", string(today())))
ii_CanUseDays=profileint(ls_docname, "data", "times", 30)li_ret=DaysAfter(id_lastdate,today())if li_ret < 0 then   return li_ret   
else 	id_lastdate=today()setprofilestring(ls_docname, "data", "last_data", string(id_lastdate))li_ret=DaysAfter(id_firstdate,id_lastdate)return li_ret     
end if

⑤ 在exampleapp应用中添加u_newfile() return integer 函数,代码如下

/* function: u_newfile功能:1."c:\windows\SYSTEM\action.ini"文件存在,返回软件已经使用的次数;2.如果action.ini文件不存在,创建该文件,设置软件使用次数为0,设置软件初始使用日期为当前日期
*/
integer li_FileNum
boolean lb_existlb_exist = FileExists(ls_docname)IF lb_exist THEN ii_count=Profileint ( ls_docname, "data", "count", 0 )ii_count++SetProfileString(ls_docname, "data", "count", string(ii_count))return ii_count
elseli_FileNum = FileOpen(ls_docname,LineMode!, Write!, Shared! , Append!)FileWrite(li_FileNum, "[data]~r~nfirst_data = "+string(today())+"~r~n"+&"last_data = "+string(today())+"~r~ntimes = 30~r~ncount = 0")return 0
end if

⑥ 在exampleapp 应用的open 时间中添加如下代码

/*
功能:1、判断软件使用天数,如果软件使用天数小于0,说明用户推迟了系统日期,提示用户并返回;2、软件使用天数大于0,判断软件是否到期,如果到期提示用户并返回;3、打开主窗口,通过结构stru_test向主窗口传递参数
*/int li_usedays       this.u_newfile()              //软件使用的次数
li_usedays=this.u_lastdays()  //软件已经使用的天数if li_usedays < 0 then messagebox("提示信息","您推迟了系统日期"+string(abs(li_usedays))+"天,系统无法加载!",stopsign!)return
elseif this.u_openwin(li_usedays) thenopenwithparm(w_main,stru)elsemessagebox("提示信息","请原谅,您的软件已经到期!")end if
end if

⑦ 在w_main窗口的open事件中添加如下代码

stru_test stru
string ls_days
stru=message.PowerObjectparm
st_1.text=string(stru.i_count)
st_2.text=string(stru.i_time)
st_3.text=string(stru.d_fdate)
st_4.text=string(stru.d_ldate)

七、运行程序

代码写完了,我们验证一下看看程序能不能达到我们的预期效果

限制使用

本期内容到这儿就结束了,希望对您有所帮助 ★,°:.☆( ̄▽ ̄)/$:.°★

我们下期再见

这篇关于【PB案例学习笔记】-14使用次数和日期限制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026380

相关文章

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详