Что нового

GUITreeView некорректное отображение информации

Centrinar

Новичок
Сообщения
100
Репутация
1
Пример создания GUITreeView из одной темы с данного форума. Проблема в том что если повесить какой нибудь элемент на вкладку "General" например GUICtrlCreateGroup то этот элемент будет отображаться на всех последующих вкладках дерева, как возможно это убрать?
И второй вопрос. Как задать чтобы дерево уже было раскрыто при открытии $hGUI
:IL_AutoIt_1:

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GUITreeView.au3>
#include <Array.au3>

   Global $DEF_ID
   Global  $aID[1]
   $hGUI = GUICreate("Advanced TreeView Usage Demo", 350, 215)

   $hTreeView = GUICtrlCreateTreeView(6, 6, 110, 150, -1, $WS_EX_STATICEDGE+$WS_EX_CLIENTEDGE)

   GUICtrlCreateLabel("Advanced TreeView Usage Demo", 140, 10, 200, 20)
   
   $hGeneral_TV = GUICtrlCreateTreeViewItem("General",$hTreeView)
   AddControl($hTreeView,$hGeneral_TV)
      $hAbout_TVItem   = GUICtrlCreateTreeViewItem("About",$hGeneral_TV)
      AddControl($hTreeView,$hAbout_TVItem)
      AddControl($hTreeView,GUICtrlCreateLabel("About", 130, 10, 200, 30), $hAbout_TVItem)  
      GUICtrlSetFont(-1, 12, 800, 0, "Georgia")
      AddControl($hTreeView,GUICtrlCreateLabel("This little scripts demonstates the using of a treeview-control.",190,70,100,60),$hAbout_TVItem)
      $hBtMyButton=GUICtrlCreateButton("My Button", 190, 135, 70, 20)
      AddControl($hTreeView,$hBtMyButton,$hAbout_TVItem)
      $hComp_TVItem=GUICtrlCreateTreeViewItem("Computer",$hGeneral_TV)
      AddControl($hTreeView,$hComp_TVItem)
      AddControl($hTreeView,GUICtrlCreateLabel("Computer", 130, 10, 200, 30),$hComp_TVItem)  
      GUICtrlSetFont(-1, 12, 800, 0, "Georgia")
      AddControl($hTreeView,GUICtrlCreateLabel( _
         StringFormat("Name:\t%sOS:\n\t%s\nSP:\t%s", @ComputerName, @OSVersion, @OSServicePack), 120, 30, 200, 80),$hComp_TVItem)
      $hUser_TVItem=GUICtrlCreateTreeViewItem("User",$hGeneral_TV)
      AddControl($hTreeView,$hUser_TVItem)
      AddControl($hTreeView,GUICtrlCreateLabel("User Name", 130, 10, 200, 30),$hUser_TVItem)
      GUICtrlSetFont(-1, 12, 800, 0, "Georgia")
      AddControl($hTreeView,GUICtrlCreateLabel("User Name: " & @Tab  & @UserName, 120, 30, 200, 80),$hUser_TVItem)
   $hDisplay_TV=GUICtrlCreateTreeViewItem("Display", $hTreeView)
   AddControl($hTreeView,$hDisplay_TV)
      $hResol_TVItem =GUICtrlCreateTreeViewItem("Resolution",$hDisplay_TV)
      AddControl($hTreeView,$hResol_TVItem)
      AddControl($hTreeView,GUICtrlCreateLabel("Resolution", 130, 10, 200, 30),$hResol_TVItem)
      GUICtrlSetFont(-1, 12, 800, 0, "Georgia")
      $hOther_TVItem =GUICtrlCreateTreeViewItem("Other", $hDisplay_TV)
      AddControl($hTreeView,$hOther_TVItem)
      AddControl($hTreeView,GUICtrlCreateLabel("Other", 130, 10, 200, 30),$hOther_TVItem)
      GUICtrlSetFont(-1, 12, 800, 0, "Georgia")
      AddControl($hTreeView,GUICtrlCreateLabel("Some Other Data Controls", 150, 50),$hOther_TVItem)

   $AddControl_Button = GUICtrlCreateButton("Add Control", 10, 185, 70, 20)
   $Exit_Button = GUICtrlCreateButton("Exit", 270, -1, '', '')
 ;------------------------------------------------------------------------------------------------
