基于VB6.0的定时任务随机铃声闹钟_第1页
基于VB6.0的定时任务随机铃声闹钟_第2页
基于VB6.0的定时任务随机铃声闹钟_第3页
基于VB6.0的定时任务随机铃声闹钟_第4页
基于VB6.0的定时任务随机铃声闹钟_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、重庆理工大学专业综合设计基于vb6.0的定时任务随机铃声闹钟学生学号: 学生姓名: 专业班级: 指导教师: 起止日期: 2012.12 2013.1 重庆理工大学chongqing university of technology重庆理工大学专业综合设计专业综合设计任务书一、设计题目:基于bv6.0的随机铃声定时任务闹钟二、设计目的:1、掌握microsoft visual basic 6.0的基本操作;2、掌握microsoft visual basic 6.0中基本和部分进阶控件的使用;3、熟练掌握面向对象的程序设计方法;4、掌握利用setup factory 9.0打包成安装包的方法。三

2、、设计任务及要求: 设计并实现定时任务的闹钟。下载microsoft visual basic 6.0。闹钟具有以下基本功能:1、具有日期、星期、时、分、秒显示;2、具有定时执行程序和关机、重启的功能;3、具有随机调用铃声的功能。四、设计时间及进度安排:设计时间共三周(2012.12.192013.1.7),具体安排如下表:周安排设 计 内 容设计时间第一周查阅相关资料,掌握一些程序的设计方法。2012.12.192012.12.26第二周进行主程序的设计。2012.12.272013.1.2第三周调试、完善、测试程序。2013.1.32013.1.7五、指导教师评语及学生成绩指导教师评语:年

3、 月 日成绩指导教师(签字):- i -目 录专业综合设计任务书i第1章 任务的提出1第2章 方案论证22.1 已有闹钟软件的参考22.2 软件随机函数22.2.1 rnd函数22.2.2 randomize32.3 数组的使用3第3章 程序设计43.1 主窗口43.1.1 主窗口mainform.frm43.1.2 主窗口编程界面43.2 设置窗口63.2.1 设置窗口setform.frm63.2.2 设置窗口编程界面7第4章 程序调试运行安装94.1 调试错误94.1.1 实时错误 7694.1.2 实时错误 994.1.3 实时错误 13104.1.4 “确定”按钮无用104.1.5

4、程序退出不完全104.2 程序运行114.2.1 闹钟的设置114.2.2 闹钟的运行124.3 程序打包134.4 结束语14参考文献15附录16附录一 程序完整代码16主窗口(mainform.frm)16设置窗口(setform.frm)18附录二 参考程序代码19附录三 程序流程图23- 21 -第1章 任务的提出专业综合设计是学生理论联系实际的重要实践教学环节,是对学生进行的一次综合性专业设计训练。通过专业综合设计使学生获得以下几方面能力,为毕业设计(论文)奠定基础。现代人的生活节奏越来越快,电脑也已经成为了人们不可缺少的一个可以说是日常生活用品的东西,它已经完全融入了我们的生活。于

5、是,在电脑上掌控时间的想法便应运而生。这个闹钟小软件的设计想法就由此而来。第2章 方案论证全国进行软件设计的学生很多都进行过闹钟的设计,将变量进行随机取值的语句也很常见,所以这个方案具体实施起来难度不会太大。2.1 已有闹钟软件的参考图 2-1 已有闹钟主界面 图2-1是华东理工大学长江学院计算机科学与技术专业甘文俊学生的闹钟程序主界面。基于小组三人能力所限,本组所完成的闹钟软件是以甘文俊同学的作品作为主要参考对象的,所以不可避免地在程序代码或界面设计上有一定的雷同,但绝大部分是小组成员独立完成的。经一段时间的学习,总结本次设计所用到的随机过程的基本原理为2.22.3章节。2.2 软件随机函数

