【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)

七、运行程序

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

限制使用

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

我们下期再见

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

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

相关文章

【工具】探索 ARPU:平均每用户收入

缘分让我们相遇乱世以外 命运却要我们危难中相爱 也许未来遥远在光年之外 我愿守候未知里为你等待 我没想到为了你我能疯狂到 山崩海啸没有你根本不想逃 我的大脑为了你已经疯狂到 脉搏心跳没有你根本不重要 &#x1f3b5; 邓紫棋《光年之外》 什么是 ARP…

UE5.1_常用快捷键

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

2.3Docker部署java工程

2.3Docker部署java工程 1.导入jar包 2.在Docker部署jdk&#xff08;容器名为myjdk17&#xff09; 3.修改jar包名 mv 原包名 新包名4. 配置启动脚本 Dockerfile是一个文本文件&#xff0c;其中包含了构建 Docker 镜像所需的一系列步骤和指令。通过编写 Dockerfile 文件&…

Adversarial Nibbler挑战:与多元社区持续开展开放红队测试

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

RPG Maker MV角色战斗动画记录

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

QA 未能打开位于 D:/Computer999/Computer999.vbox 的虚拟电脑

前言 未能打开位于 xxx/Computer999.vbox 的虚拟电脑&#xff0c;并提示E_INVALIDARG (0X80070057)&#xff0c;是最常见的一个错误&#xff0c;下面是解决办法。 内容 1、提示下面的错误&#xff0c;注册Computer999失败&#xff1a; 未能打开位于 D:/Computer999/Compute…

K210视觉识别模块学习笔记1:第一个串口程序_程序烧录与开机启动

今日开始学习K210视觉识别模块:简单的认识与串口程序 亚博智能的K210视觉识别模块...... 固件库版本: canmv_yahboom_v2.1.1.bin 既然K210作为一个视觉识别外设模块来使用&#xff0c;我认为第一个程序 就没必要学点灯之类的了&#xff0c;直接学习串口如何配置开始为妥&…

ctfshow-web入门-爆破(web21-web24)

目录 1、web21 2、web22 3、web23 4、web24 1、web21 爆破什么的&#xff0c;都是基操 需要认证才能访问 随便输一个用户名和密码抓包看看&#xff1a; 多出来一个认证的头 Authorization: Basic YWRtaW46MTIzNDU2 base64 解码看看&#xff1a; 就是我们刚才输入的用于测…

C语言 | Leetcode C语言题解之第127题单词接龙

题目&#xff1a; 题解&#xff1a; struct Trie {int ch[27];int val; } trie[50001];int size, nodeNum;void insert(char* s, int num) {int sSize strlen(s), add 0;for (int i 0; i < sSize; i) {int x s[i] - ;if (trie[add].ch[x] 0) {trie[add].ch[x] size;m…

计算机系统结构之FORK和JOIN

程序语言中用FORK语句派生并行任务&#xff0c;用JOIN语句对多个并发任务汇合。 FORK语句的形式为FORK m&#xff0c;其中m为新领程开始的标号。 JOIN语句的形式为JOIN n&#xff0c;其中n为并发进程的个数。 例1&#xff1a;给定算术表达式ZEA*B*C/DF经并行编译得到如下程序…

刘强东的简历很拉风!

正式宣布&#xff1a;GPT 4o 在国内直接使用 ~ 来看一下江湖人称“东哥”刘强东的简历&#xff0c;大佬确实很拉风&#xff1a; 刘强东&#xff0c;京东的创始人&#xff0c;是中国互联网行业的传奇人物。他的故事充满了奋斗和创新&#xff0c;以下是我对他简历的一些看法&…

Vitis HLS 学习笔记--HLS流水线类型

目录 1. 简介 2. 优缺点对比 2.1 Stalled Pipeline 2.2 Free-Running/Flushable Pipeline 2.3 Flushable Pipeline 3. 设置方法 4. FRP的特殊优势 5. 总结 1. 简介 Vitis HLS 会自动选择正确的流水线样式&#xff0c;用于流水打拍函数或循环。 停滞的流水线&#xff…

K8S SWCK SkyWalking全链路跟踪工具安装

官方参考&#xff1a;如何使用java探针注入器? 配置两个demo&#xff0c;建立调用关系&#xff0c; 首先创建一个基础镜像dockerfile from centos 先安装java 参考: linux rpm方式安装java JAVA_HOME/usr/java/jdk1.8.0-x64 CLASSPATH.:$JAVA_HOME/lib/tools.jar PATH…

了解Maven,并配置国内源

目录 1.了解Maven 1.1什么是Maven 1.2快速创建一个Maven项⽬ 1.3Maven 核⼼功能 1.3.1项⽬构建 1.3.2依赖管理 1.4Maven Help插件 2.Maven 仓库 2.1中央仓库 2.2本地仓库 3.Maven 设置国内源 1.查看配置⽂件的地址 2.配置国内源 3.设置新项⽬的setting 1.了解Ma…

Hive安装-内嵌模式

1.官网下在hive3.1.2版本 Index of /dist/hive/hive-3.1.2 2.上传到master节点的/opt/software目录下 3.解压到/opt/module目录下 tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /opt/module/ 检查解压后文件 4.修改名字 改为hive cd /opt/module mv apache-hive-3.1.2-bin…

期权的时间价值是什么?和期权内在价值有啥不同?

今天带你了解期权的时间价值是什么&#xff1f;和期权内在价值有啥不同&#xff1f;期权的内在价值&#xff0c;是指期权立即执行产生的经济价值。 期权的时间价值是什么&#xff1f; 期权的时间价值是期权价格的一个重要组成部分&#xff0c;也被称为期权的外在价值。它是指期…

【再探】设计模式—备忘录模式与解释器模式

备忘录模式是用于保存对象在某个时刻的状态&#xff0c;来实现撤销操作。而解释器模式则是将文本按照定义的文法规则解析成对应的命令。 1 备忘录模式 需求&#xff1a;保存对象在某个时刻的状态&#xff0c;后面可以对该对象实行撤销操作。 1.1 备忘录模式介绍 提供一种状…

RK3568笔记二十九:RTMP推流

若该文为原创文章&#xff0c;转载请注明原文出处。 基于RK3568的RTMP推流测试&#xff0c;此代码是基于勇哥的github代码修改的&#xff0c;源码地址MontaukLaw/3568_rknn_rtmp: rk3568的推理推流 (github.com) 感兴趣的可以clone下来测试。 也可以下载修改后的代码测试。Y…

普华永道信任危机:上市公司解约风波与反思

在全球会计业界的星空中&#xff0c;普华永道无疑是那颗最为耀眼的星之一。然而&#xff0c;近日这颗星却遭遇了前所未有的信任危机。这家大名鼎鼎的四大会计师事务所之一&#xff0c;近期陷入了上市公司解约的风波之中&#xff0c;其声誉与地位正面临严峻挑战。 就在昨晚&…

Vivado的两种下载安装方式:Webpack下载与安装、本地文件安装详细步骤讲解

目录 1.前言2. Vivado Webpack下载、安装3.本地文件下载安装 微信公众号获取更多FPGA相关源码&#xff1a; 1.前言 本人自本科大二开始接触FPGA相关知识&#xff0c;现已将近六年&#xff0c;由于一直在上学&#xff0c;也不是一直在搞FPGA&#xff0c;但是也完成过一些项目…