GUISetState()
 
While 1
   $nMsg = GUIGetMsg()
   $iItem_CtrlID = GUICtrlRead($hTreeView)
   Switch $nMsg
      Case  -3,$Exit_Button
         Exit
      Case  $iItem_CtrlID
         If  $DEF_ID=$iItem_CtrlID Then ContinueLoop
         _CtrlSetState1($hTreeView,$iItem_CtrlID,$aID); ===>
      Case $AddControl_Button
          ; If _GUICtrlTreeView_GetParentHandle($hTreeView,$iItem_CtrlID) =0 Then ContinueLoop  ; **** Добавлено  ***
                        AddControl($hTreeView,GUICtrlCreateLabel("New Control",  10, 160, 200, 20), $iItem_CtrlID,$GUI_SHOW)  
        GUICtrlSetColor(-1, 0xFF0000)
   EndSwitch
WEnd

Func AddControl($hTV, $iCtrID, $iParentCtrlID=0,$iState=$GUI_HIDE)
   $iInd = _ArraySearch($aID, $iParentCtrlID, 1, 0, 0, 1)
   If $iParentCtrlID=0 Then
      _ArrayAdd($aID,$iCtrID)
   Else  
      _ArrayInsert($aID, $iInd, $iCtrID)
   EndIf  
   GUICtrlSetState($iCtrID,$iState)
EndFunc

Func _CtrlSetState1($hTV,$iCtrlID,$aArray,$state=$GUI_SHOW)
   ;If _GUICtrlTreeView_GetParentHandle($hTV,$iCtrlID) =0 Then Return
   $iIndex = _ArraySearch($aArray, $iCtrlID, 1, 0, 0, 1)
   While 1
      $iIndex-=1
     ; If _GUICtrlTreeView_GetText($hTV,$aArray[$iIndex]) <> '' Then ExitLoop
     If _GUICtrlTreeView_GetText($hTV,$aArray[$iIndex]) <> '' Or $iIndex <1 Then ExitLoop
             GUICtrlSetState($aArray[$iIndex], $state)
   WEnd
   If $state=$GUI_SHOW And $DEF_ID <>'' Then  _CtrlSetState1($hTV, $DEF_ID,$aArray,$GUI_HIDE); Скрыть открытые прежде элементы
   $DEF_ID=$iCtrlID
EndFunc
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
Centrinar [?]
Как задать чтобы дерево уже было раскрыто при открытии $hGUI
Код:
;..........................
 _GUICtrlTreeView_Expand($hTreeView)
 ;------------------------------------------------------------------------------------------------
GUISetState()
 While 1
;.........................
 
Автор
C

Centrinar

Новичок
Сообщения
100
Репутация
1
А можно ли задать, чтобы он при запуске открывал дерево на конкретном пункте, тогда мы решить проблему с отображением?
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
Centrinar [?]
если повесить какой нибудь элемент на вкладку "General" например GUICtrlCreateGroup то этот элемент будет отображаться на всех последующих вкладках дерева, как возможно это убрать?
Раскомментируй строчку :
Код:
If _GUICtrlTreeView_GetParentHandle($hTreeView,$iItem_CtrlID) =0 Then ContinueLoop  ; **** Раскомментировано  ***
                        AddControl($hTreeView,GUICtrlCreateLabel("New Control",  10, 160, 200, 20), $iItem_CtrlID,$GUI_SHOW)

При этом Родительские элементы не будут использоваться для добавления элементов
Я думаю этого достаточно

[?]
А можно ли задать, чтобы он при запуске открывал дерево на конкретном пункте, тогда мы решить проблему с отображением?
_GUICtrlTreeView_Expand($hTreeView, $hItem )
 