6、2.2.1 rnd函数在microsoft visual basic 6.0 sp6编写环境中,随机过程的实现是调用程序中的rnd函数。它是通过计算机通过计算得到的伪随机方法,不过这不影响本软件的编写。使用rnd函数后,程序返回一个包含随机数值的single。要实现一个整数的随机具体的代码如下:int (upperbound - lowerbound + 1) * rnd + lowerbound) (2-1)上段代码中,upperbound是随机数范围的上限,lowerbound是随机数范围的下限。例如要实现随机生成1到5之间的整数的代码如下:dim tt = int(5 * rnd) +

7、1) (2-2)2.2.2 randomize在microsoft visual basic 6.0环境下,仅使用代码2-2会得到一些重复的随机数序列。假如使用代码2-2得到的随机数序列为3-1-2-5-1,那么在下个随机过程后得到的序列也为3-1-2-5-1。要想得到不重复的随机数序列,则需要在调用rnd函数前使用randomize。如果这样,那么第二次随机过程后得到的随机数序列则可能为2-2-5-3-4。代码2-2则变为:dim trandomizet = int(5* rnd) + 1) (2-3)2.3 数组的使用数组是在程序设计中为了处理方便把具有相同类型的若干变量按有序的形式组织起

8、来的一种形式,这些按序排列的同类数据元素的集合成为数组。在本软件中,在sound文件夹下的所有*.mp3和*.wma音频文件即为“相同类型的若干变量”,要在程序中方便地使用这些音频文件就要用到数组。若把a定义为数组的名称,数组的元素为每个音频的地址,则数组的定义为:dim a() as string (2-4)代码2-4中,括号中是用来设定数组a的范围的,若没有特殊要求,在定义数组的时候一般不写,避免出现“下标越界”的错误。本次设计中所涉及到的均为一维数组,二维数组不予说明。第3章 程序设计3.1 主窗口3.1.1 主窗口mainform.frm图 3-1 程序主窗口如图3-1所示,为本软件的

9、打开后的主窗口。提示有日期、星期、时间、设定时间,用户可交互的有设定闹钟提示信息文本框、闹钟开始按钮、闹钟停止按钮、设定按钮和退出按钮。在输入闹钟提示信息的文本框内,用户可输入设定时间到后,闹钟所弹出的提示信息。出于界面简洁的考虑,作有30个字的字数限制。用户在设定好闹钟后,须点击“开始”按钮,闹钟才会开始工作。同样,不希望闹钟工作时,只需点击“停止”按钮即可。(图中闹钟尚未点击“开始”按钮,“停止”按钮处于不可用状态。)3.1.2 主窗口编程界面图 3-2 主窗口vb界面vb编程中主窗口的控件摆放如图3-2.。其中含有label标签5个,commandbutton按钮4个,timer时间控件

10、2个,textbox文本框2个,filelistbox文件表1个,windowsmediaplayer多媒体播放控件1个。其中label1显示的是日期和星期提示,label2显示的是时间;label3和label4是固定文字提示;label5是闹钟设定时间提示。textbox1是输入闹钟提示信息的,textbox3是作保存用户指定定时启动程序路径之用。filelistbox读取的sound文件夹下文件。windowsmediaplayer控件用来进行铃声的播放。timer时钟控件是vb中与时间有关的一个控件,在这次设计中,应用到了两个timer,他们起到软件“启动闹钟”的功能。两个timer的

11、interval属性都设置为1000,其意义是“返回/设置两次调用timer控件的timer事件间隔的毫秒数”为1000,即每秒触发一次timer事件。timer2是启动程序时其enable值 = true的控件,他的作用是在启动时显示日期、星期、时间以及判断安装路径下是否有“sound”文件夹,若没有则创建该创建该文件夹,以免程序运行后出现“找不到路径”错误。判断语句采用“dir”语句。其代码如下:if dir(app.path + sound, vbdirectory) = thenmkdir (app.path + sound) (3-1)在点击“开始”按钮后,timer1的enable

12、 = true,timer2的enable = false,timer1和timer2交换工作。timer1是本软件的核心控件,它是闹钟功能得以实现的基础。它共有以下几个功能代码:1. 读入安装路径下“sound”文件夹下的mp3和wma音频文件file1.path = app.path + sound file1.pattern = *.mp3;*.wmaredim a(0 to file1.listcount + 1) as string for i = 0 to file1.listcounta(i) = file1.path & & file1.list(i)next (3-2)代码3

