会说话的ABAP report

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/i042416/article/details/79679319

report z.

INCLUDE ole2incl.

DATA: ole   TYPE ole2_object,

      voice TYPE ole2_object,

      text  TYPE string.

text = 'With the advent of ES6 (referred to as ES2015 from here on), which not only made promises native to the language without requiring one of the countless available libraries,'

&& 'we also got generators. Generators have the ability to pause execution' &&

'within a function, which means that by wrapping them in a utility function, ' &&

'we have the ability to wait for an asynchronous operation to finish before' &&

' moving on to the next line of code. Suddenly your asynchronous code could' &&

' start to look synchronous!'.

DATA: it_tline TYPE STANDARD TABLE OF tline.

CREATE OBJECT voice 'SAPI.SpVoice'.

CALL METHOD OF voice 'Speak' = ole

   EXPORTING #1 = text.

*

用的也是很老的OLE技术:

report代码直接call的MS的sound engine,通过sapi.dll暴露出来,

这个report只是call了dll里其中一个speak方法:


要获取更多Jerry的原创技术文章,请关注公众号”汪子熙”或者扫描下面二维码:

展开阅读全文

说话的钟

01-17

我们经常都可以看见并听到有种会用人的声音来报时的钟,似乎有点神秘^__^,下面我们一块儿来研究一下让钟说话的VB咒语。rn新建一个标准EXE工程,在窗体的声明部分加入:rnDim tmpStr As String'声明全局变量用于储存当前时间rn在窗体上加上一个Timer控件,将其命名为timGo,Enabled属性为True,Interval属性为1000,让它每隔一秒运动一次。双击它并在timGo_Timer()事件中加入以下代码:rnCls '打印新时间之前清除以前的文字rn tmpStr = Format(Time, "hh:mm:ss") '格式化时间rn DrawText 77, 77, Format(Time, "hh:mm:ss"), vbBlue, 44 '打印时间rn DoEvents '转让控制权rn其中:DrawText()代码如下:rnPublic Sub DrawText(x, y, strText As String, colorcode, size)rn 'x--文字左上角基点横坐标rn 'y--文字左上角基点纵坐标rn 'strText--要打印的文字rn 'colorcode--颜色号rn 'size--文字大小rn Dim tmpClor '保存当前前景色rn tmpClor = ForeColorrn '设置左上角基点rn CurrentX = xrn CurrentY = yrn ForeColor = colorcode '设置文字颜色(前景色)rn FontSize = size '设置文字大小rn Print strText '打印文字rn ForeColor = tmpClor '恢复前景色rnEnd Subrn每台计算机上的时间显示格式都不尽相同,因此我们在读出时间之前要对时间进行格式化,使其以"小时小时:分分:秒秒"的格式来显示。rn现在,我们来想想我们是怎样读时间的,如上面的15:16:37,我们就可以这么读"一十五点一十六分三十七秒",因此,我们将时间保存在tmpStr这个字符变量中,并依次扫描出每个字符,判断该读什么音,如果遇上":"则读"点",但只能读一次,因为下一个冒号的位置应读"分",最后读"秒"。以二十四小时制,中间的数如"15"就应该在"1"和"5"之间加读一次"十",遇上两位都是"0"的只应读一次"零"(有谁昏了?120!!)。这种分析是有点让人头痛,但你仔细想一下就会明白了。rn现在,添加一个模块,并在其中加入:rnPublic Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Longrn这个函数就是我们要用来使钟"说话"的关键函数。rn在写下一步的代码之前,请准备这几个文件:0.wav--9.wav,分别是一至九的读音,now.wav--"现在时刻",dot.wav--"点",min.wav--"分",sec.wav--"秒",ten.wav--"十",并放在工程文件保存的目录下(App.Path)。这些音频你可以Windows的用录音机来录,最好是用CoolEditPro来录,还可以加入各种特效,如电流声,可以使你的声音变得像机器人的声音^_~。rn现在,在窗体上加入一CommandButton控件,改名为cmdSpk并在其Click()事件中加入如下代码:rnPrivate Sub cmdSpk_Click()rn Dim i, flag As Integerrn '声明i为循环计数器,flag为标志计数器rn flag = 0 '设置初始值rn PlaySound App.Path & "\now.wav", 0, 0 '"现在时刻:"rn rn For i = 1 To 8 '从最左边开始,时间字符串长度为8rn '1 5 :1 6 :3 7 这一行是时间字符串rn '1 2 3 4 5 6 7 8 这一行是对应的字符的位数rn flag = flag + 1 '标志累加,与相应字符相对应.rn If Not (flag = 8 And Mid(tmpStr, i, 1) = "0") Then '如果最后一位数不是"0"rn If Not (flag = 5 And Mid(tmpStr, i, 1) = "0") Then '如果第5位数不是"0"rn If Not (flag = 2 And Mid(tmpStr, i, 1) = "0") Then '如果第2位数不是"0"rn If Mid(tmpStr, i, 1) <> ":" Then '如果当前值不为":"rn PlaySound App.Path & "\" & Mid(tmpStr, i, 1) & ".wav", 0, 0 rn'播放相应的声音文件rn End Ifrn End Ifrn End Ifrn End If rn If Mid(tmpStr, i, 1) <> "0" Then '如果有十位数rn If flag = 1 Or flag = 4 Or flag = 7 Then'只在需要的地方读出rn PlaySound App.Path & "\ten.wav", 0, 0 '"十"rn End Ifrn End Ifrn If flag = 2 Then '遇上":"rn PlaySound App.Path & "\dot.wav", 0, 0 '"点"rn End Ifrn If flag = 5 Thenrn PlaySound App.Path & "\min.wav", 0, 0 '分rn End Ifrn If flag = 8 Thenrn PlaySound App.Path & "\sec.wav", 0, 0 '秒rn End Ifrn Next irnEnd Subrn看完上面的代码,你不难发现,我们用了一个小小的技巧来让其发出正确的读音,就是用相应的WAV文件名来保存读音,这种方法很笨,但至少可以达到预期效果^_^rn另外,你还可根据这个原型开发出定时报时系统哦(谁扔了个臭鸡蛋?)。rnrn 论坛

没有更多推荐了,返回首页