zoukankan      html  css  js  c++  java
  • (转)关于ColumnCount与GetItemsCount方法

    1.关于ColumnCountGetItemsCount方法

      很多新人在使用时都会混淆这两个方法,确实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

    参见这篇贴。为什么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)

  • 相关阅读:
    linux系统日志及其rsyslog服务
    C++
    程序员之---C语言细节18(一些奇怪表达式)
    Spring MVC的简单使用方法
    Android系统开发(4)——Autotools
    大话设计模式C++版——代理模式
    JS获取地址栏并拼接參数
    二叉树的应用(1)--二叉树排序树基本操作
    【LeetCode-面试算法经典-Java实现】【067-Add Binary(二进制加法)】
    Android 实现形态各异的双向側滑菜单 自己定义控件来袭
  • 原文地址:https://www.cnblogs.com/emma/p/1677221.html
Copyright © 2011-2022 走看看