13、-2中,redim语句下数组a的上限为file.listcount + 1的原因是后面的数组a(i)的下标为i,本段代码运行后的i值变为文件夹中音频文件的数量+1,为避免出现“下标越界”的错误,故要修改上限。这样,音频文件的路径就存入了数组a(i)中。2. 闹钟响铃功能首先判定用户设置的是否为闹钟,如果是,那么当设定时间到后,启动铃声并弹出对话框提醒用户。在启动铃声之前,还要进行指定文件夹下是否有文件的判断,若有则进行铃声随机,若没有则播放默认铃声。其具体代码为:if dir(file1.path & *.*) = thenwindowsmediaplayer1.url = app.path

14、+ alarm.mp3windowsmediaplayer1.controls.playelse: randomizerd = int(i - 1) * rnd + 0) windowsmediaplayer1.url = a(rd)windowsmediaplayer1.controls.playend if (3-3)在代码3-3中,由于i值比读取文件数量多1,故在随机过程中需 -1,使随机数的上限正确;而程序默认每个文件的编号从0开始,所以随机过程的下限设置为0。3. 重启功能若用户设置的定时任务为重启,则执行如下代码:shell shutdown -r -t 30 (3-4)4. 关机

15、功能若用户设置的定时任务为关机,则执行如下代码:shell shutdown -s -t 30 (3-5)5. 定时执行程序功能若用户设置的定时任务为启动程序,则执行如下代码:shell text3.texttimer1.enabled = falsetimer2.enabled = true (3-6)在上面的3条语句中,shell的功能同在“运行”中输入相应语句。3.2 设置窗口3.2.1 设置窗口setform.frm通过点击主窗口中的“设定”按钮进入闹钟的设定程序,其运行界面为:图 3-3 设定窗口设定窗口分为上下两个框架。上框架为时间设定框架,包含有设定的提示时间,默认是00:00:

16、00,设定的动作,默认为闹钟。还有选择设定时间和动作的下拉菜单,以及确认添加/修改提醒时间的按钮。下框架为启动程序设定框架。当用户选择的动作为“启动程序时”下方的“浏览”可用,用户可以选择一个可执行文件(*.exe)来作为定时启动目标。框架中有程序名的提示以及程序路径的提示/输入框。3.2.2 设置窗口编程界面vb中设置窗口的控件摆放如图3-4。上下两个frame框架包含有两个不同的部分。上部分frame的caption为时间设定。其中有固定文字提示的label1和label3,提示设定时间的label2,提示设定动作的label4。有combobox4个:combo1、combo2、comb

17、o3、combo4,分别设置时间“时”“分”“秒”和设置“动作”。以及一个确认commandbutton按钮。下部分frame的caption为启动程序设定。其中有一个固定文字提示label5,提示启动程序名的label6,和键入/提示启动路径的textbox,以及浏览路径command按钮。在框架之外是设置窗口的确定和取消commandbutton按钮,以及一个文件选择控件commondialog。当点击“浏览”按钮选择执行程序路径时,显示commondialog1,控件只可读*.exe文件。当用户选择完成以后,text1显示所选路径,label6的caption显示所选文件的文件名,其具体

18、代码如下:图 3-4 设定窗口vb界面commondialog1.filter = 可执行文件(*.exe)|*.exe commondialog1.filterindex = 1commondialog1.showopentext1.text = commondialog1.filenamelabel6.caption = dir(text1.text) (3-7)点击窗口“确定”按钮,弹出确定保存提示框,当用户确定后,通过代码3-8把设定的时间信息和程序启动路径信息赋给主窗口中的控件,以达到“确定保存”的目的。mainform.label5.caption = label2.caption

