如何动态的加载和卸载控件数组

u012131774 2013-09-21 04:00:10
现有一控件数组CONTROLSA,在使用过程中,每需要一个控件,就动态的加载一个此控件,使用完后立即卸载此控件,当然每个控件的生命周期不一样,有的时间长,有的时间短,需要使用的时间决定此控件的生命周期,因此此时间的长短是随机的。

此控件数组最多时有100个元素。

当控件的最大索引值达到100后的5分钟内,又有1个控件被卸载,比如被卸载的是CONTROLS(87),当有新的控件需要被加载时,我如何判断出CONTROLS(87)已被卸载,以便于重新加载CONTROLS(87)
...全文
189 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
笨狗先飞 2013-09-22
  • 打赏
  • 举报
回复
控件数量不多的话还是别卸载了,与其这么费劲的都判断状况,还不如留着下次重用好了,这样程序速度也能稍快些,控件成了数组部分动态事件就不怎么好控制了,控件名的特性也有变化.
三楼の郎 2013-09-22
  • 打赏
  • 举报
回复
引用 2 楼 u012131774 的回复:
非常感谢,但是就没有个象 if CONTROLS(87) is nothing then load CONTROLS(87) 这样的简单用法吗,当然这个用法不可用。
类似这样的方法当然可以有

dim xx as long
xx=87
on error resume next
ReLoad:
load CONTROLS(xx)         '尝试加载控件
if err.number<>0 then     '出错,说明控件已存在,Index加一,直至加载成功
err.clear
xx=xx+1
goto ReLoad 
end if
lliai 2013-09-22
  • 打赏
  • 举报
回复
1楼够详细的了。可以照搬。
舉杯邀明月 2013-09-21
  • 打赏
  • 举报
回复
没必要用这个什么函数来判断。
worldy 2013-09-21
  • 打赏
  • 举报
回复
添加一个判断函数 function InUser(Index as long)as boolean on error goto errhandler dim ctl as yourcontrol set yourcontrol=CONTROLSA(Index)//如果已经卸载,跳到errhandler,不会返回true InUse=true yourcontrol=nothing errhandler: end function
舉杯邀明月 2013-09-21
  • 打赏
  • 举报
回复
我突然想到一个问题,就是你在程序中用到的 Winsock 数量,总是有限的,数量根本不多。 比如最多会有100个(或最多200个,无关紧要的),并且是:   ①需要建立新连接时,如果有未用的 Winsock,随便拿一个来用就行,具体是哪个完全没关系;   ②没有可用的,再动态加载一个新的。 我们只需要管理有没有可用的“旧的 Winsock ”(只要管索引号就行)。 这样,完全可以不用 Collection 对象,而按“最大连接数”定义一个 Long数组,用来模拟堆栈操作就行了。
舉杯邀明月 2013-09-21
  • 打赏
  • 举报
回复
① 用一个变量存储已经加载了多少个控件。这样,下一次要加载时,就知道应该加载索引号为多少的。   这样也便于对新加载的控件进行操作。 ② 对于你的应用场合,用 Collection 对象来存储已经加载、但未用(已经断开连接)的控件索引。 ③ 当需要使用一个控件时,先看 Collection对象中有没有可用的索引号,没有就加载一个新的。   if (objColl.Count = 0) then 加载新控件,按①来处理   else     取一个可用的已加载控件索引: IndexWsk = objColl.Item(1)     并把它从集合对象移除:    Call objColl.Remove(1)     然后,拿着这个索引号 IndexWsk 去进行你需要的连接操作   end if
u012131774 2013-09-21
  • 打赏
  • 举报
回复
引用 1 楼 CityBird 的回复:
用Collection对象来回收被移除的控件Index就行了,给你一段代码参考吧,这是Winsock数组的

dim colReIndex As New Collection         '定义一个Collection对象回收已卸载的Index

'加载
Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal RequestID As Long)
    Dim myWinsock As Winsock
    Dim maxWinsockIndex As Long
    maxWinsockIndex = 0
    
    If colReIndex.Count = 0 Then
        For Each myWinsock In Winsock1                      '如果没卸载过Winsock,则计算当前Index的最大值
            If myWinsock.Index > maxWinsockIndex Then
                maxWinsockIndex = myWinsock.Index
            End If

            maxWinsockIndex = maxWinsockIndex + 1           '取当前Index最大值+1
        Next
    Else
        maxWinsockIndex = colReIndex.Item(1)                '如果有卸载的,则重复利用卸载的Index
        colReIndex.Remove (1)                               '从删除被重复使用的Index
    End If
    
    Load Winsock1(maxWinsockIndex)
…………
end sub

'卸载的时候回收Index
Private Sub Winsock1_Close(Index As Integer)
    Winsock1(Index).Close               '关闭链接
    Unload Winsock1(Index)              '卸载相应的控件
    colReIndex.Add Index                '将Index添加到回收器
…………
End Sub
非常感谢,但是就没有个象 if CONTROLS(87) is nothing then load CONTROLS(87) 这样的简单用法吗,当然这个用法不可用。
三楼の郎 2013-09-21
  • 打赏
  • 举报
回复
用Collection对象来回收被移除的控件Index就行了,给你一段代码参考吧,这是Winsock数组的

dim colReIndex As New Collection         '定义一个Collection对象回收已卸载的Index

'加载
Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal RequestID As Long)
    Dim myWinsock As Winsock
    Dim maxWinsockIndex As Long
    maxWinsockIndex = 0
    
    If colReIndex.Count = 0 Then
        For Each myWinsock In Winsock1                      '如果没卸载过Winsock,则计算当前Index的最大值
            If myWinsock.Index > maxWinsockIndex Then
                maxWinsockIndex = myWinsock.Index
            End If

            maxWinsockIndex = maxWinsockIndex + 1           '取当前Index最大值+1
        Next
    Else
        maxWinsockIndex = colReIndex.Item(1)                '如果有卸载的,则重复利用卸载的Index
        colReIndex.Remove (1)                               '从删除被重复使用的Index
    End If
    
    Load Winsock1(maxWinsockIndex)
…………
end sub

'卸载的时候回收Index
Private Sub Winsock1_Close(Index As Integer)
    Winsock1(Index).Close               '关闭链接
    Unload Winsock1(Index)              '卸载相应的控件
    colReIndex.Add Index                '将Index添加到回收器
…………
End Sub

7,759

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