Что нового

[Элементы GUI] Насколько корректна ф-я : _GUICtrlTreeView_DeleteChildren ?

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
На мой взгляд поведение ф-ии :
Код:
_GUICtrlTreeView_DeleteChildren

некорректно.
Пример:
Код:
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiTreeView.au3>

$h_GUI = GUICreate('', 230, 400)

$i_Style = BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS )
$h_TV = GUICtrlCreateTreeView(10, 10, 100, 300, $i_Style, $WS_EX_CLIENTEDGE)
$h_Item = _GUICtrlTreeView_Add($h_TV, 0, 'Test')
_GUICtrlTreeView_AddChild($h_TV, $h_Item, 'Proba') 
_GUICtrlTreeView_AddChild($h_TV, $h_Item, 'Proba1') 
_GUICtrlTreeView_Expand($h_TV)

$h_TV1=_GUICtrlTreeView_Create($h_GUI,  120, 10, 100, 300)
$h_Item1 = _GUICtrlTreeView_Add($h_TV1, 0, 'Test')
_GUICtrlTreeView_AddChild($h_TV1, $h_Item1, 'Proba') 
_GUICtrlTreeView_AddChild($h_TV1, $h_Item1, 'Proba1') 
_GUICtrlTreeView_Expand($h_TV1)

$_But=GUICtrlCreateButton("Delete Children", 10, 320, 100, 20)
$_But1=GUICtrlCreateButton("Delete Children", 120, 320, 100, 20)
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE		
			Exit
		Case $_But
			_GUICtrlTreeView_DeleteChildren($h_TV, $h_Item)
			$sText="Количество вложенных пунктов в родительском = " & _GUICtrlTreeView_GetChildCount($h_TV, $h_Item) & @CRLF & _ 
			"Установлен ли пункту флаг, как содержащий дочерние пункты = " & 	_GUICtrlTreeView_GetChildren($h_TV, $h_Item)
			MsgBox(4096+32, '', $sText)
		Case $_But1
			_GUICtrlTreeView_DeleteChildren($h_TV1, $h_Item1)
			$sText="Количество вложенных пунктов в родительском = " & _GUICtrlTreeView_GetChildCount($h_TV1, $h_Item1) & @CRLF & _ 
			"Установлен ли пункту флаг, как содержащий дочерние пункты = " & 	_GUICtrlTreeView_GetChildren($h_TV1, $h_Item1)
			MsgBox(4096+32, '', $sText)
	EndSwitch	
WEnd


После удаления дочерних элементов галочка то остается, сигнализируя о наличие дочерних пунктов ???
 

asdf8

Скриптер
Сообщения
564
Репутация
152
gregaz [?]
После удаления дочерних элементов галочка то остается, сигнализируя о наличие дочерних пунктов

"Галочка" сигнализирует не о наличие дочерних пунктов, а о наличие возможности иметь дочерние пункты.
Нужно копать в сторону функции :
Код:
_GUICtrlTreeView_SetChildren
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
gregaz
Система такая, что бывает нужно сканировать дочерние в режиме реального времени, чтобы не сканировать и не создавать всё дерево сразу. Вот тут то и нужен такой случай, когда плюсик ставится вне зависимости есть ли сейчас содержимое. Его нет но при клике оно сразу добавиться и раскроется.


Добавлено:
Сообщение автоматически объединено:

asdf8 [?]
а о наличие возможности иметь дочерние пункты.
Любой пункт может иметь возможность иметь дочерние. Поэтому это просто картинка которая может добавиться любому пункту. А вот тут от программиста зависит, будет ли он допускать случай, когда пунктов не будет а плюсик есть. Я видел программу, которая добавляет плюсики всем, но при сканировании снимает плюсик. Да это экономит на сканировании ещё одного уровня вложения, но создаёт обманку для пользователя, который изначально надеется, что там что-то есть.
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
asdf8 [?]
"Галочка" сигнализирует не о наличие дочерних пунктов, а о наличие возможности иметь дочерние пункты.

AZJIO [?]
Поэтому это просто картинка которая может добавиться любому пункту

Эта обманка приводит к неправильной работе других ф-й , в частности :
Код:
_GUICtrlTreeView_GetChildren
выдает True, т.е. Пункту установлен флаг, как содержащий дочерние пункты (из переведенной справки) .

Значит надо вместо :
Код:
_GUICtrlTreeView_DeleteChildren($h_TV, $h_Item)

делать :
Код:
_GUICtrlTreeView_DeleteChildren($h_TV, $h_Item)
_GUICtrlTreeView_SetChildren($h_TV, $h_Item, False)


Наверное это можно было выполнить и в теле ф-ий



Добавлено:
Сообщение автоматически объединено:

Тогда ф-ию:
Код:
_GUICtrlTreeView_GetChildren
вообще надо изъять, как не несущую информации, а вместо нее использовать:
Код:
_GUICtrlTreeView_GetChildCount($hWnd, $hItem)


Правда и она дает -1 вместо 0 , а справка об этом умалчивает , но это все же не обманка
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
gregaz [?]
Правда и она дает -1 вместо 0
Я об этом писал здесь. Может для совместимости оставили. По мне так нужно лучше оставлять для правильности, так как не совместимость версий и так зашкаливает на одних только константах для MsgBox.

Ещё глюк так и перекочевал в новую версию, видимо я сообщил, когда релиз уже был готов (на следующий день релиз вышел).
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
AZJIO [?]
так как не совместимость версий и так зашкаливает

Это точно, вчера попробовал 10-ку. Пришлось откатить назад. Все скрипты поправлять придется
 
Верх