Автор
C

Centrinar

Новичок
Сообщения
100
Репутация
1
:scratch:


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

_GUICtrlTreeView_Expand($hTreeView, $hItem ) не работате т.е. он открывает дерево а нужный пункт нет
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
Centrinar [?]
он открывает дерево а нужный пункт нет
А значит я тебя не понял.Тогда так:
Код:
;..........................
 _GUICtrlTreeView_Expand($hTreeView)
 _CtrlSetState1($hTreeView,$hAbout_TVItem,$aID); ===>
;------------------------------------------------------------------------------------------------
GUISetState()
 While 1
;.........................
 
Автор
C

Centrinar

Новичок
Сообщения
100
Репутация
1
gregaz а возможно ли сделать дерево только из родительские пунктов? Но что бы все элементы отображались корректно?
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
Centrinar [?]
gregaz а возможно ли сделать дерево только из родительские пунктов? Но что бы все элементы отображались корректно?
Вот :
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUITreeView.au3>
#include <Array.au3>

   Global $DEF_ID
   Global  $aID[1]
   
   $hGUI = GUICreate("Advanced TreeView Usage Demo", 350, 215)

   $hTreeView = GUICtrlCreateTreeView(6, 6, 110, 150, -1, $WS_EX_STATICEDGE+$WS_EX_CLIENTEDGE)
   
	$hAbout_TVItem   = GUICtrlCreateTreeViewItem("About",$hTreeView)
		AddControl($hTreeView,$hAbout_TVItem)
		AddControl($hTreeView,GUICtrlCreateLabel("About", 130, 10, 200, 30), $hAbout_TVItem)  
		GUICtrlSetFont(-1, 12, 800, 0, "Georgia")
		AddControl($hTreeView,GUICtrlCreateLabel("This little scripts demonstates the using of a treeview-control.",190,70,100,60),$hAbout_TVItem)
		$hBtMyButton=GUICtrlCreateButton("My Button", 190, 135, 70, 20)
		AddControl($hTreeView,$hBtMyButton,$hAbout_TVItem)
	$hComp_TVItem=GUICtrlCreateTreeViewItem("Computer",$hTreeView )
		AddControl($hTreeView,$hComp_TVItem)
		 AddControl($hTreeView,GUICtrlCreateLabel("Computer", 130, 10, 200, 30),$hComp_TVItem)  
		GUICtrlSetFont(-1, 12, 800, 0, "Georgia")
		AddControl($hTreeView,GUICtrlCreateLabel( _
		StringFormat("Name:\t%sOS:\n\t%s\nSP:\t%s", @ComputerName, @OSVersion, @OSServicePack), 120, 30, 200, 80),$hComp_TVItem)
	$hUser_TVItem=GUICtrlCreateTreeViewItem("User",$hTreeView)
		AddControl($hTreeView,$hUser_TVItem)
		AddControl($hTreeView,GUICtrlCreateLabel("User Name", 130, 10, 200, 30),$hUser_TVItem)
		GUICtrlSetFont(-1, 12, 800, 0, "Georgia")
		AddControl($hTreeView,GUICtrlCreateLabel("User Name: " & @Tab  & @UserName, 120, 30, 200, 80),$hUser_TVItem)
   
   $AddControl_Button = GUICtrlCreateButton("Add Control", 10, 185, 70, 20)
   $Exit_Button = GUICtrlCreateButton("Exit", 270, -1, '', '')
  
  _CtrlSetState($hTreeView,$hAbout_TVItem,$aID);*** Добавлено ***
  GUISetState()
 
	While 1
	   $nMsg = GUIGetMsg()
	   $iItem_CtrlID = GUICtrlRead($hTreeView)
	   Switch $nMsg
		  Case  -3, $Exit_Button
			 Exit
		  Case  $iItem_CtrlID
				If  $DEF_ID=$iItem_CtrlID Then ContinueLoop
				_CtrlSetState($hTreeView, $DEF_ID,$aID,$GUI_HIDE); ===>
				_CtrlSetState($hTreeView,$iItem_CtrlID,$aID ); ===>
		  Case $AddControl_Button
				;If  Not $DEF_ID Then ContinueLoop
				AddControl($hTreeView,GUICtrlCreateLabel("New Control",  10, 160, 200, 20), $iItem_CtrlID,$GUI_SHOW)  
				GUICtrlSetColor(-1, 0xFF0000)
	   EndSwitch
	WEnd
	
