afan 发表于 2010-9-17 13:12:40

_GUICtrlTab_DeleteItem 删除某标签页后的错位问题

        下面是一个使用_GUICtrlTab_DeleteItem() 删除某标签页的例子,大家测试后会发现如下问题:
       
        _GUICtrlTab_DeleteItem 可以删除指定的标签,但它不会删除其页面的控件(函数内有说明)
        因此在使用_GUICtrlTab_DeleteItem 删除标签标签时,还需另外删除其页面的控件。
        但存在一个严重的问题,虽然指定页已删除,但其后的标签页内的控件并不会跟随其标签页也向前移一位,
        而导致标签页内的控件错位,似乎页面内的控件只认标签的0基索引。
       
        比如你删除了标签“3”,会发现原标签“3”所在的索引位空了,但由于标签“4”已向前移了一位,占领了原
        “3”的索引,结果就是显示标签“4”内的控件没了,后面的标签“5”、标签“6”同样因此错位。
       
        这样的话 _GUICtrlTab_DeleteItem 除了制造错误(删除标签页后不指定下一个标签也就算了),还有别的功能吗?很郁闷~~ {:face (254):}

#include <GuiTab.au3>

GUICreate('test')
$Tab = GUICtrlCreateTab(5, 5, 392, 360)
Dim $L
For $i = 0 To 6
        GUICtrlCreateTabItem($i)
        $L[$i] = GUICtrlCreateLabel($i, 20 + $i * 48, 50)
Next
GUICtrlCreateTabItem('')
$Button1 = GUICtrlCreateButton('删除当前标签', 100, 370, 100, 22)
GUISetState()

While 1
        $msg = GUIGetMsg()
        Switch $msg
                Case -3
                        Exit
                Case $Button1
                        $i = _GUICtrlTab_GetCurSel($Tab)
                        $c = _GUICtrlTab_GetItemText($Tab, $i)
                        _GUICtrlTab_DeleteItem($Tab, $i)
                        GUICtrlDelete($L[$c])
        EndSwitch
WEnd

3mile 发表于 2010-9-17 14:09:50

确实很奇怪,做了个测试:不删控件,只删控件数组中控件句柄。
怪事又出现了。
#include <GuiTab.au3>
#include <array.au3>
GUICreate('test')
$Tab = GUICtrlCreateTab(5, 5, 392, 360)
Dim $L
For $i = 0 To 6
        GUICtrlCreateTabItem($i)
        $L[$i] = GUICtrlCreateLabel($i, 20 + $i * 48, 50)
Next
GUICtrlCreateTabItem('')
_ArrayDisplay($L)
$Button1 = GUICtrlCreateButton('删除当前标签', 100, 370, 100, 22)
GUISetState()

While 1
        $msg = GUIGetMsg()
        Switch $msg
                Case -3
                        Exit
                Case $Button1
                        $i = _GUICtrlTab_GetCurSel($Tab)                       
                        $c = _GUICtrlTab_GetItemText($Tab, $i)
                        ;GUICtrlDelete($L[$c])
                        _ArrayDelete($L,$i)
                        _GUICtrlTab_DeleteItem($Tab, $i)

;~                 Case $Tab
;~                         MsgBox(0,_GUICtrlTab_GetCurSel($Tab),_GUICtrlTab_GetItemCount($Tab))
        EndSwitch
WEnd

afan 发表于 2010-9-17 14:20:17

确实很奇怪,做了个测试:不删控件,只删控件数组中控件句柄。
怪事又出现了。
3mile 发表于 2010-9-17 14:09 http://www.autoitx.com/images/common/back.gif


    这样的话相当于一直都在删除最后一个索引内的控件,然后保持错位~~
弄不清的事情,只能很灵异的说……

afan 发表于 2010-9-17 14:42:51

本帖最后由 afan 于 2010-9-17 16:23 编辑

回复 2# 3mile


    其实删除数组内的元素与删除控件并无关联,注释掉 GUICtrlDelete($L[$c]) 就是一样的效果~
也就是说,当前的页面控件只是单纯的绑定了索引号,而不会跟随索引的标题。这个就郁闷之极了…

afan 发表于 2010-9-17 16:26:30

看来只能用类似浏览器的方式解决了,只用标签头,其它的页面均另外创建,根据 Tab 的索引文字或应用程序数据来判断相关页面控件的显示/隐藏。

貌似大家都不关心此问题哦,没关系,看看了解下就好,以后碰到此问题不至于迷惑 ~

liufenglg 发表于 2010-9-17 16:47:02

This does not delete the controls on the tabitems

afan 发表于 2010-9-17 18:23:11

This does not delete the controls on the tabitems
liufenglg 发表于 2010-9-17 16:47 http://www.autoitx.com/images/common/back.gif


    这就是我在一楼所说的“(函数内有说明)”
页: [1]
查看完整版本: _GUICtrlTab_DeleteItem 删除某标签页后的错位问题