etao搜索

WinListView对象研究

上一篇 / 下一篇  2008-12-13 17:15:04 / 个人分类:QTP

1.关于ColumnCountGetItemsCount方法

  很多新人在使用时都会混淆这两个方法,确实QTP的解释让我们这些E文不行的人很难理解其中的区别:

ColumnCountReturns the number of columns in the (report-style) list-view object.

GetItemsCountReturns 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

参见这篇贴。为什么windows资源管理器的winlistview无法用columncount,而任务管理器可以。后来我又试了一下WinRar的winlistview,发现columncount是可以用的。两者有什么差别,从表面上看windows资源管理器可以选择不同风格的查看方式,而任务管理器和winrar都不可以,两种同样都是winlistview,但是风格不一致。说明其属性不一致,后来我用Spy++对比了一下两种winlistview的属性,发现一个很重要的差别,就是资源管理器的winlistview没有LVS_REPORT这个属性,而其他两个是有的。这是突然想起QTP帮助中ColumnCount方法有一个注释“Returns the number of columns in the (report-style) list-view object. ”,指定了是Report-Style。
我想差不多这就是其中的微妙区别了。
类似的例如GetColumnHeader等方法的使用也是有此局限。

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)


TAG: QTP WinListView ColumnCount GetItemsCount Report-Style

fqcd163的个人空间 引用 删除 fqcd163   /   2010-05-14 12:50:18

good
cebola的个人空间 引用 删除 cebola   /   2008-12-20 22:42:09
5
thanks for your share!
cebola的个人空间 引用 删除 cebola   /   2008-12-20 22:40:52
我看了你的空间内容,介绍了对listview控件的columncount使用方法,如果资源管理器无法使用该方法,那么使用QTP如何获取columncount的属性值,以及GetColumnHeader方法获取的属性值呢?有什么好方法能否分享一下。
 

评分:0

我来说两句

日历

« 2024-03-27  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 16378
  • 日志数: 11
  • 建立时间: 2008-12-10
  • 更新时间: 2010-06-10

RSS订阅

Open Toolbar