19、mainform.text3.text = label6.caption (3-8)第4章 程序调试运行安装4.1 调试错误4.1.1 实时错误 76代码3-1起到了一个判断是否有文件夹的作用。在调试中,由于安装路径下没有“sound”文件夹,并且没有加入代码3-1,则就会出现路径未找到的实时错误。图 4-1 实时错误 764.1.2 实时错误 9代码3-2和代码3-3的随机过程,数组a()和i值的设置以及rnd函数的使用不当都会带来实时错误9(图4-2),及下标越界。图 4-2 实时错误9“下标越界”是指在程序中引用了不存在的数组元素,使得下标可能比下标范围大或小,或是在应用程序中这一边的数

20、组没有指定范围。检查数组的声明以确认其上界和下界。解决办法之一是数组重新指定范围,使用 ubound 和 lbound 函数来决定数组访问。如果索引指定为变量,应检查变量名的拼写。4.1.3 实时错误 13在设置窗口setform.frm中,因为没有加入相应的避错提示,导致在赋给label2.caption时间变量的时候出现类型不匹配的实时错误(图4-3)。其解决办法是加入避错提示代码(4-1)。图4-3 实时错误 13if combo1.text = then msgbox (请选择时!) elseif combo2.text = then msgbox (请选择分!) elseif com

21、bo3.text = then msgbox (请选择秒!)else: t = combo1.text & : & combo2.text & : & combo3.textlabel2.caption = tend if (4-1)4.1.4 “确定”按钮无用在设定窗口无论点击“确定”与否,其设定的时间和动作信息都会赋给主窗口。出现这个问题的原因是没有加入过渡变量而直接使用了设定窗口中的值,导致主窗口忽视了“确定”按钮的功能,显得按钮功能失效。其解决办法是加入代码3-8。4.1.5 程序退出不完全最后进行测试时,关闭程序之后,我们发现在任务管理器中还存在有程序的进程。后来研究发现是写退出代码

22、的时候忽略了设置窗口,仅把主窗口的“退出”按钮代码写为4-2的形式。private sub exit_click()unload meend sub (4-2)其解决代码为4-3:private sub exit_click()unload meunload setformend sub (4-3)4.2 程序运行4.2.1 闹钟的设置如图4-4,以闹钟为测试对象,把闹钟提醒时间设定为15:00:00。图 4-4 测试闹钟设置界面点击下方“确定”按钮后出现图4-5的提示框,确认后提示设定成功(图4-6)。图 4-5 设置保存提示图 4-6 设定成功提示4.2.2 闹钟的运行设定成功后,主窗口提

23、示设定时间,并且随时可修改提示文字。点击“开始”按钮,闹钟开始工作。(图4-7)图 4-7 闹钟的运行到达设定时间,程序弹出提示信息(图4-8),并响起默认铃声。图 4-8 设定时间到在以上测试中,安装路径的sound文件夹下并没有铃声,所以提示铃声为默认。以后多次测试时,我们加入了5个音频文件,并实现了随机播放的效果。重启、关机、启动任务等测试均取得了成功,在此不一一列举。4.3 程序打包由于软件在microsoft visual basic 6.0下编译,并使用了一些默认控件以外的控件,如commondiaglog和windowsmediaplayer控件,这就导致在没有安装vb软件的计算

24、机上无法运行本程序。于是需要进行程序打包操作,把程序运行需要的文件打包成一个安装文件,在没有vb软件的计算机上进行安装,以保证软件的正常运行。我们采用的是利用setup factory 9.0这款软件来进行打包,它会自动扫描在编写软件时用到的控件,并把控件打包成*.ocx文件,在安装整个程序的时候安装在系统盘下的windowssystem32(winxp/vista/win7)文件夹下。图 4-9打包部分界面在进行好相关的设置之后,点击“构建”按钮即可开始文件的打包工作。静待一段时间后,打包完成(图4-10)得到完整的安装文件。图 4-10 打包完成界面4.4 结束语经过数天的程序设计和调试,

25、本次设计终于取得了成功,软件正常运行,大小bug排除了十余个,得到了最终软件成品。结论通过本次为期三周的专业综合设计,我们小组最终做出了一个软件闹钟成品,它是我们小组成员心血的结晶。小组在参考了数个已有闹钟软件后,发现并没有我们作品所设计的随机播放铃声功能,所以我们决定把它作为一个创新点来进行设计。并且也很少有定时任务这一功能。虽然我们知道定时任务在windows系统的“计划任务”功能里已经很完善了,但是我们还是想自己亲手做一做,把它集成到一个软件里面。这次的设计充分锻炼了我们的实际动手操作和变成能力,是对所学知识的一次检验。在整个过程中,设计和调试各占了一半的时间,这使我们懂得了调试程序的重

