新版如何解决这个排序乱码问题
点击“机器名|日期|状态”可使现表格按列排序,但中文的话会出现乱码,而旧版本可以使用ANS编码,新版去掉了这个编码。那新版还有其它办法解决这个问题吗?#include <GUIConstants.au3>;gui
#include <GuiListView.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("日志查看", 555, 392, 193, 125)
$listview1 = GUICtrlCreateListView("机器名|日期|状态", 16, 16, 521, 337)
GUICtrlSendMsg($listview1, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES);表格边框
GUICtrlSendMsg($listview1, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
$item1 = GUICtrlCreateListViewItem("auto1|中文|123456", $listview1)
$item2 = GUICtrlCreateListViewItem("auto2|中文|123456", $listview1)
$item3 = GUICtrlCreateListViewItem("auto3|中文|123456", $listview1)
While 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
If $msg = $listview1 Then;以下两行为行排序
Dim $B_DESCENDING
_GUICtrlListView_SimpleSort ($listview1, $B_DESCENDING, GUICtrlGetState($listview1))
EndIf
WEnd 有。。。新版可以将中文加空白字符串即可。个人测试得来的经验。。。
例如:
$text="中文 "
空格应该放多少,自己测试。 原帖由 sanhen 于 2008-9-8 18:30 发表 http://www.autoitx.com/images/common/back.gif
有。。。新版可以将中文加空白字符串即可。个人测试得来的经验。。。
例如:
$text="中文 "
空格应该放多少,自己测试。
谢谢,这是什么原理,摸不着和尚。 原理这方面我也搞不懂,很多问题我都是摸着石头过河摸出来的。:face (31): bug来的,看这里:
函数:_GUICtrlListView_SetItemText
$iBuffer = StringLen($sText) + 1
$tBuffer = DllStructCreate("char Text[" & $iBuffer & "]")
我想大家都明白中文和英文的不同吧? 这样,缓冲区就太小了,结果出事了。 原帖由 asdf 于 2008-9-8 20:59 发表 http://www.autoitx.com/images/common/back.gif
bug来的,看这里:
函数:_GUICtrlListView_SetItemText
$iBuffer = StringLen($sText) + 1
$tBuffer = DllStructCreate("char Text[" & $iBuffer & "]")
我想大家都明白中文和英文的不同吧?
这两句中,中英文有什么不同?再次请教,这里的缓冲区是怎么回事?谢谢。 中文字符占用的字节要比英文多,所以strlen返回的长度不够容纳我们的中文。
$iBuffer = StringLen($sText) + 1
$tBuffer = DllStructCreate("char Text[" & $iBuffer & "]")
……
DllStructSetData($tBuffer, "Text", $sText)
在这里取出结构里的text,可以看到中文字符被截断了。 难道将
$tBuffer = DllStructCreate("char Text[" & $iBuffer & "]")
改成:
$tBuffer = DllStructCreate("wchar Text[" & $iBuffer & "]") 就行了? 首先谢谢asdf的解答,
我对DllStructCreate ( "Struct" [,Pointer] )这个函数都不了解,因为这个函数没有汉化。
如果你有时间,希望解答一下这个函数的作用,谢谢。
但我看到这里
char 8bit(1byte) ASCII char
wchar 16bit(2byte) Wide char
2byte才能容纳下一个汉字。所以,我觉得问题可能出现在这里。
所以就有了我9楼的疑问:
“难道将
$tBuffer = DllStructCreate("char Text[" & $iBuffer & "]")
改成:
$tBuffer = DllStructCreate("wchar Text[" & $iBuffer & "]") 就行了?”
当我看到你8楼,我又疑惑了:
“所以strlen返回的长度不够容纳我们的中文。
$iBuffer = StringLen($sText) + 1”
StringLen 函数用于,返回指定字符串的字符总数.这个函数并没有限制字符多少啊?后面的+1是什么意思呢? $tBuffer = DllStructCreate("Wchar Text[" & $iBuffer & "]")
$iResult = _SendMessage($hWnd, $LVM_SETITEMW, 0, $pMemory, 0, "wparam", "ptr")
修正这3行即可。 +1是因为空字符是字符串的结尾,留1给这个空字符。
页:
[1]