|
|
用户名:zxrock1984 笔名:MVP心情 地区: 山东-烟台 行业:其他 |
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
小时候找到的藏宝图,总是浮现在脑海中。 永远在寻找奇迹之地,不输给远方的某人。 现在每天都充满尘埃。 何时所有的一切都随时间而过。 如果世界能够改变,对于一无所知的我。 带我走吧,为了重拾童年的回忆。 小时候所唱的歌,总在温暖着梦之心。 大家都仿效过的秘密的旋律,现在更加动听。 现在我仍在叹息每个人都还没有真正抓住梦想。 如果时间能够倒流,回到初识泪水的我。 带我走吧,为了不再寂寞。。。
声明
(作者置顶)
爱由一个笑容开始,用一个吻来成长,用一滴泪来结束
操作系统原理课件(PPT格式)
今年山东专升本竟然又要考这个东西了,郁闷,放上刚从网上搜集的课件,希望对大家有用。另附2006年山东计算机专业专升本招生院校。
课件下载地址:http://zxrock1984.bokee.com/inc/OperatingSystem.rar
不放心的下载完了可以先对压缩包查毒。
我的个人简历
前几天在http://www.savalo.com申请了个免费空间,今天把我的简历放上去吧,有兴趣的可以去看看
。网址:http://free6.savalo.com/itsmine/resume.htm
留言本地址:http://free.savalo.com/gbook/index.asp?username=itsmine
专升本考试时间提前了。。。
郁闷啊,还什么都没复习好来,他怎么说提前就真提前了啊,真受不了这帮“领导”了,一年一个样,想到什么就是什么,真是$&@$#&%^@*&^*&!^@%*"$&@$
气死人,抓紧复习吧
。。。
欲知后事如何,请待1月8日后分解
用VB编的贪吃蛇游戏~
闲着没事用VB编出来的贪吃蛇游戏~哇咔咔~有兴趣可以下载玩玩
http://zxrock1984.bokee.com/inc/Snake.rar
游戏说明:F1开始游戏 F2游戏暂停/继续 F4退出游戏 F5关于
游戏每到达100分速度加快一个等级,一共八个速度等级,到达700分时为最高速度,那你都能存活下来的话你就无敌了
哈哈~祝您玩得愉快~!
不放心的怕有病毒有木马的可以先杀毒再运行~
免费空间
不像之前在虎翼申请的那个,一进去看见下面的广告就觉得恶心
回BB的问题:在博客中嵌入地图
当初为这个问题我也痛苦了好几天呢>.< 好在后来终于研究出来了~在链接的描述中加入如下代码(不包括引号)“<iframe frameborder='0' name='showmap' id=mapshow src='http://blog.mapbar.com/blogmap/showmap.jsp?nid=05091613235705780558&width=160&height=223' width='190' height='303' scrolling='no'></iframe>”。中间的“src=”后面填上你地图的URL就行了~
回复得有些晚了,见谅哦~ :P
事件,DoEvents,闲置循环和控时循环中的难点问题
关键问题归于doevents 函数
DoEvents函数的功能是:转让控制权,以便让操作系统处理其它的事件。
问:为什么要用doevents?
A.在需要用某一循环处理相当耗时或者很快速的代码时,就需要用到它,以便用户能在起处理过程中能做其他事情,即程序能被控制,而不是无响应状态
B.vb6.0中多线程vb代码极度不稳定,而且无法调试,所以vb中的多线程用的很少(注:是指vb的代码在多线程中运行时不稳定)
C.timer控件可以起到后台运行作用,但其是通过事件控制,一是不稳定,二是速度太慢,如果想用其处理高速又耗系统的代码更本不能达到预期的效果
下面将其某些用法和难点简介如下:
(注: '** 后面的代码表示如果在该处用了这个语句
以下代码中用到了一些api函数,请用vb附带的api浏览器查阅)
一. 基本用法:
1.窗体启动时如果要处理的事务太多或者有个很耗时的循环导致程序不响应,怎么办?
例如:
Private Sub Form_Load()
Show
'**DoEvents
For i = 1 To 9999999
n = n * i
Next i
End Sub
窗体虽然出来了,但好象只达到了一半,如果加上第3句,将看到效果大不相同.如果无'**,在循环过程中程序无法处理事件,对于用户来说是不响应,无法控制的
2.想在循环中看到处理过程?
同样:
Dim L As Long
For L = 1 To 10000
'** DoEvents
Text1.Text=Cstr(l)
Next L
无'** 时将无法看到text1中的变化,而只在循环结束时看到最后结果
3.怎样中止循环?
问:我要实现一个类似Windows复制(移动)文件时的提示窗体,耗时很长,且要求中断后能继续未完成的操作,不知使用DoEvents从长循环中跳出后,程序将从何处开始继续执行,是否是从DoEvents所在的Sub开始?
答:事实上仅使用DoEvents,并不意味着从长循环中跳出。DoEvents只是允许用户选择其他按钮而已,不中断循环,不管用户如何操作,都继续执行DoEvents后面的语句,即使用户按下了中断按钮,你的循环仍然在继续,甚至你关闭了窗体,程序仍然继续在后台运行。正确的中断处理是这样的:
(1)、建立一个全局或窗体变量bRun。
(2)、在启动循环前设置bRun为True。
bRun = True
While bRun And (....)
....
DoEvents
Wend
...
(3)、在中断按钮Click事件中加入代码:
bRun = False
(4)、在Form_Unload事件中加入代码:
bRun = False
这样一旦用户按下了中断按钮,bRun = False,循环的条件就不满足了,所以退出循环,执行后续语句。你也可以采用下面的方式:
bRun = True
While ....
If Not bRun Then
Exit Sub
End If
....
DoEvents
Wend
...
有些人喜欢用end语句来结束程序,小程序固然可以,但当太大,或者调用了某些特殊的api函数后可能导致预想不到的错误,如果装载了许多东西在程序结束时不处理将卸载很慢,而且这种做法也极不符合正规软件的要求...总之end语句毛病很多,此不详谈,建议少使用甚至不使用
二. 其基本用法大概就这些,现在解析其中的一些[难点]
1.为什么还是不能结束?
代码如下:
Dim IsExit As Boolean
Private Sub Command1_Click()
Dim L As Long
IsExit = False
Do
If IsExit = True Then Exit Do '句0
DoEvents '** 句1
Text1.Text = CStr(L) '** 句2
L = L + 1
Loop
End Sub
Private Sub Form_Load()
Static N As Long
N = N + 1
MsgBox N
End Sub
Private Sub Form_Unload(Cancel As Integer)
IsExit = True
End Sub
运行结果:启动时msg显示1,点击command1,text1在变化
此时再点form右上角的小差(关闭窗体),发现vb运行控制上的按扭并没变化,说明程序还在运行.如果编译成程序后运行,按下ctrl+del+alt也可发现它还没结束.
通过读代码,并没发现错误,怎么回事?
关键在于 句2 访问了控件的属性
代码运行路径:当在doevents 时,程序释放控制权,可以接收事件消息,form-unload事件只能从此处产生,假设此时关闭form ,unload事件发生,即doevents后就运行unload代码,得到isexit=t,并且form卸载,代码返回到doevents 之后,运行 句2.注意现在form 已经卸载了,text1从哪里来呢?
于是form重新装载,代码跳到form_load模块运行,所以在关闭窗体后可以看到msg 显示2,此模块运行完后再继续句2后面的代码,当下次循环遇到 句0时退出循环
另:既然退出了循环,怎么还不能结束?
vb程序规定(其实其他的windows语言一样):窗体卸载时并不是立即卸载其模块代码,而只先卸载窗体中的控件和一些属性值,程序中最后一个窗体卸载时才完全卸载.
在这个单窗体程序中,form卸载时因为循环的控制无法卸载代码,失去了卸载代码的机会,导致再也不能卸载(因为没卸载代码,所以运行的 句2 是并不会出错)
另:既然再次运行了form_load代码,怎么看不见窗体?
因为程序启动时窗体的到显示的消息,而只运行此模块并没有(如果在msgbox n语句前加上show,就可以看到它了)
如何解决?
通过以上分析,应该很简单,把句1 和句2调换一下就可以了,关键:
<仔细分析代码是如何运行的,避免在form已经卸载了情况下访问控件>
2.用了doevents速度太慢了怎么办?
doevents的代价是速度变慢,但要程序响应又不得不用
其实doevents语句允许任何应用程序执行相关事件,而不仅仅是你自己的程序,所以变得很慢.
可以让它响应本程序事件动作,需要用到api函数GetInputState
例如用: If GetInputState() Then DoEvents '来代替doevents可使循环运行更快
3.既要同时响应事件又要控件不变化,怎么办?
例如在一个长的循环中向listview控件中添加记录,无doevents时程序无响应,但有它时控件又闪的厉害
解决办法:a.不一定每次循环都doevents,可以在适当时间时才用,至少没那么闪
b.应用api函数 ValidateRect 功能是使指定的矩型区域生效,通知Windows不对指定的区域进行重画 另:InvalidateRect 功能相反,同时需要用到函数 GetClientRect 取得指定对象的矩形区域 应用*rect函数指定listview的矩形区不重画,即可避免闪烁(但还是要注意恢复重画,否则看不见了真实效果)
DoEvents应用
转让控制权,以便让操作系统处理其它的事件。就是转让系统控制权给CPU,好让CPU有空闲时间处理其他的事情,比如重新显示页面、处理键盘或者鼠标的事件等。可以在循环内部加上DoEvents语句,这样可以防止程序死锁,不过要注意,在比较长的循环里,每执行一句都用DoEvents语句的话会增加系统的开销,降低程序的速度。所以最好判断一下,比如每执行100次或者更多的次数执行一次DoEvents语句。
DoEvents 函数会返回一个 Integer,以代表 Visual Basic 独立版本中打开的窗体数目,例如,Visual Basic,专业版,在其它的应用程序中,DoEvents 返回 0。
DoEvents 会将控制权传给操作系统。当操作系统处理完队列中的事件,并且在 SendKeys 队列中的所有键也都已送出之后,返回控制权。
DoEvents 对于简化诸如允许用户取消一个已启动的过程 — 例如搜寻一个文件 — 特别有用。对于长时间过程,放弃控制权最好使用定时器或通过委派任务给 ActiveX EXE 部件来完成。以后,任务还是完全独立于应用程序,多任务及时间片由操作系统来处理。
小心 确保以 DoEvents 放弃控制权的过程,在第一次 DoEvents 返回之前,不能再次被其他部分的代码调用;否则会产生不可预料的结果。此外,如果其它的应用程序可能会和本过程以不可预知的方式进行交互操作,那么也不要使用 DoEvents,因为此时不能放弃控制权。
使用 DoEvents
尽管 Timer 事件是后台处理的最好工具,对耗时极多的任务,情况更是如此,但是,DoEvents 函数还是提供了一种取消任务的简便方法。例如,下列代码将显示一个 "Process" 按钮,单击这个按钮时,它将变成 "Cancel" 按钮。再次单击按钮又将中断正在执行的任务。
'此按钮标题是 "Process"
Private Sub Command1_Click()
'过程的所有实例都共享静态变量。
Static blnProcessing As Boolean
Dim lngCt As Long
Dim intYieldCt As Integer
Dim dblDummy As Double
'按下按钮时,检测是否在处理
If blnProcessing Then
'如果正在处理,则取消
blnProcessing = False
Else
Command1.Caption = "Cancel"
blnProcessing = True
lngCt = 0
'执行一百万次浮点乘法计算。每一千次后,检测是否要取消。
Do While blnProcessing And (lngCt < 1000000)
For intYieldCt = 1 To 1000
lngCt = lngCt + 1
dblDummy = lngCt * 3.14159
Next intYieldCt
'DoEvents 语句允许其它事件发生,包括第二次按此按钮。
DoEvents
Loop
blnProcessing = False
Command1.Caption = "Process"
MsgBox lngCt & " multiplications were performed"
End If
End Sub
DoEvents 将控制切换到操作环境内核。只要此环境中的所有应用程序都有机会响应待处理事件,应用程序就又恢复控制。这不会使应用程序放弃焦点,但会使后台事件能够得到处理。
这种妥协的结果可能并不总是达到预期目标。例如,下述 Click 事件代码在单击按钮后要一直等候十秒钟,而后才显示一条信息。如果在按钮正在等待期间单击它,则将以相反顺序完成单击操作。
Private Sub Command2_Click()
Static intClick As Integer
Dim intClickNumber As Integer
Dim dblEndTime As Double
'每次单击按钮时
'赋予唯一数值。
intClick = intClick + 1
intClickNumber = intClick
'等待十秒。
dblEndTime = Timer + 10#
Do While dblEndTime > Timer
'不做任何事情,仅仅允许
'其它应用程序处理
'它们的事件。
DoEvents
Loop
MsgBox "Click " & intClickNumber & " is finished"
End Sub
对于通过 DoEvents 放弃控制的事件过程,有时可能希望防止在 DoEvents 返回之前重新调用这一过程。否则将无穷无尽地调用该过程,直到系统资源消耗殆尽。可暂时禁止控件,或象上例一样,使用一个静态的“标志”变量防止此事发生。
在使用全局数据时避免 DoEvents
当一个函数已通过 DoEvents 放弃控制时,可相当安全地再次调用函数。例如,下一过程将检测质数并用 DoEvents 语句周期地启动其它应用程序处理事件:
Function PrimeStatus (TestVal As Long) As Integer
Dim Lim As Integer
PrimeStatus = True
Lim = Sqr(TestVal)
For I = 2 To Lim
If TestVal Mod I = 0 Then
PrimeStatus = False
Exit For
End If
If I Mod 200 = 0 Then DoEvents
Next I
End Function
该代码中每重复 200 次就调用一次 DoEvents 语句。这样一来,当该环境的其余部分对事件作出响应时,只要有必要,PrimeStatus 过程就可继续计算。
考虑在调用 DoEvents 期间发生的事情。在其它窗体和应用程序处理事件时将暂停执行应用程序代码。这些事件之一有可能是一个按钮单击操作,它将再次启动 PrimeStatus 过程。
这将导致重新进入 PrimeStatus 过程的,但是,因为在函数每次出现时,堆栈都为其参数和局部变量分配了空间,所以重入不会引发冲突。当然,如果过多调用 PrimeStatus,则可能出现“溢出堆栈空间”错误。
如果 PrimeStatus 使用或改变模块级变量或全局数据,情况就会完全不同。此时,在 DoEvents 能够返回之前执行 PrimeStatus 的另一个实例,这将导致模块数据或全局数据的值完全不同于它们在调用 DoEvents 之前的值。于是,PrimeStatus 的结果将会难以预料。
用VB查找文件夹
以查找"D:\"下所有文件夹为例:
在窗体上添加一个CommandButton,它的单击代码如下:
Private Sub Command1_Click()
mypath = "D:\" '将要查找的目录赋值给mypath
MyName = Dir(mypath, vbDirectory Or vbHidden Or vbNormal Or vbReadOnly Or vbSystem) '找到第一个入口
Do While MyName <> "" '开始循环
'忽略当前目录和子目录
If MyName <> "." And MyName <> ".." Then
'确保变量MyName取得的值是文件夹的名称
If (GetAttr(mypath & MyName) And vbDirectory) = vbDirectory Then
Print MyName '在窗体上打印出找到的文件夹
End If
End If
MyName = Dir '得到下一个文件名
Loop
End Sub
运行后单击命令按钮就可在窗体上显示出D:\所有的文件夹
Dir函数
返回一个 String,用以表示一个文件名、目录名或文件夹名称,它必须与指定的模式或文件属性、或磁盘卷标相匹配。
语法
Dir[(pathname[, attributes])]
Dir 函数的语法具有以下几个部分:
| 部分 | 描述 |
| pathname | 可选参数。用来指定文件名的字符串表达式,可能包含目录或文件夹、以及驱动器。如果没有找到 pathname,则会返回零长度字符串 ("")。 |
| attributes | 可选参数。常数或数值表达式,其总和用来指定文件属性。如果省略,则会返回匹配 pathname 但不包含属性的文件。 |
设置值
attributes 参数的设置可为:
| 常数 | 值 | 描述 |
| vbNormal | 0 | (缺省) 指定没有属性的文件。 |
| vbReadOnly | 1 | 指定无属性的只读文件 |
| vbHidden | 2 | 指定无属性的隐藏文件 |
| VbSystem | 4 | 指定无属性的系统文件 |
| vbVolume | 8 | 指定卷标文件;如果指定了其它属性,则忽略vbVolume |
| vbDirectory | 16 | 指定无属性文件及其路径和文件夹。 |
注意 这些常数是由 VBA 所指定的,在程序代码中的任何位置,可以使用这些常数来替换真正的数值。
说明
Dir 支持多字符 (*) 和单字符 (?) 的通配符来指定多重文件。
由于 Macintosh 不支持通配符,使用文件类型指定文件组。可以使用 MacID 函数指定文件类型而不用文件名。比如,下列语句返回当前文件夹中第一个TEXT文件的名称:
Dir("SomePath", MacID("TEXT"))
为选中文件夹中所有文件,指定一空串:
Dir("")
在 Microsoft Windows 中,如果在Dir函数中使用MacID函数,将产生错误。
任何大于256的attribute值都被认为是MacID 函数的值。
在第一次调用 Dir 函数时,必须指定 pathname,否则会产生错误。如果也指定了文件属性,那么就必须包括 pathname。
Dir 会返回匹配 pathname 的第一个文件名。若想得到其它匹配 pathname 的文件名,再一次调用 Dir,且不要使用参数。如果已没有合乎条件的文件,则 Dir 会返回一个零长度字符串 ("")。一旦返回值为零长度字符串,并要再次调用 Dir 时,就必须指定 pathname,否则会产生错误。不必访问到所有匹配当前 pathname 的文件名,就可以改变到一个新的 pathname 上。但是,不能以递归方式来调用 Dir 函数。以 vbDirectory 属性来调用 Dir 不能连续地返回子目录。
提示 由于文件名并不会以特别的次序来返回,所以可以将文件名存储在一个数组中,然后再对这个数组排序。
GetAttr函数
返回一个 Integer,此为一个文件、目录、或文件夹的属性。
语法
GetAttr(pathname)
必要的 pathname 参数是用来指定一个文件名的字符串表达式。pathname 可以包含目录或文件夹、以及驱动器。
返回值
由 GetAttr 返回的值,是下面这些属性值的总和:
| 常数 | 值 | 描述 |
| vbNormal | 0 | 常规 |
| vbReadOnly | 1 | 只读 |
| vbHidden | 2 | 隐藏 |
| vbSystem | 4 | 系统文件 |
| vbDirectory | 16 | 目录或文件夹 |
| vbArchive | 32 | 上次备份以后,文件已经改变 |
| vbalias | 64 | 指定的文件名是别名。 |
注意 这些常数是由 VBA 指定的,在程序代码中的任何位置,可以使用这些常数来替换真正的值。
说明
若要判断是否设置了某个属性,在 GetAttr 函数与想要得知的属性值之间使用 And 运算符与逐位比较。如果所得的结果不为零,则表示设置了这个属性值。例如,在下面的 And 表达式中,如果档案 (Archive) 属性没有设置,则返回值为零:
Result = GetAttr(FName) And vbArchive
如果文件的档案属性已设置,则返回非零的数值。