26、要性。当然也还有这个小软件不足的地方,即是还没有实现循环闹钟和多个闹钟的功能。初步了解后,需要把闹钟设置的时间以文档形式存储起来,在下次启动的时候调用文档数据。由于时间有限,我们并没有进行相关的设计。最后要感谢王飞指导老师在设计过程中对我们小组的督促和建议,以及张子木同学在设计过程中给予的一些帮助和建议。没有他们,本次设计不会顺利完成。参考文献1 明日科技. visual basic从入门到精通m.第三版. 北京:清华大学出版社,20122 王学军,张玉梅 主编. visual basic程序设计m. 北京:中国铁道出版社,20083 杨克玉 主编. vb6.0程序设计实训教程m. 北京:机械

27、工业出版社,20054 胡鸣 主编. windows网络编程技术m. 北京:科学出版社,20085 董正言 主编. 面向对象程序设计. 北京:清华大学出版社,2010.86 甘文俊. 附录附录一 程序完整代码主窗口(mainform.frm)dim a() as stringprivate sub mainform_load() mainform.autoredraw = true windowsmediaplayer1.settings.volume = 100end subprivate sub form_queryunload(cancel as integer, unloadmode

28、as integer) if msgbox(确定退出?, vbyesno) = vbno then 退出确认 cancel = 1 end ifend subprivate sub set_click() setform.show mainform.enabled = falseend subprivate sub exit_click() unload me unload setformend subprivate sub start_click() timer2.enabled = false 点击开始两个timer交换工作 timer1.enabled = true stopalarm.

29、enabled = true start.enabled = falseend subprivate sub stopalarm_click() timer2.enabled = true timer1.enabled = false start.enabled = true stopalarm.enabled = false if setform.label4 = 关机 then shell shutdown -a elseif setform.label4 = 重启 then shell shutdown -a end ifend subprivate sub timer1_timer()

30、 时间显示 label1.caption = 今天是 & year(date) & 年 & month(date) & 月 & day(date) & 日 & 星期 & weekday(now) - 1 label2.caption = time$ file1.path = app.path + sound 读取安装路径sound文件夹下的音频文件 file1.pattern = *.mp3;*.wma redim a(0 to file1.listcount + 1) as string 文件读入数组 for i = 0 to file1.listcount a(i) = file1.pat

31、h & & file1.list(i) next dim settime as date settime = label5.caption 闹钟定时任务主程序 if setform.label4 = 闹钟 then if time$ = settime then if dir(file1.path & *.*) = then windowsmediaplayer1.url = app.path + alarm.mp3 windowsmediaplayer1.controls.play else: randomize rd = int(i - 1) * rnd + 0) 随机过程 windows

32、mediaplayer1.url = a(rd) windowsmediaplayer1.controls.play end if if text1.text = then if msgbox(设定时间到!, vbokonly, 设定时间到!) = vbok then windowsmediaplayer1.controls.stop timer1.enabled = false timer功能交换 timer2.enabled = true stopalarm.enabled = false start.enabled = true end if elseif msgbox(text1.te

33、xt, vbokonly, 设定时间到!) = vbok then windowsmediaplayer1.controls.stop timer1.enabled = false timer2.enabled = true stopalarm.enabled = false start.enabled = true end if end if elseif setform.label4 = 重启 then if time$ = settime then shell shutdown -r -t 30 end if elseif setform.label4 = 关机 then if time

