【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 then
	return false
else
	stru.d_fdate=id_firstdate
	stru.d_ldate=id_lastdate
	stru.i_time=ii_canusedays - ai_usedays
	stru.i_count=ii_count
	return true
end if

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

/* 
 function: u_lastdays
 功能:
		1.判断系统日期是否被推后,系统日期被推后,返回-1  
		2.正常,返回剩余天数
		3.将last_data设位当前日期
*/
boolean lb_exist
int li_ret

id_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_exist

lb_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
else
	li_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
else
	
	if this.u_openwin(li_usedays) then
		openwithparm(w_main,stru)
	else
		messagebox("提示信息","请原谅,您的软件已经到期!")
	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)

七、运行程序

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

限制使用

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

我们下期再见

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

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

相关文章

如何注册及使用飞浆AI Studio资源跑模型

之前已经介绍过如何注册及使用Kaggle平台的资源跑模型&#xff0c;今天我们将介绍如何注册及使用飞浆AI Studio资源​。 一、AI Studio简介 飞桨AI Studio是基于百度深度学习开源平台飞桨&#xff08;PaddlePaddle&#xff09;的人工智能学习与实训社区。我们先让文心一言给对…

数字组合问题(回溯法)

一、问题描述 找出从自然数1、2、……、n中任取r个数的所有组合。 问题的状态空间为&#xff1a; E{&#xff08;x1&#xff0c;x2&#xff0c;...&#xff0c;xr&#xff09;∣xi∈S &#xff0c;i1&#xff0c;2&#xff0c;...&#xff0c;r } 其中&#xff1a…

现成方案 - 复刻版类似 Perplexity 与秘塔 AI 的搜索引擎

这里为大家带来一个极具创新性的开源 AI 搜索引擎&#xff0c;其灵感源自 Perplexity。 该搜索引擎主要具备以下功能&#xff1a; 能够接收用户提出的各种问题。借助 Bing 搜索 API 可查找出前 6 个结果并予以展示。会抓取这 6 个链接的文本内容&#xff0c;将其作为重要的上下…

基于springboot实现青年公寓服务平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现青年公寓服务平台系统演示 摘要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;房屋信息因为其管理内容繁杂&#xff…

Spark 3.5.1 升级 Java 17 异常 cannot access class sun.nio.ch.DirectBuffer

异常说明 使用Spark 3.5.1 升级到Java17的时候会有一个异常&#xff0c;异常如下 SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.htm…

面试题:谈谈你对观察者和订阅发布的理解

面试题&#xff1a;谈谈你对观察者和订阅发布的理解 1. 观察者设计模式 场景引入之杂志订阅&#xff1a;小王想要购买一本尚未出版的杂志&#xff0c;他向出版社预订该杂志并提供联系方式&#xff0c;一旦该杂志出版&#xff0c;出版社就会根据小王预留的联系方式通知他可以来…

YOLOv8_obb预测流程-原理解析[旋转目标检测理论篇]

YOLOv8_obb的预测流程,主要分预处理模块、推理模块和后处理模块。这里面有很多内容是和目标检测预测流程是重合的,主要区别在于Angle分支、NMS后处理以及regularize_rboxes部分。本文也主要介绍一下这三个模块,其他模块可以结合YOLOv8预测流程-原理解析[目标检测理论篇]一起…

最新版wordpress网创资源美化以及更新自动同步插件

最新更新了美化右侧悬浮图标 底部分类板块&#xff0c;以及文章自动同步插件 1.支持分类替换 将主站同步过来的文章分类进行替换 2.支持本地化文章图片 &#xff08;使用储存桶可能会导致无法保存图片&#xff09; 3.支持自定义文章作者&#xff08;选择多个作者则同步到的…

辩证 逻辑学 | 洞察 事物矛盾及变化规律 在形式逻辑基础上 学会辩证思维(40节课)

课程下载&#xff1a;辩证逻辑学洞察事物矛盾及变化规律在形式逻辑基础上学会辩证思维&#xff08;40节课&#xff09;-课程网盘链接提取码下载.txt资源-CSDN文库 更多资源下载&#xff1a;关注我。 在形式逻辑的基础上&#xff0c;学会 辩证思维 敏锐 洞察事物发展变化的规…

RPG Maker MV角色战斗动画记录

