【PB案例学习笔记】-22制作一个语音朗读金额小应用

写在前面

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

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

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

gitee代码仓库

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

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

一、小目标

上一个案例中我们将小写金额转换为大写金额,这一个案例中我们将制作一个语音播报金额的小应用。

这个在日常开发中也很常见,尤其是在收费结算应用中。最终实现效果如下

金额语音播报

二、实现思路

首先我们需要准备 零、壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元、角、分、整

的.wav格式的语音文件。然后通过WINMM.dll外部动态库的sandPlaySoundA()和waveOutGetNumDevs()

联合起来播放语音文件

三、创建程序基本框架

① 新建examplework工作区

② 新建exampleapp应用

③ 新建w_main窗口,将其Title属性值设置成“朗读款项金额”

由于篇幅原因,以上步骤这儿就不展开了,忘记了的小伙伴翻一翻该系列文章的第一篇

④ 在w_main窗口上放置控件

在窗口上添加3个StaticEdit控件,1个singleLineEdit控件和2个CommandButton。将其分别命名为st_1st_2st_3

sle_1sle_2cb_1cb_2。 调整各个控件布局后如下

控件布局

⑤ 保存窗口

四、编写代码

① 定义本地外部扩展函数

w_mainDeclare Local External Function 选项卡中添加如下代码

Function boolean sndPlaySoundA(string SoundName, uint Flags) Library "WINMM.DLL"
Function uint waveOutGetNumDevs ()Library "WINMM.DLL"

定义扩展函数

② 在W_main窗口的Function List 选项卡中添加Playsound(string as_filename,integer ai_option) return integer函数

代码如下

uint lui_numdevslui_numdevs = WaveOutGetNumDevs() 
If lui_numdevs > 0 Then sndPlaySoundA(as_filename,ai_option)return 1
Elsereturn -1
End If

③ 在w_main窗口的Function List 选项卡中添加xx2dx(decimal ls) return string函数

代码如下

string dx_sz,dx_dw,str_int,str_dec,dx_str,fu,a,b,b2,c,d,result
long num_int,num_dec,len_int,i,a_int,ppdx_sz = "零壹贰叁肆伍陆柒捌玖" 
dx_dw = "万仟佰拾亿仟佰拾万仟佰拾元" //处理小于零情况
if ls<0 thenls = ls*(-1) fu = "负" 
else fu = "" 
end if //取得整数及整数串
dx_str = string(ls)
if (ls>0) and (ls<1) then dx_str = "0"+dx_str 
pp = pos(dx_str,".") 
if pp>0 then str_int = mid(dx_str,1,pos(dx_str,".")-1)
elsestr_int = dx_str 
end if 
num_int = long(str_int) //取得小数及小数串
if (ls>0) and (ls<1) then num_dec = ls * 100
elsenum_dec = (ls - num_int) * 100 
end if 
str_dec = string(num_dec) 
len_int = len(str_int) 
dx_str = "" //转换整整部分
for i = 1 to len_int //a为小写数字字符,b为对应的大写字符,c为对应大写单位,d为当前大写字符串的最后一个汉字a= mid(str_int,i,1) a_int = long(a) b = mid(dx_sz,(a_int*2)+1,2) c = mid(dx_dw,((13 - len_int +i - 1)*2+1),2) if dx_str<>"" thend=mid(dx_str,len(dx_str)-1,2)elsed= "" end if if (b="零") and ((d="零") or (b=b2) or (c="元") or (c="万") or (c="亿")) then  b = "" if (a="0") and (c<>"元") and (c<>"万") and (c<>"亿") then c="" if ((c="元") or (c="万") or (c="亿")) and (d="零") and (a="0") thendx_str = mid(dx_str,1,len(dx_str)-2) d=mid(dx_str,len(dx_str)-1,2) if ((c="元") and (d="万")) or ((c="万") and (d="亿")) then c = "" end if dx_str = dx_str + b+ c b2 = b 
next//处理金额小于1的情况if len(dx_str) <= 2 then dx_str= "" //转换小数部分if (num_dec<10) and (ls>0) thena_int = long(str_dec) b = mid(dx_sz,(a_int*2+1),2) if num_dec = 0 then dx_str = dx_str + "整" if num_dec > 0 then dx_str = dx_str +"零"+b+"分" end ifif num_dec >= 10 thena_int = long(mid(str_dec,1,1)) a = mid(dx_sz,(a_int*2+1),2) a_int = long(mid(str_dec,2,1)) b = mid(dx_sz,(a_int*2+1),2) if a<>"零" then a = a+"角" if b <> "零" thenb = b+"分"else b= "" end ifdx_str = dx_str + a + b end ifif ls= 0 then dx_str = "零元整" dx_str = fu+dx_str result = dx_str return result