34、$ = settime then shell shutdown -s -t 30 end if else: if time$ = settime then shell text3.text timer1.enabled = false timer2.enabled = true stopalarm.enabled = false start.enabled = true end if end ifend subprivate sub timer2_timer() label1.caption = 今天是 & year(date) & 年 & month(date) & 月 & day(date

35、) & 日 & 星期 & weekday(now) - 1 label2.caption = time$ 判断文件夹存在,否则创建该文件夹 if dir(app.path + sound, vbdirectory) = then mkdir (app.path + sound) end ifend sub设置窗口(setform.frm)dim filename as stringdim t as dateoption explicitprivate sub combo4_click() label4.caption = combo4.textend subprivate sub comman

36、d1_click() commondialog1.filter = 可执行文件(*.exe)|*.exe 文件选择 commondialog1.filterindex = 1 commondialog1.showopen text1.text = commondialog1.filename label6.caption = dir(text1.text)end subprivate sub command2_click() 保存提示 if msgbox(确定保存?, vbyesno) = vbyes then setform.hide mainform.enabled = true main

37、form.show mainform.label5.caption = label2.caption mainform.text3.text = label6.caption msgbox (设定成功,请点击【开始】激活闹钟!) end ifend subprivate sub command3_click() setform.hide mainform.enabled = true mainform.showend subprivate sub command4_click() 避错提示 if combo1.text = then msgbox (请选择时!) elseif combo2.t

38、ext = then msgbox (请选择分!) elseif combo3.text = then msgbox (请选择秒!) else: t = combo1.text & : & combo2.text & : & combo3.text label2.caption = t end if if label4.caption = 启动程序 then command1.enabled = true end ifend sub附录二 参考程序代码1、自动加载form1,初始化所有控件的数据,并且读取指定路径的文件中数据,然后将读出的数据用选择排序法,按先后顺序排序,最后记录比统时间大的最

39、小时间数据,以便闹钟判断。、private sub form_load()dim i as integer, a as integer, tmp as datefilenum = freefileopen d:time.dat for random as filenum len = len(t(i)lastrecord = lof(filenum) / len(t(i)if lastrecord 0 thenredim t(lastrecord - 1), t1(lastrecord - 1)elseredim t(0), t1(0)end iffor i = 1 to lastrecordg

40、et filenum, i, t(i - 1)t1(i - 1) = timeserial(val(t(i - 1).shizhong), val(t(i - 1).fenzhong), 0)next iclose filenumfor i = 0 to lastrecord - 2 for a = i + 1 to lastrecord - 1 if t1(a) t1(i) then tmp = t1(a) t1(a) = t1(i) t1(i) = tmp end if next anext ifor i = 0 to lastrecord - 1if t1(i) time thenb =

41、 t1(i)exit forend ifif i = lastrecord - 1 thenb = t1(0)exit forend ifnext iend sub2、单击command1加载form2,以便用户设定闹钟时间和闹钟音乐。并且同时是form1失效。 private sub command1_click()form2.showform1.enabled = falseend sub3、加载form2,使得form2的所有控件初始化数据,然后用户可以设置多个闹钟时间,并将其存储在指定的文件中,以供以后读取。 用户还可以设定闹钟音乐,系统记录下音乐路径,并在label1中显示。priv

42、ate t as timepublic filenum as integerpublic lastrecord as longpublic position as longprivate sub command1_click()commondialog1.filter = allfile(*.*)|*.*|音乐(.mp3)|*.mp3|音频(.wma)|*.wmacommondialog1.filterindex = 2commondialog1.showopenlabel1.caption = commondialog1.filenameend subprivate sub command2

43、_click()msgbox 确定保存, 33, 确定close filenumunload meform1.enabled = trueend subprivate sub command3_click()unload meform1.enabled = trueend subprivate sub form_load()dim d as string, our as string, min as string, i as integera = 0filenum = freefileopen d:time.dat for random as filenum len = len(t)if lo

44、f(filenum) 0 thenlastrecord = lof(filenum) / len(t)for i = 1 to lastrecord get filenum, i, t d = t.shiduan our = t.shizhong min = t.fenzhong list1.list(i - 1) = d list1.list(i - 1) = list1.list(i - 1) & our list1.list(i - 1) = list1.list(i - 1) & : list1.list(i - 1) = list1.list(i - 1) & minnext iend ifend subprivate sub command4_click()list1.additem combo1.t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论