标题:VB6编程交流—“助读器”(自创)的程序设计 (上传程序和源文件、分析算法 ...
取消只看楼主
nhjsjjs
Rank: 1
等 级:新手上路
威 望:1
帖 子:17
专家分:0
注 册:2016-9-4
结帖率:100%
 问题点数:0 回复次数:1 
VB6编程交流—“助读器”(自创)的程序设计 (上传程序和源文件、分析算法和代码。代码并不复杂)
    上台发言可以带着发言稿,但是始终低头看稿不妥;而离稿后,再看稿又得急匆匆地寻找“当前句子”,这是其一。二是“语速”问题:准备好是10分钟,而上台后由于紧张,语速没把控好,时间过短过长,又是件尴尬的事。这个软件就是针对这两个问题而设计的。看了插图你就会明白:文本中的红色句子,就是当前的位置(按“句”突出显示);而红色句子底下逐渐延伸的“下划线”,则指示了“当前该念的字”(接近)。由此可以让你控制好你的语速。

    当然,由此又会引发出一些新的问题。比如:在“脱稿发挥”时,需要“暂停”;想要临时跳过某些内容时,需要“直接进入下一句”等等。“助读器”都必须要安排相应的控制键。
由于程序的代码并不是很复杂,我试着与读者解释、交流一下。下面有上面提到的两个关键问题:
1.要“按句突出显示(红色)”,用什么方法来把文本按“指定的标点”分割为“句”呢?
   核心的语句是:     RT1.Span  ",。?!;", True, True      
      其中RT1是 “RTF文本框”,Span 是它的方法, 双引号内是“指定的字符”。   功能是:寻找指定的字符(标点),并选中经过的字。
例如:    ……午茶和晚茶。早茶通常清晨4时开市,很多顾客……
   当光标(起始点)在“。”和“早”之间时,执行这行语句后,会★自动选中 “早茶通常清晨4时开市”这10个字。而光标(起始点)★仍然在“。”和“早”之间。
2.语速问题:每分钟字数的计算与控制
  《助读器》必须要能对“语速”进行设置和调节。“语速”的单位通常是:字数/分钟。而在我这样的“助读器”,需要知道的是:“当前句(红色)”保持的“时间”,单位是:毫秒,它等于:每个字保持的时间(毫秒/字)乘以这句的“字数”。我们不能调节“字数”(乘数),但可以调节“被乘数”。
它与“语速”之间是什么关系呢?又如何来进行调节呢?可以看出,两者正好是“倒数”关系。
    例如: “语速”为 150字/1分钟,它的倒数是 1分钟/150字=60000毫秒/150字=6000\15(毫秒/字),正是前面说的“被乘数”。如果我们的 Timer 控件的“事件”是“1字1次”的话,“每个字保持的时间(毫秒/字)”不就是★Timer控件的Interval属性吗?如果我们用 H*10(H是个变量) 表示“语速”的话,Timer的Interval 就等于 60000\(H*10)=★6000\H 了。改变 H 的值就可以调节速度了。并且,当 H=20 时,语速就是200字/分钟。
当Timer 控件计数的累加值超过该句的“字数”时,启动了相关的过程,红色就会自动“转移”到下一句去了。
注意: RT1文本框的 Enabled 属性为 False,所以,它的“滚动条”、窗口等等都无法用鼠标去单击、使用。(如果允许使用的话,程序立刻大乱)
      Text1本框的 Locked  属性为 True, 所以,它的“内容”无法改动。(不允许改动,仅是借它作为操作台)
尽管源文件里有全部的代码,但我还是将其中最“难”、使用最频繁的“核心过程”贴在下面。如果你能理解,那其余的都不在话下了。
Private Sub Displ() '更新显示红色★每一句都要执行的子过程
'停止计时--红变灰--移动到新起点--灰变红--开始计时
Timer1.Enabled = False
RT1.Span ",。?!;", True, True '找标点  朝旧红色串方向(文尾方向)
DoEvents
RT1.SelLength = RT1.SelLength + 1 '包含了“标点”
RT1.SelColor = RGB(150, 150, 150) '旧红串变灰色
RT1.SelUnderline = False
RT1.SelStart = RT1.SelStart + RT1.SelLength '起点进到下一句
RT1.Span ",。?!;", True, True '向文尾方向找标点
DoEvents
RT1.SelLength = RT1.SelLength + 1 ''包含了“标点”
Tmax = RT1.SelLength'Tmax是红色句子的字数(长度)
'----
If Tmax = 0 Then '文本结束
        Timer1.Enabled = False
        Exit Sub
End If
'----
RT1.SelColor = RGB(255, 0, 0) '红色
RT1.SelUnderline = False
Tmin = 0
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
Tmin = Tmin + 1
RT1.SelLength = Tmin '红句逐字
RT1.SelUnderline = True '红句逐字加下划线
If Tmin > Tmax Then 'Tmax是红色句子的字数(长度)
    RT1.SelUnderline = False
    Timer1.Enabled = False
    Tmin = 0
    Displ
End If
End Sub

为了方便阅读代码,我在代码页中加了许多注释。如有疑问,或发现错误或不足,敬请留言。我会尽力解答并真诚感谢。
助读器.rar (100.49 KB)


[此贴子已经被作者于2021-10-13 21:53编辑过]

搜索更多相关主题的帖子: Sub False 字数 代码 毫秒 
2021-10-13 21:31
nhjsjjs
Rank: 1
等 级:新手上路
威 望:1
帖 子:17
专家分:0
注 册:2016-9-4
得分:0 
增加3行代码,可以弥补一个小小的瑕疵。
原来这个程序运行时,总是要“直到当前句子来到窗口底部时才自动向上滚动”。这使得“当前句子”一直显示在窗口的底部,不大美观。
于是我在过程“Displ()”的最后增加3句代码:
……
'----
If Tmax = 0 Then '文本结束
        Timer1.Enabled = False
        Exit Sub
End If
'----
RT1.SelColor = RGB(255, 0, 0) '红色
RT1.SelUnderline = False
'以下3行的作用是:红色的当前句子不用走到窗口底部,就会“自动向上滚动”。
    k = RT1.SelStart '记住起始点的位置。变量k的类型是long(长整形)★需要在过程的首行先“定义”一下。
    RT1.SelStart = RT1.SelStart + 60 '这个60可以适当调整,用意是让“起始点”往前“冲”60个字,于是“当前句子”就可以“离开”窗口底部了
    RT1.SelStart = k '起始点回到原来的位置
'以上的3行是我这次新增加的
Tmin = 0
Timer1.Enabled = True
End Sub


[此贴子已经被作者于2021-10-26 12:53编辑过]

2021-10-26 12:48



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




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

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