Func AddControl($hTV, $iCtrID, $iParentCtrlID=0, $iState=$GUI_HIDE)
	$iInd = _ArraySearch($aID, $iParentCtrlID, 1, 0, 0, 1)
	If IsTVItem($hTV, $iCtrID) Then
		_ArrayAdd($aID,$iCtrID)
	Else  
		_ArrayInsert($aID, $iInd+1, $iCtrID)
	EndIf  
   GUICtrlSetState($iCtrID,$iState)
EndFunc	
	
Func _CtrlSetState($hTV,$iCtrlID,$aArray,$state=$GUI_SHOW)
	$iIndex = _ArraySearch($aArray, $iCtrlID, 1, 0, 0, 1)
	If $iIndex=-1 Then Return
	While 1
		$iIndex+=1
		If  IsTVItem($hTV,$aArray[$iIndex]) Or $iIndex >= UBound($aArray)-1 Then ExitLoop
		GUICtrlSetState($aArray[$iIndex], $state)
	WEnd
	$DEF_ID=$iCtrlID
EndFunc

Func IsTVItem($hTV, $iCtrID)	
	Return _GUICtrlTreeView_GetText($hTV, $iCtrID)
EndFunc

Правда какое же это дерево без дочерних элементов :smile:
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
Возможно кому-то пригодится вариант с полным деревом
Имеется возможность добавлять открываемые элементы как в
родительские, так и в дочерние ветки дерева :
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GUITreeView.au3>
#include <Array.au3>

Global $DEF_ID
Global  $aID[1]

$hGUI = GUICreate("Advanced TreeView Usage Demo", 350, 215)

$hTreeView = GUICtrlCreateTreeView(6, 6, 110, 150, -1, $WS_EX_STATICEDGE+$WS_EX_CLIENTEDGE)

$hGeneral_TV = GUICtrlCreateTreeViewItem("General",$hTreeView)
    AddControl($hTreeView,$hGeneral_TV)
    $hAbout_TVItem   = GUICtrlCreateTreeViewItem("About",$hGeneral_TV)
    AddControl($hTreeView,$hAbout_TVItem)
    AddControl($hTreeView,GUICtrlCreateLabel("About", 130, 10, 200, 30), $hAbout_TVItem)  
    GUICtrlSetFont(-1, 12, 800, 0, "Georgia")
    AddControl($hTreeView,GUICtrlCreateLabel("This little scripts demonstates the using of a treeview-control.",190,70,100,60),$hAbout_TVItem)
    $hBtMyButton=GUICtrlCreateButton("My Button", 190, 135, 70, 20)
    AddControl($hTreeView,$hBtMyButton,$hAbout_TVItem)
    $hComp_TVItem=GUICtrlCreateTreeViewItem("Computer",$hGeneral_TV)
    AddControl($hTreeView,$hComp_TVItem)
    AddControl($hTreeView,GUICtrlCreateLabel("Computer", 130, 10, 200, 30),$hComp_TVItem)  
    GUICtrlSetFont(-1, 12, 800, 0, "Georgia")
    AddControl($hTreeView,GUICtrlCreateLabel( _
    StringFormat("Name:\t%sOS:\n\t%s\nSP:\t%s", @ComputerName, @OSVersion, @OSServicePack), 120, 30, 200, 80),$hComp_TVItem)
    $hUser_TVItem=GUICtrlCreateTreeViewItem("User",$hGeneral_TV)
    AddControl($hTreeView,$hUser_TVItem)
    AddControl($hTreeView,GUICtrlCreateLabel("User Name", 130, 10, 200, 30),$hUser_TVItem)
    GUICtrlSetFont(-1, 12, 800, 0, "Georgia")
    AddControl($hTreeView,GUICtrlCreateLabel("User Name: " & @Tab  & @UserName, 120, 30, 200, 80),$hUser_TVItem)
