读书人

关于VB两个数组相互赋值有关问题

发布时间: 2012-01-03 22:16:06 作者: rapoo

关于VB两个数组相互赋值问题
这里先谢谢看贴的各位。因为说的东西可能有点多。希望大家体谅。不用各位顶帖了。我只想看有用东西。谢谢各位。
我想写一个句柄的比较。但是写到句柄储存到数组后有些不知道如何写了。请教一下大家。
我用了EnumWindows的EnumWindowsProc来得到指定的窗口类的句柄。句柄得到写入数组a()然后在EnumWindowsProc用x=x+1来redim a(1 to x)确定了数组a()的大小。然后我建立了一个数组b()然后确定一个值y。重新定义b()为b(1 to y)然后想把a(x)数组里相应的值给b(y),因为2个数组都是从下标1开始的。假如y=3我就想程序把b(1)=a(1),b(2)=a(2),b(3)=a(3)然后a(x)中多出来其他值不要。然后利用b(y)里存的值跟a(x)中对应位数的值比较。不同就对句柄发出关闭。就是想把a(x)里多出b(y)的句柄给关掉。 我觉得也可以x-y后把多余的个数句柄放入c(1 to x-y)直接对c(1 to x-y)里的句柄都发送关闭。大家看哪个好实现就给点代码。复制内存的API用了下好像写的不对。老是不行。觉得麻烦的给个思路。把用什么API或者怎么写赋值循环大概说下谢谢。
主要是把a(x)里的值对应的给b(y)把我难到了。因为EnumWindowsProc是每次都运行的。像个循环。我不知道这个是不是叫指针。希望能理解清楚的各位解释一下。自学的VB基础不行。在EnumWindowsProc里把a(x)里的值对应的给b(y)我觉得不方便。但是在FROM的代码里又没有办法直接引用到模块EnumWindowsProc里的数组a(x)b(y)。希望会的朋友也教我下。不多嗦了。代码贴出来。
FORM里的代码:

VB code
Option Explicit  Private Sub Form_Load()          Me.AutoRedraw = True          'call   the   Enumwindows-function          EnumWindows AddressOf EnumWindowsProc, ByVal 0&  End Sub模块里的代码:  Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean  Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long  Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long  Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long  Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long  Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long  Dim a() As Long  Dim b() As Long  Dim x As Integer  Dim y As Integer       Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean          Dim sSave     As String, Ret       As Long          Dim lei As String * 128          Dim diylei As String * 128          diylei = "IEFrame" + Chr(0) '定义要判断的窗口类IEFrame为IE窗口类If GetParent(hwnd) = 0 Then '是否是父窗口    If IsWindowVisible(hwnd) Then '是否可见          lei = ""          GetClassName hwnd, lei, 128        If lei = diylei Then '判断是否是定义的类          If y = 0 Then 'Y不存在定义Y的值          y = InputBox("", "")          Ret = GetWindowTextLength(hwnd)          sSave = Space(Ret)          GetWindowText hwnd, sSave, Ret + 1          Form1.Print Str$(hwnd) + "   " + sSave '输出句柄和标题          x = x + 1          ReDim a(1 To x)          a(x) = Str$(hwnd)          Form1.Print "x"; x; a(x)            If y >= x Then '如果Y>=X            ReDim b(1 To y)            End If          Form1.Print "y"; y; b(y)          Form1.Print x <= y          Else 'Y存在值时          Ret = GetWindowTextLength(hwnd)          sSave = Space(Ret)          GetWindowText hwnd, sSave, Ret + 1          Form1.Print Str$(hwnd) + "   " + sSave          x = x + 1          ReDim a(1 To x)          a(x) = Str$(hwnd)          Form1.Print "x"; x; a(x)            If y >= x Then            ReDim b(1 To y)            End If          Form1.Print "y"; y; b(y)          Form1.Print x <= y          End If        End If    End IfEnd If          '继续enumeration          EnumWindowsProc = True  End Function


[解决办法]
看了半天,真绕得有点头晕。

你说得内容似乎都没有必要,既然a(1 to x)前y个元素与b(1 to y)的元素是对应相等的,
就没有必要去搞这个b了,再搞个c更没必要了,你直接在一个循环里关闭a()中下标大于
y的所有元素中存的句柄不就行了。

for i= y+1 to ubound(a)
‘关闭a(i)中的句柄
next

[解决办法]
Dim a() As Long
to
public a() As Long
这样窗体里就能访问了
------解决方案--------------------


Preserve 关键字,当改变原有数组最末维的大
小时,使用此关键字可以保持数组中原来的数
据。 然后可以对a()进行相应操作。

ReDim Preserve a(1 To x)


[解决办法]

探讨

我说是卡着思路。不是程序卡

读书人网 >VB

热点推荐