1.关于ColumnCount与GetItemsCount方法
很多新人在使用时都会混淆这两个方法,确实QTP的解释让我们这些E文不行的人很难理解其中的区别:
ColumnCount | Returns the number of columns in the (report-style) list-view object. |
GetItemsCount | Returns the number of items in the list. |
仔细研究一下QTP中例子,会有些收获。QTP中ColumnCount方法是以Window任务管理器为例,我们在代码中加入检查如下:
msgbox Dialog("Windows 任务管理器").WinListView("SysListView32").ColumnCount()
msgbox Dialog("Windows 任务管理器").WinListView("SysListView32").GetItemsCount()
将任务管理器定位在进程这个Tab页上,核对msgbox的数字,会发现ColumnCount返回的是列,GetItemsCount返回的是行。这样就一目了然了,再通过增加减少进程显示的列进一步验证了这一点。
其实说到底WinListView识别的就是Windows下ListView控件,ListView控件本身的属性非常丰富,在QTP调用方法时如果不明白其中的含义,可以参考ListView控件的属性,做个对比,很快也会明白。
很多时候我们会发现对QTP对象的识别以及方法的使用存在很多不明白的地方,导致很多误用,说明对对象的理解还不够深入,对应的开发知识还非常欠缺,存在很多知识盲区。
list-view控件的详细说明可以参考下面这个网址:
http://msdn.microsoft.com/zh-cn/library/system.windows.forms.listview(VS.80).aspx
2.ColumnCount方法帮助中的Report-Style
http://bbs.51testing.com/thread-135274-1-1.html
我想差不多这就是其中的微妙区别了。
3.使用Windows底层API获取listview属性
Extern.Declare micHwnd, "FindWindow", "user32.dll", "FindWindowA", micString, micString
Extern.Declare micHwnd, "FindWindowEx", "user32.dll", "FindWindowExA", micHwnd, micHwnd, micString, micString
Extern.Declare micHwnd, "SendMessage", "user32.dll", "SendMessageA", micHwnd, micLong, micLong, micLong
Hwnd = extern.FindWindowEx(0,0,vbNullString, "选择文件")
'一开始我试图直接用extern.FindWindowEx(Hwnd1,0,"SysListView32",vbNullString)找到listview对象,可以返回值一直是0,搞了半天,很不明白,很恼火。后来耐下心来想了想,估计listview不能直接获得,也就是需要通过父对象的引用一层层的剥离出来。用SPY++check选择文件对话框的属性,发现SysListView32上面还有2层对象,一个个的找出窗口句柄,最后终于成功定位了listview对象。
Hwnd1 = extern.FindWindowEx(Hwnd,0,"SHELLDLL_DefView", vbNullString)
Hwnd2 = extern.FindWindowEx(Hwnd1,0,"SysListView32", vbNullString)
MessageCode = &HF11B 'LVM_GETCOLUMNOUNT
cols = extern.SendMessage(hwnd2,MessageCode, 0, 0)
以上代码,我试了一下用Windows的api尝试获取列数,但是返回结果为0。如果查LVM_GETITEMCOUNT,对应的code是&H1004,是可以获取的。查了一下MSDN,没有找到支持从外部获取GETCOLUMNCOUNT的方法。这个还有待进一步研究.
OK,上面的问题还是被我搞定了。究其原因还是对Windows的listview控件不了解,要想获取column的数量,必须先获取ColumnHeader的句柄,对应QTP识别的是SysHeader32,再调用ColumnHeader的消息,可以获取列数,代码如下:
Extern.Declare micHwnd, "FindWindow", "user32.dll", "FindWindowA", micString, micString
Extern.Declare micHwnd, "FindWindowEx", "user32.dll", "FindWindowExA", micHwnd, micHwnd, micString, micString
Extern.Declare micHwnd, "SendMessage", "user32.dll", "SendMessageA", micHwnd, micLong, micLong, micLong
Hwnd = extern.FindWindowEx(0,0,vbNullString, "Windows 任务管理器")
Hwnd1 = extern.FindWindowEx(Hwnd,0,"#32770", vbNullString)
Hwnd2 = extern.FindWindowEx(Hwnd1,0,"SysListView32", vbNullString)
Hwnd3 = extern.FindWindowEx(Hwnd2,0, "SysHeader32", vbNullString)
MessageCode = &H1200 'HDM_GETITEMCOUNT
columnCount = extern.SendMessage(Hwnd3,MessageCode,0, 0)