$hDisplay_TV=GUICtrlCreateTreeViewItem("Display", $hTreeView)
    AddControl($hTreeView,$hDisplay_TV)
    $hResol_TVItem =GUICtrlCreateTreeViewItem("Resolution",$hDisplay_TV)
    AddControl($hTreeView,$hResol_TVItem)
    AddControl($hTreeView,GUICtrlCreateLabel("Resolution", 130, 10, 200, 30),$hResol_TVItem)
    GUICtrlSetFont(-1, 12, 800, 0, "Georgia")
    $hOther_TVItem =GUICtrlCreateTreeViewItem("Other", $hDisplay_TV)
    AddControl($hTreeView,$hOther_TVItem)
    AddControl($hTreeView,GUICtrlCreateLabel("Other", 130, 10, 200, 30),$hOther_TVItem)
    GUICtrlSetFont(-1, 12, 800, 0, "Georgia")
    AddControl($hTreeView,GUICtrlCreateLabel("Some Other Data Controls", 150, 50),$hOther_TVItem)

$AddControl_Button = GUICtrlCreateButton("Add Control", 10, 185, 70, 20)
$Exit_Button = GUICtrlCreateButton("Exit", 270, -1, '', '')

_GUICtrlTreeView_Expand($hTreeView)
_CtrlSetState($hTreeView,$hAbout_TVItem,$aID)
GUISetState()
 
While 1
    $nMsg = GUIGetMsg()
    $iItem_CtrlID = GUICtrlRead($hTreeView)
    Switch $nMsg
        Case  -3,$Exit_Button
            Exit
        Case  $iItem_CtrlID
            If  $DEF_ID=$iItem_CtrlID Then ContinueLoop
            _CtrlSetState($hTreeView, $DEF_ID,$aID,$GUI_HIDE); ===>
            _CtrlSetState($hTreeView,$iItem_CtrlID,$aID); ===>
        Case $AddControl_Button
            If  $DEF_ID<>$iItem_CtrlID Then ContinueLoop
            AddControl($hTreeView,GUICtrlCreateLabel("New Control",  10, 160, 200, 20), $iItem_CtrlID,$GUI_SHOW)  
            GUICtrlSetColor(-1, 0xFF0000)
   EndSwitch

WEnd

Func AddControl($hTV, $iCtrID, $iParentCtrlID=0, $iState=$GUI_HIDE)
    $iInd = _ArraySearch($aID, $iParentCtrlID, 1, 0, 0, 1)
    If IsTVItem($hTV, $iCtrID) Then
        _ArrayAdd($aID,$iCtrID)
    Else  
        _ArrayInsert($aID, $iInd+1, $iCtrID)
    EndIf  
   GUICtrlSetState($iCtrID,$iState)
;_ArrayDisplay($aID)
EndFunc 
    
Func _CtrlSetState($hTV,$iCtrlID,$aArray,$state=$GUI_SHOW)
    $iIndex = _ArraySearch($aArray, $iCtrlID, 1, 0, 0, 1)
    If $iIndex=-1 Then Return
    While 1
        $iIndex+=1
        If  IsTVItem($hTV,$aArray[$iIndex]) Or $iIndex >= UBound($aArray)-1 Then ExitLoop
        GUICtrlSetState($aArray[$iIndex], $state)
    WEnd
    If $state=$GUI_SHOW Then $DEF_ID=$iCtrlID
EndFunc

Func IsTVItem($hTV, $iCtrID)    
    Return _GUICtrlTreeView_GetText($hTV, $iCtrID)
EndFunc
 
Верх