用32个LED(第三方控件),LED的属性value=1时LED亮,=0时暗,我想做出某几个LED闪一闪然后全亮的效果,编了如下程序:
Option ExplicitDim tempVal As Long
Dim i As Integer
Dim times As Integer
Const m_chCount As Long = 32 '通道数Private Sub Form_Load()
tempVal = &H7FFFFFFF '8个十六进制等于32个二进制,表示32个LED的亮暗情况
times = 0
End SubPrivate Sub Timer1_Timer()
    If times = 0 Then
        For i = 0 To m_chCount - 1
            Led1(i).AllValue = tempVal
        Next i
    ElseIf times = 1 Then
        For i = 0 To m_chCount - 1
            Led1(i).AllValue = &H0
        Next i
    Else
        For i = 0 To m_chCount - 1
            Led1(i).AllValue = tempVal
        Next i
    End If
    times = times + 1
End Sub
tempval的值小于等于&H7FFFFFFF时程序可以正常运行,大于&H7FFFFFFF时LED全暗,无变化无效果。似乎是不能控制INDEX值最大的那个LED,郁闷!可能是哪里出问题了?而且按我这个程序的编法不能让LED一直保持闪烁的,如果要它们一直保持闪烁该怎么编?如果要它们先依次亮再闪烁又该怎么编?我头大了,都是老师给我出的难题 -_-#

解决方案 »

  1.   

    Dim tempVal As Long的问题,&H7FFFFFFF已经是最大值了
      

  2.   

    不对啊,书上明明写:十六进制长整形范围&H0&~&HFFFFFFFF&,而且程序里我想把末尾的&符号加上去,它自动省略这个符号。
    而且换成 dim tempval as double 一样无效果。
      

  3.   

    高手哦!控件源码怎么改?能稍微说一下吗?theforever你回答的是我第一第二还是第三个问题?
      

  4.   

    vb long型取值范围:   
      正整数:x07FFFFFFF--0   :2147483647--0     
      负整数:x0FFFFFFFF--80000000   :   -1--2147483648
      

  5.   

    分析问题
    1.你的最大值也就是所有灯全亮的tempval =&H7FFFFFFF,你把它转化成二进制看了么,是一个31位都为1的二进制数,每一位代表一盏灯的话你有32盏灯阿。所以自然就出现溢出了。你的第三方控件allvalue这个属性以外,没有别的属性,单单设置这一盏灯么。从代码看来你得allvalue属性其实是一个整体的控制,也就是说已经把32个led编成组了你可以解决的方法就是
    1.在硬件连接部分,每16个分成一组然后进行控制。二就是用value来代替allvalue还有你在亮与灭控制中我们来做个例子,index=2的那盏灯(我用二进制来描述)
    led(2).allvalue=xx1.... '亮
    led(2).allvalue=xx0....'灭而这个二进制的转换,在16进制的转换中是如何变化的,你要多考虑一下。这个题目你要多想想二进制到16进制的转化
      

  6.   

    谢谢以上各位!clear_zero还记得我吗?上次贴里谢谢你的建议,我超前完成了任务,结果老师嫌我做得太简单了给我提要求,于是就有了这一贴。言归正转,这是例程的程序
    Private Sub cmdDO_Click()
    '开关量输出
        '改变输出显示灯
        Dim tempVal As Double, tempStr As String
        tempVal = Val(cobDO.Text)
        tempVal = IIf(tempVal < 0, tempVal + 65536, tempVal)
        
        tempStr = Trim(cobDO.Text)
        For i = 0 To m_DOchCount - 1
            ledDO(i).AllValue = tempStr
        Next i
        
        ZT8403_DOAll m_cardNO, CLng(tempStr)
        If ZT8403_GetLastErr <> 0 Then Me.Caption = "PCI8403测试程序(错误号: " & ZT8403_GetLastErr & ")"  '返回函数执行的状态
    End Sub例程32盏灯都能亮的,它只把tempstr定义为string(我改成string依然无效)32盏灯是一个组,单个控制的话,led(2).value=1时灯亮,=0时灯灭。我试试单个控制。
    还有&h7fffffff是可以正常显示的,显示31盏灯亮,比这个数大就不能显示了,如我要的&HF084210F
      

  7.   

    在例子里面你设置断点,主要看第0个和第31个看那个时候tempStr的值。只要你知道了那两个状态下的tempstr值,就好办了别着急,都有例子了,怎么可能做不出来
      

  8.   

    恩,我逐行运行语句,发现例程的值的值是"&Hxxxxxxxx"而我的值超过&H7FFFFFFF就是负数。改成dim tempval as string
    tempval="&HF084210F"
    就行了
    另外
    For i = 0 To 11
    Led1(arrLight(i)).Value = 1
    这样也可以余下两个问题:
    怎么让它保持闪烁?
    怎么让它依次亮然后再闪?
      

  9.   

    tempVal = IIf(tempVal < 0, tempVal + 65536, tempVal)
    为什么要有这句? 你的是32位长整形 +65536 也不见得变正数
      

  10.   

    回ayalicer我段例程我也不知道,我的程序里用不着。我已经把保持闪烁做出来了,余下最后一个问题,如何先依次亮再闪啊?