④ 将事先准备好的.wav格式声音放到项目temp目录下

事下准备好的声音

语音包小凡已经上传的百度网盘了,需要的小伙伴自行下载哈

链接:https://pan.baidu.com/s/17sPGYC21fvzw4ebgXll74A?pwd=8888
提取码:8888

⑤在w_main窗口的cb_1按钮的Clicked事件 中添加如下代码

integer i,count
string ls_current_path
//获取项目当前路径
ls_current_path = GetCurrentDirectory()st_3.text = xx2dx(dec(sle_1.text))count = len(st_3.text)for i= 1 to count step 2CHOOSE CASE mid(st_3.text,i,2)CASE "零"playsound(ls_current_path+"\temp\0.wav",0)				CASE "壹"playsound(ls_current_path+"\temp\1.wav",0)				CASE "贰"playsound(ls_current_path+"\temp\2.wav",0)				CASE "叁"playsound(ls_current_path+"\temp\3.wav",0)				CASE "肆"playsound(ls_current_path+"\temp\4.wav",0)				CASE "伍"playsound(ls_current_path+"\temp\5.wav",0)				CASE "陆"playsound(ls_current_path+"\temp\6.wav",0)				CASE "柒"playsound(ls_current_path+"\temp\7.wav",0)				CASE "捌"playsound(ls_current_path+"\temp\8.wav",0)				CASE "玖"playsound(ls_current_path+"\temp\9.wav",0)				CASE "拾"playsound(ls_current_path+"\temp\十.wav",0)				CASE "佰"playsound(ls_current_path+"\temp\佰.wav",0)				CASE "仟"playsound(ls_current_path+"\temp\仟.wav",0)				CASE "万"playsound(ls_current_path+"\temp\万.wav",0)				CASE "亿"playsound(ls_current_path+"\temp\亿.wav",0)				CASE "元"playsound(ls_current_path+"\temp\元.wav",0)				CASE "角"playsound(ls_current_path+"\temp\角.wav",0)				CASE "分"playsound(ls_current_path+"\temp\分.wav",0)				CASE "整"playsound(ls_current_path+"\temp\整.wav",0)				END CHOOSE
next

⑥ 在cb_2退出按钮的Clicked事件中添加如下代码

close(parent)

⑦ 在开发界面左边的System Tree窗口中双击exampleapp应用对象,并在其Open事件中添加如下代码

open(w_main)

五、运行程序

代码写完了,来检验下我们的劳动成果。

金额语音播报

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

