itljl 发表于 2008-9-8 17:55:21

新版如何解决这个排序乱码问题

点击“机器名|日期|状态”可使现表格按列排序,但中文的话会出现乱码,而旧版本可以使用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

sanhen 发表于 2008-9-8 18:30:14

有。。。新版可以将中文加空白字符串即可。个人测试得来的经验。。。

例如:

$text="中文               "

空格应该放多少,自己测试。

itljl 发表于 2008-9-8 18:44:08

原帖由 sanhen 于 2008-9-8 18:30 发表 http://www.autoitx.com/images/common/back.gif
有。。。新版可以将中文加空白字符串即可。个人测试得来的经验。。。

例如:

$text="中文               "

空格应该放多少,自己测试。
谢谢,这是什么原理,摸不着和尚。

sanhen 发表于 2008-9-8 20:32:56

原理这方面我也搞不懂,很多问题我都是摸着石头过河摸出来的。:face (31):

asdf 发表于 2008-9-8 20:59:29

bug来的,看这里:
函数:_GUICtrlListView_SetItemText

$iBuffer = StringLen($sText) + 1
$tBuffer = DllStructCreate("char Text[" & $iBuffer & "]")

我想大家都明白中文和英文的不同吧?

asdf 发表于 2008-9-8 21:00:13

这样,缓冲区就太小了,结果出事了。

itljl 发表于 2008-9-8 22:27:26

原帖由 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 & "]")

我想大家都明白中文和英文的不同吧?
这两句中,中英文有什么不同?再次请教,这里的缓冲区是怎么回事?谢谢。

asdf 发表于 2008-9-8 22:33:21

中文字符占用的字节要比英文多,所以strlen返回的长度不够容纳我们的中文。
        $iBuffer = StringLen($sText) + 1
        $tBuffer = DllStructCreate("char Text[" & $iBuffer & "]")
                      ……
        DllStructSetData($tBuffer, "Text", $sText)
在这里取出结构里的text,可以看到中文字符被截断了。

itljl 发表于 2008-9-8 22:33:39

难道将

$tBuffer = DllStructCreate("char Text[" & $iBuffer & "]")

改成:
$tBuffer = DllStructCreate("wchar Text[" & $iBuffer & "]") 就行了?

itljl 发表于 2008-9-8 22:39:17

首先谢谢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是什么意思呢?

asdf 发表于 2008-9-8 22:40:42

$tBuffer = DllStructCreate("Wchar Text[" & $iBuffer & "]")
        $iResult = _SendMessage($hWnd, $LVM_SETITEMW, 0, $pMemory, 0, "wparam", "ptr")

修正这3行即可。

asdf 发表于 2008-9-8 22:42:10

+1是因为空字符是字符串的结尾,留1给这个空字符。
页: [1]
查看完整版本: 新版如何解决这个排序乱码问题