请问listviewitem的字符长度是有限制在259的吗?
本帖最后由 80107671 于 2017-6-14 15:59 编辑运行附件au3,在界面中点击add按钮去增加文件夹中的py文件,然后在params一列中的参数似乎显示不完整,所以我想知道以下 $plname的文本可能超过256了,超过的部分似乎不显示,如何设置这个值为无穷,求大神给个例子吧。先谢谢了。。。
_GUICtrlListView_AddSubItem($hListview11, $d, $plname, 2) 回复 1# 80107671
請上測試的代碼 回复 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 回复 3# 80107671
你的問題是
所以我想知道以下 $plname的文本可能超过256了,超过的部分似乎不显示,如何设置这个值为无穷
所以你應該直接上超過256 不顯示的例子
人家才知道怎麼幫你解決不是 把你的程式 傳出來要幫你的人 還得去拆解你的程式
問問題 應該是 針對某個 點 去解決而不是 整個面 回复 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
回复 5# 80107671
試過虛擬的 LISTVIEWP.S 顯示與 繪圖的 函數都是自己寫的
試過_GUICtrlListView_Create
查過 官方網站 ......... 無這方面的資料......
查到一個 http://www.debugease.com/vb/2713129.html
談 listview中 item.text的最大长度限制?微软的Bug?
因此 結論趨向於微軟問題無解吧!!
有沒有考慮用其他的方式處理....譬如 你點擊他 自動 彈出 提示 內容的畫面....這樣應該可以解決 回复 5# 80107671
話說回來 這只是 顯示問題 資料是不會有問題的 可以存放超過259 回复 7# kk_lee69
是的,没办法,我只能另建edit来替换它了。谢谢解答:) 本帖最后由 tubaba 于 2017-6-20 17:16 编辑
很好奇,测试了一下. 具有$LVS_OWNERDATA 风格可以全部显示
回复 9# tubaba
怪了 我也用這個風格
我的不行...............可否提供源碼 我想研究看看 本帖最后由 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 回复 11# tubaba
這個虛擬列表 我知道
我先研究看看我現在 都是用這個.....
但是 我 測試的結果是一樣出不來我想知道怎麼你的可以出來.....
研究好了再回復 回复 1# 80107671
樓上的 提供的解決方法..... 回复 11# tubaba
既然你寫過 很多 利用這個機會請教你個問題 看你解決了沒
你知道 LISTVIEW 按滑鼠 右鍵後如果 開啟選單 或者 停住的時候
會造成整行 變白......... 因為 這個過程 可能打斷了 繪圖的部分因此會出現 白行
必須要動一下 才會正常
這個你有遇到嗎??解決了嗎?? 学习一下大神的解决方案
页:
[1]
2