我们下期再见 ヾ(•ω•`)o (●’◡’●)

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

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

相关文章

关于在word中使用Axmath的报错的解决

介绍 Axmath是数学公式编辑器软件。官网如下。 AxMath/AxGlyph/AxCells (amyxun.com) 支持正版。 在word中使用Axmath 点击word中的“文件”→“选项”。 选择“加载项” 选择“word加载项” 在Axmath默认的安装目录如下&#xff1a; C:\Program Files (x86)\AxMathhao&am…

【头歌】HBase扫描与过滤答案 解除复制粘贴限制

解除复制粘贴限制 当作者遇到这个限制的时候火气起来了三分&#xff0c;然后去网上搜索答案&#xff0c;然后发现了一位【碳烤小肥肠】居然不贴代码&#xff0c;XX链接&#xff0c;贴截图&#xff0c;瞬时火气冲顶&#xff0c;怒写此文 首先启动万能的控制台&#xff0c;然后C…

5年Android 开发者的社招面经总结(值得你记录收藏)

4. 分别代表什么含义&#xff0c;他们有什么区别&#xff1f; 5. 了解过 Java 的集合吗&#xff1f; 6. 说说 HashMap 的底层实现原理&#xff1f; 7. ArrayList 和 LinkedList 的区别&#xff1f; 8. Java 集合中哪些是线程安全的&#xff1f; 9. JVM 的内存…

中年帕金森:守护健康,从容面对生活挑战

在快节奏的现代生活中&#xff0c;中年人群面临着越来越多的健康挑战。其中&#xff0c;帕金森病作为一种常见的神经系统疾病&#xff0c;逐渐引起了人们的关注。帕金森病不仅影响患者的身体健康&#xff0c;还对其日常生活造成极大的困扰。那么&#xff0c;我们该如何应对中年…

智慧分流:探索互联网与物联网的负载均衡技术

数字化时代&#xff0c;个人认为&#xff0c;无论是互联网还是物联网&#xff0c;还是其他网&#xff0c;在各个层级&#xff0c;都对系统的稳定性和效率提出了更高的要求。负载均衡技术作为保障系统平稳运行的关键&#xff0c;其重要性不言而喻。在数字世界的海洋中&#xff0…

在哪里可以查到一手的标讯信息?

标讯信息集招投标讯息的简称。在市场上&#xff0c;标讯是一种非常关键的信息&#xff0c;包括招标公告&#xff0c;文件&#xff0c;截止日期等关键内容&#xff0c;便于需求方和供应商进行业务合作。 对于企业来说&#xff0c;及时获取到最新的标讯信息是非常重要的&#xf…

MySQL8新特性:窗口函数

目录 一、 概念二、语法基本语法语法解析进阶语法命名窗口WINDOW AS框架FRAME_CLAUSE 三、窗口函数ROW_NUMBERRANKDENSE_RANKPERCENT_RANKCUME_DISTFIRST_VALUE与LAST_VALUENTH_VALUELAG与LEADNTILE 四、窗口函数使用事项五、窗口函数优化方法六、面试常问&#xff08;持续更新…

设计模式-创建型-04-建造者模式

1、盖房项目需求 1&#xff09;需要建房子&#xff1a;这一过程为打桩、砌墙、封顶2&#xff09;房子有各种各样的&#xff0c;比如普通房&#xff0c;高楼&#xff0c;别墅&#xff0c;各种房子的过程虽然一样&#xff0c;但是要求不要相同的3&#xff09;请编写程序&#xf…

【1990-2023】上市公司高新技术企业数据(Excel+stata)+do代码

数据简介&#xff1a;根据《上市公司资质认定信息文件》 数据进行整理。筛选“认定项目类型” 为“高新技术企业”&#xff1b;筛选“认定对象身份”为“上市公司本身”&#xff0c;根据“认定时间”和“有效期限”判断当年是否为高新技术企业。有效期限通常为3年&#xff0c;缺…

华为手环9省电设置

1、 手环开启熄屏显示续航约3天&#xff0c;原因为屏幕持续常亮显示&#xff1b;如不需要可通过手环“设置->表盘->熄屏显示”路径进行关闭&#xff1b; 2、 手环具备后台健康自动检测功能&#xff0c;您可根据需要选择是否使用或关闭&#xff1a; &#xff08;1&#x…

实用软件分享-----一款免费的人工智能替换face的神器

专栏介绍:本专栏主要分享一些实用的软件(Po Jie版); 声明1:软件不保证时效性;只能保证在写本文时,该软件是可用的;不保证后续时间该软件能一直正常运行;不保证没有bug;如果软件不可用了,我知道后会第一时间在题目上注明(已失效)。介意者请勿订阅。 声明2:本专栏的…

DoIP——step2:车辆发现

文章目录 前言一、IP地址配置1.1 AutoIP1.2 DHCP1.3 DoIP实体的IP地址配置流程二、车辆发现车辆声明报文内容如下:前言 完成诊断设备到车辆的物理连接并通过激活线使能诊断连接后边缘节点将会将连接状态传递至应用层,在开始车辆发现过程之前,需要先进行各自的IP地址配置,获…

海外媒体发稿渠道和方法有哪些?如何选择靠谱的国外媒体发稿服务商?

在选择海外媒体发稿服务商时&#xff0c;以下是一些关键点可以帮助您找到靠谱的服务商&#xff1a; 服务商的经验和口碑&#xff1a;查找该服务商在行业内的声誉和客户评价。拥有丰富经验和良好口碑的服务商通常更可靠。 媒体资源和覆盖范围&#xff1a;了解服务商所能提供的媒…

Python并行编程技术与方法详解:线程池、进程池及优化策略

目录 一、引言 二、线程池 线程池的概念 Python中的线程池实现 线程池的优缺点 三、进程池 进程池的概念 Python中的进程池实现 进程池的优缺点 四、优化策略 合理设置线程池和进程池的大小 任务的拆分与合并 使用队列和锁等同步机制 选择合适的并行框架 五、异…

【机器学习300问】121、RNN是如何生成文本的?

当RNN模型训练好后&#xff0c;如何让他生成一个句子&#xff1f;其实就是一个RNN前向传播的过程。通常遵循以下的步骤。 &#xff08;1&#xff09;初始化 文本生成可以什么都不给&#xff0c;让他生成一首诗。首先&#xff0c;你需要确定采样的起始点。这可以是一个特殊的开…

MySQL-DDL(Data Definition Language)

078-对表结构进行增删改操作 增删改表结构DDL&#xff08;Data Definition Language&#xff09; 创建一个学生表 create table t_student( no bigint, name varchar(255), age int comment 年龄 );查看建表语句 show create table t_student;修改表名 alter table 表名 r…

Linux网络 - HTTP协议

文章目录 前言一、HTTP协议1.urlurl特殊字符 requestrespond 总结 前言 上一章内容我们讲了在应用层制定了我们自己自定义的协议、序列化和反序列化。 协议的制定相对来讲还是比较麻烦的&#xff0c;不过既然应用层的协议制定是必要的&#xff0c;那么肯定已经有许多计算机大佬…

C++使用spdlog输出日志文件

参考博客&#xff1a; 日志记录库 spdlog 基础使用_spdlog 写日志-CSDN博客 GitHub - gabime/spdlog: Fast C logging library. 首先在github上下载spdlog源码&#xff0c;不想编译成库的话&#xff0c;可以直接使用源码&#xff0c;将include文件夹下的spdlog文件夹&#x…

示例:WPF中TreeView自定义TreeNode泛型绑定对象

一、目的&#xff1a;在开发中经常需要绑定TreeView&#xff0c;所以定义了一个泛型的TreeNode<T>用来方便绑定对象和复用 二、实现 public partial class TreeNodeBase<T> : SelectBindable<T>, ITreeNode{public TreeNodeBase(T t) : base(t){}private Obs…

MySQL常见的命令

MySQL常见的命令 查看数据库&#xff08;注意添加分号&#xff09; show databases;进入到某个库 use 库; 例如&#xff1a;进入test use test;显示表格 show tables;直接展示某个库里面的表 show tables from 库&#xff1b; 例如&#xff1a;展示mysql中的表格 show tabl…