标题:分享三,语音播报控件,大家指正
只看楼主
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
结帖率:100%
已结贴  问题点数:20 回复次数:18 
分享三,语音播报控件,大家指正
控件使用的是SAPI自动化语音转换

属性说明:
* rate:播报语速。缺省为5,取值范围:1~10,10为最快语速
* volume:播报音量。缺省为100,取值范围:10~100,100为最大音量
* keyrate:缺省为空,为记录最后设置的语音速率的标识文字,下次进入时可按最后一次设置的速率播报
* keyvolume:缺省为空,为记录最后设置的语音音量的标识文字,下次进入时可按最后一次设置的音量播报

播报:
* speak(cText,nMode):
    cText:播报内容,
    nMode:2-内容将完整播报不被打断(缺省),3-如有后续语音播报,则本条播报内容会被打断

使用方法:
在表单中放置本控件,在其他程序中需要播报的地方调用
调用方法举例:
thisform.mvioce1.speak('你好,这是完整播报的语音测试',2)
thisform.mvioce1.speak('你好,这是可被打断的语音测试,这是可被打断的语音测试',3)
inkey(1)
thisform.mvioce1.speak('本内容会打断前一句语音播报',3)

注:WIN10下通常可直接使用,WIN7(现在应该没什么人在用了)需要安装语音补丁

附件中的test是应用示例
单词拼写错了(应该是VOICE),已经在很多地方用了,所以只能将错就错了

语音播报.zip (5.87 KB)

搜索更多相关主题的帖子: 语音 控件 内容 thisform 分享 
2021-11-15 09:10
sam_jiang
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:542
专家分:781
注 册:2021-10-13
得分:10 
2021-11-15 13:50
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:10 
回复 楼主 laowan001
laowan001版主的具体应用是成功的。
有空看一看我的帖子,把前后几步连接成一个程序。那里分了四步走。
"优化程序或者从新编写求四生素数中项不能合成的偶数"

素数问题的解决是我学习编程永恒的动力。
2021-11-15 14:22
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:0 
回复 3楼 独木星空
你帖子里那么多程序,不知道你说的哪个,方便的话把相关程序和数据打个包发来
你研究的领域对我是陌生的,所以只能从程序角度看能不能帮上忙
2021-11-15 15:40
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 4楼 laowan001
如果想对一种算法提出好的建议,或进行优化,或者把一个问题分步骤完成的工作,进行整合成一个连贯的程序,而不再分步完成,就得对这个问题有个基本面上的了解。所以先生的想法是非常正确的。
现在我简单的把这个问题,做一个说明,那里有一些符合某些条件的数据,例如模5余数为1,或者为2,其他正整数不参与运算,求x+y=N的正整数解组数,x,y只能取模5余数是1,或者2的数,其余的余数类不能取,编程获得不同N值的正整数解组数。
在这个问题上,余数1+余数1=余数2,余数1+余数2=余数3,余数2+余数2=余数4,余数0或余数1不能被合成,所以mod(N,5)=0,或者=1的N值无解,现在的问题是:N模5余数为2,3,4的正整数解组数是多少,或者找出那些无解的N值(当然模5余数是0或者1的不用考虑,因为它们永远无解)。
      最早的方法,是两边夹击法,即判断一个N值是否有解,先找到最大的一个取值(接近N的值),然后再把指针移到最小的一个数值上(所给数据区域中的),判断它们相加的值与N的大小关系,如果比N值小,则把小数值往大的方向移动一条记录,这时,判断大小关系,如果又大了,则把大的数值往小的方向移动一条记录,如果大小值的和正好为N,就跳本次循环,执行下一个N值。
      大概就是解决一个这样的问题。

