| VB问题全功略(17) [查找本页请按Ctrl+F] |
| 81、我已经知道 "电脑名称" 及
"LoginUser" 的抓法了, 我可以将电脑名称改成 LoginUser
吗? 82、反向思考---怎样让程序跑慢一点? 83、《打砖块》一颗在画面上跳动碰撞的小球 84、为什么有的程序的画面或控制项总是闪个不停,如何避免? 85、计算二个时间的时间差 81、我已经知道 "电脑名称" 及 "LoginUser" 的抓法了, 我可以将电脑名称改成 LoginUser 吗? 可以的, 请在声明区中放入以下声明: Private Declare Function SetComputerName Lib "kernel32" Alias "SetComputerNameA" (ByVal lpComputerName As String) As Long 程序中要使用时只要直接 call 即可. 例如: 要将电脑名称改成员工编号 "RT000588" Private Sub Command1_Click() Dim res As Long res = SetComputerName("RT000588") If res <> 0 Then MsgBox "成功!!!" Else MsgBox "有问题!!!" End If End Sub 虽然已经更改成功,但并不会马上有作用,所以在网路上的芳邻中,还会是旧的电脑名称,一直要等到重新开机之后才有作用。 82、反向思考---怎样让程序跑慢一点? 大部份时间,我们都希望我们自己开发的程序跑得越快越好,但是有些状况,我们却希望它能够稍微停一下,等待某一个返回值或某一个动作做完了,才继续执行下一个指令,可是偏偏 VB 没有提供这样的指令,我要怎样延迟一个VB程序呢 在声明区中加入以下声明: Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 在事件中只要 call 它即可 Call Sleep(1000) '1000代表延迟1秒 不过很抱歉,它只在 32位元中才有提供, 所以要在 VB4-32 位元以上才可使用 !!! 83、《打砖块》一颗在画面上跳动碰撞的小球 这个范例加以引申,就可以做出像一样的游戏! '在 Form 中放一个 Shape,Shape 属性设成 3-圆形,长宽设成 60 '在 Form 中放一个 Timer,Interval 属性设成 48 '声明二个 Form Level 或 Global 变数 (此范例声明在 Form 中) Dim horizan As Integer Dim vertical As Integer '在 Form_Load 设定每次水平或垂直移动的距离 Private Sub Form_Load() horizan = 50 '水平移动的距离 vertical = 50 '垂直移动的距离 End Sub '移动小球并检查是否超出四个边界 ? 若超过则改变方向. '注意: Me.Width 包含 Form 左右二边 Border 的宽度 ' Me.Height 包含 Form 上方 TitleBar 的高度及下方 Border 的高度 Private Sub Timer1_Timer() ball.Move ball.Left + horizan, ball.Top + vertical If ball.Top <= 0 Then vertical = -vertical If ball.Top + ball.Height >= Me.Height - 420 Then vertical = -vertical '扣除 420 是指 Form 上方 TitleBar 的高度 + 下方 Border 的高度 If ball.Left <= 0 Then horizan = -horizan If ball.Left + ball.Width >= Me.Width - 100 Then horizan = -horizan '扣除 120 是指 Form 左右二边 Border 的宽度 End Sub 如果是固定的 Form,以上的程序代码就已经完成了,但是如果 Form 的大小是可以调整的话,当您调整 Form 的大小后,小球的位置可能有一段时间会跑到荧幕外,要预防这种情形,必须再加上以下的程序代码: Private Sub Form_Resize() If ball.Top <= 0 Then ball.Top = -25 vertical = -vertical End If If ball.Top >= (Me.Height - 420) Then ball.Top = (Me.Height - 445) - ball.Height vertical = -vertical End If If ball.Left <= 0 Then ball.Left = -25 horizan = -horizan End If If ball.Left >= (Me.Width - 100) Then ball.Left = (Me.Width - 125) - ball.Width horizan = -horizan End If End Sub 运用时要做调整,主要就是调整以下二个因素: 1、每次水平或垂直移动的距离,就是 horizan / vertical 2、Timer 的间距,就是 Timer 的 Interval 注:其实要完整一点的话,还需要用 API 去抓出 Form 上方 TitleBar 的高度四方 Border 的宽度。 84、为什么有的程序的画面或控制项总是闪个不停,如何避免? 原因很多,但最主要的原因是 '不停地改变一些可能不需要改变的控制项属性',这些属性通常是一些会造成控制项 Repaint 的属性,例如:Enabled, Visible, Contents 及 Text。如果某一个物件的属性已经是您要设定的值,那就不要再设定一次,如此便会大大降低控制项闪动的频率。例如: If Not Command1.Enabled Then Command1.Enabled=True End If 以下是一个完成的 Module: Sub SetEnabled (ctrlIn as Control, bSetting as Integer) If ctrlIn.Enabled <> bSetting Then ctrlIn.Enabled=bSetting End If End Sub 85、计算二个时间的时间差 VB 有提供一些好用的日期时间计算函数,但是没有一个计算时间差的功能,有些人会说有的,是 DateDiff,但是,DateDiff 功能却不够,您可以算出二个时间所差的总日数、总时数或总秒数,但您算不出是相差几天几小时几分钟又几秒钟! 以下这个模组的功能就是计算二个时间之时间差: Function Convtime(date1 As Date, date2 As Date) As String ' '功能 : 计算二个时间的时间差 ' '参数 : date1 是较早的时间, Variant (Date)。 ' date2 是较晚的时间, Variant (Date)。 ' '若要计算两个日期之时间差,计算顺序是从 date1 到 date2 ' '返回值 : 时间差的组合字串, 例如 2年21天13小时5分钟3秒 ' Dim wsecond As Long '总秒数 / 剩余秒数 Dim wminute As Long '总分钟数 / 剩余分钟数 Dim whour As Long '总时数 / 剩余时数 Dim wday As Long '总天数 / 剩余天数 Dim wyear As Long '总年数 wsecond = DateDiff("s", date1, date2) '总秒数 If wsecond > 60 Then wminute = wsecond \ 60 '总分钟数 wsecond = wsecond Mod 60 '计算剩余秒数 End If If wminute > 60 Then whour = wminute \ 60 '总时数 wminute = wminute Mod 60 '计算剩余分钟数 End If If whour > 24 Then wday = whour \ 24 '总天数 whour = whour Mod 24 '计算剩余时数 End If If wday > 365 Then wyear = wday \ 365 '总年数 wday = wday Mod 365 '计算剩余天数 End If '拼凑计算结果字串 If wyear > 0 Then Convtime = Convtime & wyear & "年" If wday > 0 Then Convtime = Convtime & wday & "天" If whour > 0 Then Convtime = Convtime & whour & "小时" If wminute > 0 Then Convtime = Convtime & wminute & "分钟" If wsecond > 0 Then Convtime = Convtime & wsecond & "秒" End Function 当然,或许您要的结果不是我算出的字串,可能要算几周!但是只要将以上的程序稍作修改,就可以得到您要的结果! |
|
[木瓜软件工作室] 整理 |