如何判断一个动态装入的控件是否已经被unload?

fury 2005-03-19 10:09:03
如下装入10个textbox:
for i=1 to 10
load Text1(1)
next

然后卸载一个:
unload Text1(10)

此时如何判断Text1(10)已经unload?

is nothing无效, isempty无效, isnull无效
...全文
151 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
pxb0420 2005-03-25
  • 打赏
  • 举报
回复
Public Function ChkCtl(ByVal strCtlName As String,.................)

Dim objCtl As Control

For Each objCtl In Me.Controls

Debug.Print objCtl.Name
Debug.Print objCtl.Index ' 如果不是控件数组则出错,可在objCtl.Tag设一标志位记
' 是否为数组.不多写了,我想你应该有思路了.

Next objCtl

End Function


也可不用数组添加控件

Me.Controls.Add "Vb.Textbox", "txtTestAdd"
Me.Controls("txtTestAdd").Visible = True


我想这样要比你用数组好多了.你可用一个类来实现数组...........
supergreenbean 2005-03-25
  • 打赏
  • 举报
回复
补一句:以上纯属个人观点,并非出自MS,仅供各位参考,谢谢
supergreenbean 2005-03-25
  • 打赏
  • 举报
回复
当你unload一个object的时候,它的引用计数并不一定会变为0,因为除了你在程序里用之外,vb自己也是在用这个对象的,这一点从对象的引用计数上可以看出来。你unload了一个object,vb就仅仅是让你无法使用这个对象而已(这个似乎是通过改写该对象的vtable函数指向),我个人觉得比较安全的判断方法还是用tanaya(蜡笔小新)所说的那种错误处理方式。
fury 2005-03-25
  • 打赏
  • 举报
回复
多谢

For Each objCtl In Me.Controls可以判断

加分
fury 2005-03-24
  • 打赏
  • 举报
回复
jlum99(闲人) : 我确实是这样做的, 但是就没有一个方法得到控件是否Unload吗?

//
rem(游戏蛀虫V1.03) : IsObject不行, 试过了
fury 2005-03-24
  • 打赏
  • 举报
回复
还要加上一个:

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
Destination As Any, _
Source As Any, _
ByVal Length As Long)
fury 2005-03-24
  • 打赏
  • 举报
回复
刚刚又看了一下, 原来并没有填充后面的字节, 那就只判断首个双字了
草草写了以下代码, 期待高人指教!

用法:
设计时在界面上放了一个Text1(0), 这个控件运行时不能够Unload, 把它用作第二个参数:

If IsUnloaded(Text1(i), Text1(0)) Then
Load Text1(i)
End If

//

'=========================================
' 判断控件数组中的一个元素是否已经Unload
' 入口:
' ctrlThis - 要判断的控件
' ctrlBase - 设计时设定的元素(确定没有Unload的元素, 用于对比)
' 返回:
' TRUE - 如果控件已经Unload
' FALSE - 没有Unload
'=========================================
Public Function IsUnloaded(ctrlThis As Control, ctrlBase As Control) As Boolean
On Error Resume Next

Dim lAddrThis As Long, lFlagThis As Long
Dim lAddrBase As Long, lFlagBase As Long


lAddrBase = ObjPtr(ctrlBase)
Call CopyMemory(lFlagBase, ByVal lAddrBase, 4)

lAddrThis = ObjPtr(ctrlThis)
Call CopyMemory(lFlagThis, ByVal lAddrThis, 4)

Debug.Print Hex$(lFlagBase) & " : " & Hex$(lFlagThis)

IsUnloaded = Not (lFlagThis = lFlagBase)

End Function
taosin 2005-03-24
  • 打赏
  • 举报
回复
用一个变量来标识!
fury 2005-03-24
  • 打赏
  • 举报
回复
哈哈, 中午跟了一下, 原来如此

可以从ObjPtr(Text1(i))入手,
Unload之后该地址指向位置的一个双字变了,
其后的内容以 0xFF, 0xFE 填充,
据此应该可以判断了

有时间的话晚上写代码出来 :)

不过没有正式文档, 也没有学过COM, 不知道这样究竟对不对
实践上应该是可以的 :)



thor 2005-03-22
  • 打赏
  • 举报
回复
用isobject试试?也许可以
jlum99 2005-03-22
  • 打赏
  • 举报
回复
这些都是你自己程序加载控制的.什么地方做了unload你应该知道的.不应该用这种方法来判断.自己维护一个表,unload的时候从表是删除,要判断就判断表里是否存在这个控件好了.
fury 2005-03-22
  • 打赏
  • 举报
回复
我现在就是这样做的 但是觉得这种方式不大好

对文本控件没问题, 但是对于任意一个控件,
可能在UserControl_Initialize中作一些初始化动作,
比如初始化串口, USB设备,
这时为了测试它是否已经Unload 而 Load 它, 似乎有点不大妥

我想应该有其他方法直接看出来, 也许跟COM什么的相关
ObjPtr(Text1(i))看到的指针也不为空

唐古拉山 2005-03-19
  • 打赏
  • 举报
回复

Private Sub Form_Load()
Load Text1(1)
End Sub

Private Sub Command1_Click()
If IsTextUload(1) = True Then
MsgBox "Text1(1)已经卸载了", vbInformation, "提示"
End If
End Sub

Private Sub Command2_Click()
Unload Text1(1)
End Sub

Function IsTextUload(ByVal Index As Integer) As Boolean
On Error GoTo Z
Dim ret As String
ret = Text1(Index).Text '尝试赋值,如果 Text1(Index) 不存在,即卸载了,将发生一个对象不存在错误
IsTextUload = False
Exit Function
Z:
IsTextUload = True
End Function

lsq004 2005-03-19
  • 打赏
  • 举报
回复
我想要的搜索 http://www.531d.com

7,763

社区成员

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

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