角色战斗动画记录 角色战斗状态判断的语句赋值 战斗管理战斗精灵创建精灵进行角色的更新 角色战斗状态 角色的战斗状态是由 Game_Battler 类中的 _actionState 属性的字符串决定的&#xff0c;它有哪些值呢&#xff1f; undecided 未确定或者说是操作状态inputting 输入waiti…

开源VS闭源:大模型之争,究竟谁更胜一筹?

随着人工智能技术的快速发展&#xff0c;大模型作为其中的核心组件&#xff0c;已经引起了业界的广泛关注。在大模型的研发过程中&#xff0c;开源与闭源成为了两个备受争议的话题。究竟开源与闭源谁更好&#xff1f;本文将从多个角度进行深入分析&#xff0c;为大家揭示真相。…

React + SpringBoot开发用户中心管理系统

用户中心项目搭建笔记 技术栈 前端技术栈 “react”: “^18.2.0”,ant-design-pro 后端技术栈 SpringBoot 2.6.x 项目源码地址 https://gitee.com/szxio/user-center 前端项目搭建 快速搭建一个后端管理系统项目框架 初始化 antDesignPro 官网&#xff1a; https://…

godot.bk:how to add map to the game

1.项目构建如下&#xff0c;map是我们点击start之后才渲染出来的 mian.tscn --main.gd --background(textureact) --start(button) --button.gd sourceFile map.tscn --tilemap --tileset 2.main.gd&#xff1a;注意main.gd并不定义信号&#xff0c;它只是接收信号而已 extend…

新书推荐:1.2 动态链接库与API

本节必须掌握的知识点&#xff1a; kernel32.dll user32.dll gdi32.dll ■动态链接库 最早的软件开发过程&#xff0c;所有的功能实现都是有程序员独立完成的。在这个过程中&#xff0c;我们很快就会发现&#xff0c;有很多常用的功能模块是可以重复利用的&#xff0c;我们将…

UE5.1_常用快捷键

UE5.1_常用快捷键 shift1&#xff0c;&#xff0c;模式选择 shift2&#xff0c;&#xff0c;模式选择 shift3&#xff0c;&#xff0c;模式选择 shift4&#xff0c;&#xff0c;模式选择 shift5&#xff0c;&#xff0c;模式选择 shift6&#xff0c;&#xff0c;模式选择 …

定义多层Toggle选项,第一层为总开关

本文为笔记&#xff0c;暂未整理。主要逻辑为&#xff0c;我们有需求&#xff0c;需要再第一个Toggle选中之后&#xff0c;余下的几个Toggle才是可以被修改的状态。 ①&#xff1a;当第一个是灰色的时候&#xff0c;余下两个Toggle都是灰色的&#xff0c;并且都是不可选中的。…

【全开源】Java共享台球室无人系统支持微信小程序+微信公众号+H5

智能引领台球新体验 一、引言&#xff1a;共享经济的新篇章 在共享经济的大潮中&#xff0c;各类共享服务层出不穷&#xff0c;为人们的生活带来了极大的便利。共享台球室作为其中的一员&#xff0c;以其独特的魅力吸引了众多台球爱好者的目光。而今天&#xff0c;我们要介绍…

代码随想录算法训练营第三十六 | ● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

今天的三道题都是区间问题 435. 无重叠区间 讲解链接&#xff1a;https://programmercarl.com/0435.%E6%97%A0%E9%87%8D%E5%8F%A0%E5%8C%BA%E9%97%B4.html 思路分析在代码注释 class Solution { public:static bool cmp(const vector<int>&a, const vector<int&…

AI智能体|基于已有的扣子Coze Bot进行插件化改造

大家好&#xff0c;我是无界生长&#xff0c;国内最大AI付费社群“AI破局俱乐部”初创合伙人。 AI智能体&#xff5c;基于已有的扣子Coze Bot进行插件化改造本文通过案例演示的方式&#xff0c;介绍了如何将扣子Coze平台创建的Bot改造成插件并发布到插件商店供第三方使用。如果…

Python的文件管理

读取文件 首先我们可以先创建一个工程项目&#xff0c;如图所示&#xff1a; 打开我们名为1.读取文件.py的python文件&#xff0c;然后我们可以写下读取Python文件的代码&#xff0c;代码如下&#xff1a; f open("1.txt", "r") print(f.read()) f.clos…