素数问题的解决是我学习编程永恒的动力。
2021-11-15 22:02
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
优化程序或者从新编写求四生素数中项不能合成的偶数
* 以大定小选配素数对
LOCAL xjl,djl,ts,xss,dss,kssj,tj
CLEAR
SELECT 1
USE D:\vfp温习\L8四生素数尾素不能合成数.DBF ALIAS 素数对    &&素数对表结构:偶数、统计
SELECT 2
USE D:\vfp温习\L8四生素数真表.DBF  ALIAS 素数表
kssj=SECONDS()
FOR i=23000001  to 24000000
@ 3,6 say i
    n=i
       X=8+(INT((n-INT((n-1)/5)*5)/2)+(n-INT((n-1)/5)*5))*30+INT((n-1)/5)*210 &&这是在给被判偶数置数,思路每5个偶数构成一个循环期,步长210。
          Y=X/2   &&求出偶数的中值(上一条置数语句,除了外步长210,还有内步长30,但是有2个间断点,所以有些复杂。
        SELECT 素数表
        LOCATE FOR 四素>X
        DO CASE
                CASE EOF()
                        GO Bottom
                CASE 四素>X
                        SKIP -1
        ENDCASE
        xjl=1
        djl=RECNO()
        t=.T.
        DO WHILE t
                dss=四素
                GO xjl
                xss=四素
                                              &&放在这里比较合适,这里原来显示小素数的值,去掉了。
                IF xss<Y+1 OR dss>Y-1                              &&判断跳出语句如果放在后面,有时出现一个重复素数对
                          t=.T.
                          ELSE
                          t=.F.                                       &&跳出命令
                ENDIF                                               &&结束判断
                DO CASE
                        CASE xss+dss>X
                                GO djl
                                SKIP -1
                                djl=RECNO()
                        CASE xss+dss=X
                                EXIT
                        CASE xss+dss<X
                                GO xjl
                                SKIP
                                xjl=RECNO()
                                GO djl
                ENDCASE
        ENDDO
        IF xss>Y OR dss<Y
        SELECT 素数对
                                APPEND BLANK
                                REPLACE 偶数 WITH X
        ENDIF
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是我编写的程序,下一贴把四生素数表(最末的一项代表值,即一组四生素数用最末的一个素数代替),发上来,还有存储表:不能被合成的偶数。
这是安上楼的思路给出的算法。

素数问题的解决是我学习编程永恒的动力。
2021-11-15 22:03
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 4楼 laowan001
现在的问题,我不想用那种算法了,因为执行效率太低。想用一套新算法,那个算法是一个一个的处理N值,现在的算法是成批的计算,即反其道而行,不找那些不能合成的数,反过来计算N值有多少正整数解组数。用加法,把数据源分成若干份,然后对它们处理,获得合成结果数表。
SELECT 1
USE G:\三角递增法\四生素数表中.DBF ALIAS 四中表
SELECT 2
USE G:\三角递增法\各段四生素数个数安整周期.DBF ALIAS 四生个数表细分周期
SELECT 3
USE G:\三角递增法\偶数表新密.DBF ALIAS 偶数表新密
kssj=SECONDS()
bwjm="偶数周期表"
 For i=2 to 100
      @ 5,12 say i
      wd=bwjm+ALLTRIM(STR(i-1))
      USE IN 3
      USE G:\三角递增法\偶数表新密.DBF ALIAS 偶数表新密
       SELECT 3
     
       DELETE ALL
       PACK
       FOR j=1 TO INT(i/2)
        @ 15,22 say j
        SELECT  2     
        GO j
        zgs1=总个数
        fgs1=分个数
        SELECT  2
        GO i-j
        zgs2=总个数
        fgs2=分个数
           SELECT 1
           GO zgs1-fgs1+1
               FOR k1=1  TO  fgs1
               A=四中
               jl1=recno()
                 SELECT  1
                 GO zgs2-fgs2+1
                 For k2=1 to fgs2
                 jl2=recno()
                 B=四中
                 C=A+B
                 SELECT 3
                 APPEND BLANK   
                 REPLACE 偶数 WITH C   
                 SELECT 1
                 GO jl2+1
                 ENDFOR
               SELECT 1
               GO jl1+1
             ENDFOR   
          ENDFOR
       SELECT 3
       USE IN 3&&打开,或关闭,那个工作区(或者,写别名)
      
       select * from 偶数表新密.dbf DISTINCT INTO table G:\三角递增法\&wd
      USE IN &wd
      SELECT 3
      USE IN  3
    ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")

素数问题的解决是我学习编程永恒的动力。
2021-11-15 22:14
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
上楼是第一步,先制作合成结果表。

素数问题的解决是我学习编程永恒的动力。
2021-11-15 22:15
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
SELECT 239
USE G:\三角递增法\无偶数表总表.DBF ALIAS 无偶数总表
SELECT 187
USE G:\三角递增法\偶数周期表187.DBF ALIAS 偶周期187
SELECT 188
USE G:\三角递增法\偶数周期表188.DBF ALIAS 偶周期188
SELECT 189
USE G:\三角递增法\偶数周期表189.DBF ALIAS 偶周期189
SELECT 190
USE G:\三角递增法\偶数周期表190.DBF ALIAS 偶周期190
SELECT 191
USE G:\三角递增法\偶数周期表191.DBF ALIAS 偶周期191
SELECT 192
USE G:\三角递增法\偶数周期表192.DBF ALIAS 偶周期192
SELECT 193
USE G:\三角递增法\偶数周期表193.DBF ALIAS 偶周期193
SELECT 194
USE G:\三角递增法\偶数周期表194.DBF ALIAS 偶周期194
SELECT 195
USE G:\三角递增法\偶数周期表195.DBF ALIAS 偶周期195
SELECT 196
USE G:\三角递增法\偶数周期表196.DBF ALIAS 偶周期196
SELECT 197
USE G:\三角递增法\偶数周期表197.DBF ALIAS 偶周期197
SELECT 198
USE G:\三角递增法\偶数周期表198.DBF ALIAS 偶周期198
SELECT 199
USE G:\三角递增法\偶数周期表199.DBF ALIAS 偶周期199
SELECT 200
USE G:\三角递增法\偶数周期表200.DBF ALIAS 偶周期200
SELECT 201
USE G:\三角递增法\偶数周期表201.DBF ALIAS 偶周期201
SELECT 202
USE G:\三角递增法\偶数周期表202.DBF ALIAS 偶周期202
SELECT 203
USE G:\三角递增法\偶数周期表203.DBF ALIAS 偶周期203
SELECT 204
USE G:\三角递增法\偶数周期表204.DBF ALIAS 偶周期204
kssj=SECONDS()
bwjm="偶周期"
For j=187 to 204
      @ 5,12 say j
     k=j
      wd=bwjm+ALLTRIM(STR(j))
&& CLOSE DATABASES
&& SET COMPATIBLE ON
&& OPEN DATABASE (HOME(2) + 'data\testdata')

&& SELECT 1  && 未使用的工作区
 && USE  G:\三角递增法\&WD ALIAS n && 打开 Customer 表
      For i=(j-1)*500000+1 to (j+1)*500000

      @ 5,12 say i
      n=i
      s=0
      IF MOD(n,5)=1
      s=s+30
      ENDIF
      IF MOD(n,5)=2
      s=s+90
      ENDIF
      IF MOD(n,5)=3
      s=s+120
      ENDIF
      IF MOD(n,5)=4
      s=s+180
      ENDIF
      IF MOD(n,5)=0
      s=s+210
      ENDIF
     
      wou=INT((n-1)/5)*210+s
      SELECT "偶周期"+ALLTRIM(STR(k))
      
      
         && select G:\三角递增法\&WD..DBF IN 0
       A=偶数
         IF A=wou
         SELECT "偶周期"+ALLTRIM(STR(k))
         skip
         LOOP
         ELSE
         SELECT 239
         APPEND BLANK
         REPLACE 无偶 WITH wou
         ENDIF
   
     ENDFOR
ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是第二步,把那些没有解的偶数值找到,如果前后表都无解,则偶数值出现2次,如果只是其中的一个表无解,则说明该偶数有解,下一步就是找那些有两次无解的偶数。

素数问题的解决是我学习编程永恒的动力。
2021-11-15 22:20
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
CLOSE DATA
USE G:\三角递增法\无偶数表总表.dbf && 设源表的名称为"表1"
P=''
FOR K=1 TO FCOUNT()
P=P+IIF(EMPTY(P),'',',')+FIELDS(K)&& 取得表中所有字段名称,放在P中
ENDFOR

SELECT *,COUNT(FIELDS(1)) AS 相同记录数 FROM DBF() GROUP BY &P. INTO DBF G:\三角递增法\相同记录数表总11 && 取得各记录的相同记录数及其各字段值
SELECT * FROM DBF() WHERE 相同记录数>1 && 该查询结果详细列举了表1中各重复记录的 重复数
USE IN   相同记录数表总11
统计相同记录数,为下一步做准备
这是第三步

素数问题的解决是我学习编程永恒的动力。
2021-11-15 22:21



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-507521-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.062259 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved