80107671 发表于 2017-6-13 16:46:51

请问listviewitem的字符长度是有限制在259的吗?

本帖最后由 80107671 于 2017-6-14 15:59 编辑



运行附件au3,在界面中点击add按钮去增加文件夹中的py文件,然后在params一列中的参数似乎显示不完整,所以我想知道以下 $plname的文本可能超过256了,超过的部分似乎不显示,如何设置这个值为无穷,求大神给个例子吧。先谢谢了。。。

_GUICtrlListView_AddSubItem($hListview11, $d, $plname, 2)

kk_lee69 发表于 2017-6-13 17:09:16

回复 1# 80107671

請上測試的代碼

80107671 发表于 2017-6-14 09:29:48

回复 2# kk_lee69


    kk, 你好,运行附件的au3,点击add按钮去增加文件夹中的py文件,然后数据取出后,在params一列中的数据没有完全取出来,似乎显示不完整,实际有以下这么多。--platform=bakerville --env=cycling --biostype=release --osbootlog=enable --swurl=https://ubit-artifactory-sh.com/artifactory/DEG-Purley-local/Bakerville-Artifacts/Daily/WithoutOS_OSS_Check-In_Bakerville_RHEL7.2_57.112393.112382-20170210-WW6.5.zip --isourl=https://ubit-abartifactory-shaan.com/artifactory/DEG-Purley-local/Release/OS/RHEL/RHEL7.3Serverx86_64.zip--rsourl=https://ubit-abartifactory-shaan.com/artifactory/DEG-Purley-local/Release/OS/RHEL/RHEL7.3Serverx86_64.zip

kk_lee69 发表于 2017-6-14 09:47:05

回复 3# 80107671


    你的問題是
所以我想知道以下 $plname的文本可能超过256了,超过的部分似乎不显示,如何设置这个值为无穷

所以你應該直接上超過256 不顯示的例子

人家才知道怎麼幫你解決不是 把你的程式 傳出來要幫你的人 還得去拆解你的程式

問問題 應該是 針對某個 點 去解決而不是 整個面

80107671 发表于 2017-6-14 10:13:02

回复 4# kk_lee69

如下,列3后面的bbbb就没法显示了。#include <GUIConstantsEx.au3>
#include <GuiImageList.au3>
#include <GuiListView.au3>

Example()

Func Example()
    Local $hImage, $idListview

    ; 創建 GUI
    GUICreate("添加列表視圖子項", 400, 300)
    $idListview = GUICtrlCreateListView("", 2, 2, 394, 268, -1, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
    GUISetState(@SW_SHOW)

    ; 加載圖像
    $hImage = _GUIImageList_Create()
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap(GUICtrlGetHandle($idListview), 0xFF0000, 16, 16))
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap(GUICtrlGetHandle($idListview), 0x00FF00, 16, 16))
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap(GUICtrlGetHandle($idListview), 0x0000FF, 16, 16))
    _GUICtrlListView_SetImageList($idListview, $hImage, 1)

    ; 添加列
    _GUICtrlListView_InsertColumn($idListview, 0, "列 1", 100)
    _GUICtrlListView_InsertColumn($idListview, 1, "列 2", 100)
    _GUICtrlListView_InsertColumn($idListview, 2, "列 3", 100)

    ; 添加項目
    _GUICtrlListView_AddItem($idListview, "行 1: 列 1", 0)
    _GUICtrlListView_AddSubItem($idListview, 0, "1", 1, 1)
    _GUICtrlListView_AddSubItem($idListview, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", 2, 2)
    _GUICtrlListView_AddItem($idListview, "行 2: 列 1", 1)
    _GUICtrlListView_AddSubItem($idListview, 1, "行 2: 列 2", 1, 2)
    _GUICtrlListView_AddItem($idListview, "行 3: 列 1", 2)

    ; 循環到用戶退出.
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUIDelete()
EndFunc   ;==>Example

kk_lee69 发表于 2017-6-14 12:04:11

回复 5# 80107671

試過虛擬的 LISTVIEWP.S 顯示與 繪圖的 函數都是自己寫的
試過_GUICtrlListView_Create

查過 官方網站 ......... 無這方面的資料......
查到一個 http://www.debugease.com/vb/2713129.html
談 listview中 item.text的最大长度限制?微软的Bug?

因此 結論趨向於微軟問題無解吧!!

有沒有考慮用其他的方式處理....譬如 你點擊他 自動 彈出 提示 內容的畫面....這樣應該可以解決

kk_lee69 发表于 2017-6-14 16:59:17

回复 5# 80107671

話說回來 這只是 顯示問題   資料是不會有問題的 可以存放超過259

80107671 发表于 2017-6-15 09:12:14

回复 7# kk_lee69


    是的,没办法,我只能另建edit来替换它了。谢谢解答:)

tubaba 发表于 2017-6-20 17:14:59

本帖最后由 tubaba 于 2017-6-20 17:16 编辑

很好奇,测试了一下. 具有$LVS_OWNERDATA 风格可以全部显示

kk_lee69 发表于 2017-6-21 02:11:16

回复 9# tubaba

怪了 我也用這個風格

我的不行...............可否提供源碼   我想研究看看

tubaba 发表于 2017-6-21 09:54:34

本帖最后由 tubaba 于 2017-6-21 10:17 编辑

回复 10# kk_lee69

下面是论坛前辈的一个源码,我对虚拟列表这种风格的认识也是从这位前辈开始的,从那这后也使用这种风格写了不少的代码,累积了不少经验,有了自己的见解.
这种风格的listview的显示是随数组的变化而动态变化.如果它的item和subitem范围超出数组的范围.程序就会崩溃.因此,我添加了几个自己写的函数


#Region AutoIt3Wrapper 预编译参数(常用参数)
#AutoIt3Wrapper_Icon=                                                                                 ;图标,支持EXE,DLL,ICO
#AutoIt3Wrapper_OutFile=                                                                        ;输出文件名
#AutoIt3Wrapper_OutFile_Type=exe                                                        ;文件类型
#AutoIt3Wrapper_Compression=4                                                                ;压缩等级
#AutoIt3Wrapper_UseUpx=y                                                                         ;使用压缩
#AutoIt3Wrapper_Res_Comment=                                                                 ;注释
#AutoIt3Wrapper_Res_Description=                                                        ;详细信息
#AutoIt3Wrapper_Res_Fileversion=                                                        ;文件版本
#AutoIt3Wrapper_Res_FileVersion_AutoIncrement=p                                ;自动更新版本
#AutoIt3Wrapper_Res_LegalCopyright=                                                 ;版权
#AutoIt3Wrapper_Change2CUI=N                                                   ;修改输出的程序为CUI(控制台程序)
;#AutoIt3Wrapper_Res_Field=AutoIt Version|%AutoItVer%                ;自定义资源段
;#AutoIt3Wrapper_Run_Tidy=                                                   ;脚本整理
;#AutoIt3Wrapper_Run_Obfuscator=                                                      ;代码迷惑
;#AutoIt3Wrapper_Run_AU3Check=                                                                 ;语法检查
;#AutoIt3Wrapper_Run_Before=                                                                 ;运行前
;#AutoIt3Wrapper_Run_After=                                                                        ;运行后
#EndRegion AutoIt3Wrapper 预编译参数设置完成
#cs ____________________________________

Au3 版本:
脚本作者:
        Email:
        QQ/TM:
脚本版本:
脚本功能:

#ce _______________脚本开始_________________

#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
Local $tText = DllStructCreate("wchar Text");建个结构,用来放listview列数据
Local $GUI, $hImage, $iITEM_COUNT = 10000

$hGUI = GUICreate("ListView虚拟列表 加载[" & $iITEM_COUNT & "]数据", 760, 400)
$hListView = GUICtrlCreateListView("Item1|nSubItem1|nSubItem2", 2, 2, 760, 294, $LVS_SHOWSELALWAYS + $LVS_OWNERDATA, $LVS_EX_GRIDLINES + $LVS_EX_FULLROWSELECT + $LVS_EX_DOUBLEBUFFER)
;设置列宽
GUICtrlSendMsg($hListView, $LVM_SETCOLUMNWIDTH, 0, 240)
GUICtrlSendMsg($hListView, $LVM_SETCOLUMNWIDTH, 1, 240)
GUICtrlSendMsg($hListView, $LVM_SETCOLUMNWIDTH, 2, 240)

;创建并关联图像列表
$hImage = _GUIImageList_Create()
_GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", 115)
_GUICtrlListView_SetImageList($hListView, $hImage, 1)

;===================================================================

$Button1 = GUICtrlCreateButton("数据1", 200, 352, 73, 33)
$Button2 = GUICtrlCreateButton("数据2", 300, 352, 73, 33)
$Button3 = GUICtrlCreateButton("清除 ", 400, 352, 73, 33)

Global $tData1[$iITEM_COUNT], $tData2[$iITEM_COUNT], $aData
For $i = 0 To $iITEM_COUNT - 1
      For $j = 0 To 2
                $tData1[$i][$j] = ' 数据 1 $aData [' & $i & '][' & $j & ']'
                $tData2[$i][$j] = ' 数据 2 $aData [' & $i & '][' & $j & ']'
      Next
Next
GUICtrlSendMsg($hListView, $LVM_SETITEMCOUNT, $iITEM_COUNT, 0)
;===================================================================
GUISetState()

While 1
      Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                        ExitLoop
                Case $Button1
                        $aData = $tData1
                                                ListView_MatchArray($hListView, $aData)
                Case $Button2
                        $tData2 = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
                                                $aData = $tData2
                                                ListView_MatchArray($hListView, $aData);数组大小改变时,一定要及时让listview调整col和row,否则会让程序崩溃
                Case $Button3
                        $aData = 0
                        ListView_MatchArray($hListView, $aData)
                                               
      EndSwitch
WEnd
GUIDelete()
Exit

Func ListView_MatchArray($ControlID, $iaData, $aColName = '', $Flag = False)
        Local $iUBound2, $ColCount, $ColWidth
        $iUBound2 = UBound($iaData, 2)
        $ColCount = _GUICtrlListView_GetColumnCount($ControlID)
        _GUICtrlListView_BeginUpdate($ControlID)
        Select
                Case $iUBound2 > $ColCount
                        $ColWidth = Round((_GUICtrlListView_ApproximateViewWidth($ControlID) + 1) / $iUBound2, 1)
                        For $i = 0 To $iUBound2 - 1
                                If $i >= $ColCount Then _GUICtrlListView_InsertColumn($ControlID, $i, $i)
                                GUICtrlSendMsg($ControlID, $LVM_SETCOLUMNWIDTH, $i, $ColWidth)
                        Next
                Case $iUBound2 < $ColCount
                        $ColWidth = Round((_GUICtrlListView_ApproximateViewWidth($ControlID) + 1) / $iUBound2, 1)
                        For $i = ($ColCount - 1) To 0 Step -1
                                If $i >= $iUBound2 Then GUICtrlSendMsg($ControlID, $LVM_DELETECOLUMN, $i, 0)
                                GUICtrlSendMsg($ControlID, $LVM_SETCOLUMNWIDTH, $i, $ColWidth)
                        Next
        EndSelect
        If IsArray($aColName) Then
                For $i = 1 To UBound($aColName) - 1
                        _GUICtrlListView_SetColumn($ControlID, $i, $aColName[$i])
                Next
        EndIf
        GUICtrlSendMsg($ControlID, $LVM_SETITEMCOUNT, UBound($iaData), 0)
        If $Flag Then GUICtrlSendMsg($ControlID, $LVM_ENSUREVISIBLE, 0, 0)
        _GUICtrlListView_EndUpdate($ControlID)
        Update_ListView($ControlID)
EndFunc   ;==>ListView_MatchArray

Func Update_ListView($ControlID)
        _GUICtrlListView_BeginUpdate($ControlID)
        For $i = 0 To _GUICtrlListView_GetColumnCount($ControlID) - 1
                _GUICtrlListView_SetColumnWidth($ControlID, $i, $LVSCW_AUTOSIZE)

                _GUICtrlListView_SetColumnWidth($ControlID, $i, _GUICtrlListView_GetColumnWidth($ControlID, $i) + 10)
        Next
        _GUICtrlListView_EndUpdate($ControlID)
        _WinAPI_RedrawWindow(GUICtrlGetHandle($ControlID))
EndFunc   ;==>Update_ListView


Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
      #forceref $hWnd, $iMsg, $iwParam
      Local $tNMHDR, $iIDFrom, $iCode, $tInfo, $iItem, $iSubItem
      
      $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
      $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
      $iCode = DllStructGetData($tNMHDR, "Code")
      Switch $iIDFrom
                Case $hListView
                        Switch $iCode
                              Case $LVN_GETDISPINFOA, $LVN_GETDISPINFOW ;$LVN_GETDISPINFOA = -150, $LVN_GETDISPINFOW = -177
                                       
                                        If IsArray($aData) Then
                                                $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
                                                $iItem = DllStructGetData($tInfo, "Item")
                                                $iSubItem = DllStructGetData($tInfo, "SubItem")
                                                If $iSubItem = 0 Then DllStructSetData($tInfo, "Image", 0)
                                                                                                If $iItem >= UBound($aData) Or $iSubItem >= UBound($aData, 2) Then Return        ;一定要加上这句,否则在数组快速变化时候可能会造成访问数组下标超限的运行错误
                                                DllStructSetData($tText, "Text", $aData[$iItem][$iSubItem]);
                                                DllStructSetData($tInfo, "Text", DllStructGetPtr($tText));
                                        EndIf

                        EndSwitch
      EndSwitch
EndFunc   ;==>WM_NOTIFY

kk_lee69 发表于 2017-6-21 11:30:28

回复 11# tubaba

這個虛擬列表 我知道
我先研究看看我現在 都是用這個.....

但是 我 測試的結果是一樣出不來我想知道怎麼你的可以出來.....

研究好了再回復

kk_lee69 发表于 2017-6-21 11:45:29

回复 1# 80107671

樓上的 提供的解決方法.....

kk_lee69 发表于 2017-6-21 11:50:02

回复 11# tubaba

既然你寫過 很多 利用這個機會請教你個問題 看你解決了沒

你知道 LISTVIEW 按滑鼠 右鍵後如果 開啟選單 或者 停住的時候

會造成整行 變白......... 因為 這個過程 可能打斷了 繪圖的部分因此會出現 白行

必須要動一下 才會正常

這個你有遇到嗎??解決了嗎??

84063016 发表于 2017-6-21 14:48:17

学习一下大神的解决方案
页: [1] 2
查看完整版本: 请问listviewitem的字符长度是有限制在259的吗?