Что нового

[Элементы GUI] Изменение названия в опредленной группе TreeView

SealAlbinos

Продвинутый
Сообщения
152
Репутация
57
данная программа при выделение группы получает текст подгрупп и ее
суть изменить этот текст, но проблема заключается в том что изменяет она именно во группах, а нужно именно в выделенной
p.s таких групп будет еще 12 и для каждой прописывать input не вариант

Код:
#include <GuiConstants.au3>
#include <WindowsConstants.au3>
#include <GuiTreeView.au3>

$GUI = GUICreate("TreeView Find Item", 530, 300)

$TreeView = GUICtrlCreateTreeView(15, 20, 200, 230, -1, $WS_EX_CLIENTEDGE+$WS_EX_DLGMODALFRAME)
$Input1 = GUICtrlCreateInput("",300, 10, 100, 20)
$Input2 = GUICtrlCreateInput("",300, 50, 100, 20)

Global $aItems[11]

$item1 = GUICtrlCreateTreeViewItem("Weapon 1", $TreeView)
$subitem1 = GUICtrlCreateTreeViewItem("Old ID: 0", $item1)
$subitem2 = GUICtrlCreateTreeViewItem("New ID: 0", $item1)

$item2 = GUICtrlCreateTreeViewItem("Weapon 2", $TreeView)
$subitem1 = GUICtrlCreateTreeViewItem("Old ID: 1", $item2)
$subitem2 = GUICtrlCreateTreeViewItem("New ID: 1", $item2)

    GUICtrlSetImage(-1, "Shell32.dll", -5, 3)
    GUICtrlSetImage(-1, "Shell32.dll", -4, 4)


$GetIndex_Button = GUICtrlCreateButton("Get Index", 20, 270, 60, 20)
$GetIndex_Button2 = GUICtrlCreateButton("Get Index", 300, 270, 60, 20)

GUISetState(@SW_SHOW, $GUI)
While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
		Case $GetIndex_Button2
			GUICtrlSetData($subitem1, GuiCtrlRead($Input1))
		 Case $GetIndex_Button
            $iIndex = 0

            $hItem = _GUICtrlTreeView_GetFirstItem($TreeView)

            For $i = 0 To _GUICtrlTreeView_GetCount($TreeView)-1
                If _GUICtrlTreeView_GetSelected($TreeView, $hItem) Then $iIndex = $i+1

                $hItem = _GUICtrlTreeView_GetNext($TreeView, $hItem)
            Next

            ;MsgBox(64, "", StringFormat("Selected Text: %s\nSelected Index: %i", GUICtrlRead($TreeView, 1), $iIndex), 0, $GUI)
			_GetGroupsChildren()
    EndSwitch
 WEnd

 Func _GetGroupsChildren()
    Local $hWnd, $hTV, $hTMP, $sText
    $hWnd = WinGetHandle("[CLASS:AutoIt v3 GUI; TITLE:TreeView Find Item]", "")
    $hTV = ControlGetHandle($hWnd, "", "[CLASS:SysTreeView32; INSTANCE:1]")
    $hTMP = _GUICtrlTreeView_FindItem($hTV, GUICtrlRead($TreeView, 1))
    If $hTMP Then
        $hTMP = _GUICtrlTreeView_GetFirstChild($hTV, $hTMP)
        If $hTMP Then
            $sText = _GUICtrlTreeView_GetText($hTV, $hTMP)
            While 1
                $hTMP = _GUICtrlTreeView_GetNextSibling($hTV, $hTMP)
                If $hTMP Then
                    $sText &= @CRLF & _GUICtrlTreeView_GetText($hTV, $hTMP)
                Else
             ;       MsgBox(64, "Done", $sText)
			$aRegExpValue = StringRegExp($sText, "Old ID: ((?s).*?)New", 3)
			GUICtrlSetData($Input1, $aRegExpValue[0])
			$aRegExpValue = StringRegExp($sText, "New ID: ((?s).*?)$", 3)
			GUICtrlSetData($Input2, $aRegExpValue[0])
                    ExitLoop
                EndIf
            WEnd
        EndIf
    EndIf
 EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
ну, с рег.выражениями я не очень. поэтому без них
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <TreeViewConstants.au3>
#include <WindowsConstants.au3>
 #include <GuiTreeView.au3>
$Form1 = GUICreate("Form1", 615, 437, 192, 124)
$TreeView = GUICtrlCreateTreeView(8, 8, 321, 417)
$item1 = GUICtrlCreateTreeViewItem("Weapon 1", $TreeView)
$subitem1 = GUICtrlCreateTreeViewItem("Old ID: 0", $item1)
$subitem2 = GUICtrlCreateTreeViewItem("New ID: 0", $item1)
$item2 = GUICtrlCreateTreeViewItem("Weapon 2", $TreeView)
$subitem1 = GUICtrlCreateTreeViewItem("Old ID: 1", $item2)
$subitem2 = GUICtrlCreateTreeViewItem("New ID: 1", $item2)
$Input1 = GUICtrlCreateInput("", 344, 32, 249, 21)
$Button1 = GUICtrlCreateButton("Ок", 520, 72, 75, 25, $BS_DEFPUSHBUTTON)
GUISetState(@SW_SHOW)


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			$txt = StringStripWS(GUICtrlRead($Input1),3)
			If $txt Then _SetText($TreeView, $txt)
	EndSwitch
WEnd

Func _SetText($TV, $Text)
	Local $hItem = _GUICtrlTreeView_GetSelection($TV)
	If Not $hItem Then Return
	__TVT($TV, $hItem, $Text)
EndFunc   ;==>_SetText

Func __TVT($TV, $hItem, $Text)
	Local $hChild = _GUICtrlTreeView_GetFirstChild($TV, $hItem)
	If Not $hChild Then Return
	While 1
		_GUICtrlTreeView_SetText($TV, $hChild,$Text)
		__TVT($TV, $hChild, $Text)
		$hChild = _GUICtrlTreeView_GetNextChild($TV, $hChild)
		If Not $hChild Then ExitLoop
	WEnd
EndFunc   ;==>__TVUnCheck
если это то, что нужно, то допилишь сам дальше
 
Автор
SealAlbinos

SealAlbinos

Продвинутый
Сообщения
152
Репутация
57
joiner сказал(а):
ну, с рег.выражениями я не очень. поэтому без них
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <TreeViewConstants.au3>
#include <WindowsConstants.au3>
 #include <GuiTreeView.au3>
$Form1 = GUICreate("Form1", 615, 437, 192, 124)
$TreeView = GUICtrlCreateTreeView(8, 8, 321, 417)
$item1 = GUICtrlCreateTreeViewItem("Weapon 1", $TreeView)
$subitem1 = GUICtrlCreateTreeViewItem("Old ID: 0", $item1)
$subitem2 = GUICtrlCreateTreeViewItem("New ID: 0", $item1)
$item2 = GUICtrlCreateTreeViewItem("Weapon 2", $TreeView)
$subitem1 = GUICtrlCreateTreeViewItem("Old ID: 1", $item2)
$subitem2 = GUICtrlCreateTreeViewItem("New ID: 1", $item2)
$Input1 = GUICtrlCreateInput("", 344, 32, 249, 21)
$Button1 = GUICtrlCreateButton("Ок", 520, 72, 75, 25, $BS_DEFPUSHBUTTON)
GUISetState(@SW_SHOW)


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			$txt = StringStripWS(GUICtrlRead($Input1),3)
			If $txt Then _SetText($TreeView, $txt)
	EndSwitch
WEnd

Func _SetText($TV, $Text)
	Local $hItem = _GUICtrlTreeView_GetSelection($TV)
	If Not $hItem Then Return
	__TVT($TV, $hItem, $Text)
EndFunc   ;==>_SetText

Func __TVT($TV, $hItem, $Text)
	Local $hChild = _GUICtrlTreeView_GetFirstChild($TV, $hItem)
	If Not $hChild Then Return
	While 1
		_GUICtrlTreeView_SetText($TV, $hChild,$Text)
		__TVT($TV, $hChild, $Text)
		$hChild = _GUICtrlTreeView_GetNextChild($TV, $hChild)
		If Not $hChild Then ExitLoop
	WEnd
EndFunc   ;==>__TVUnCheck
если это то, что нужно, то допилишь сам дальше
Ваш способ хорошо изменять в выделенной категории, но он изменяет все подкатегории, а нужно только одну
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
SealAlbinos
ты хочешь выделить группу и изменить в ней первый пункт? а остальные? задача описана не полно
можно убрать рекурсию
 
Автор
SealAlbinos

SealAlbinos

Продвинутый
Сообщения
152
Репутация
57
joiner сказал(а):
SealAlbinos
ты хочешь выделить группу и изменить в ней первый пункт? а остальные? задача описана не полно
можно убрать рекурсию
суть в том что для каждой подгруппы есть свой input
к примеру Old ID: 0 относится к Input1
А New ID: 0 относится к Input2
и данные должны изменяться в зависимости веденных значений в Input
т.е если вводим мы в Input1 (который относится к Old ID: 0)к примеру "3" то это значение должно измениться только в Old ID: 0
если вводим в Input2 (который относится к New ID: 0) "5" то он уже изменяется только в New ID: 0
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
то есть, во всех группах должны измениться тот или иной пункт в зависимости от используемого поля ввода?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
ну может так. корявенько, но смысл, думаю, понятен

Код:
$Form1 = GUICreate("Form1", 615, 437, 192, 124)
$TreeView = GUICtrlCreateTreeView(8, 8, 321, 417)
$item1 = GUICtrlCreateTreeViewItem("Weapon 1", $TreeView)
$subitem1 = GUICtrlCreateTreeViewItem("Old ID: 0", $item1)
$subitem2 = GUICtrlCreateTreeViewItem("New ID: 0", $item1)
GUICtrlSetState($item1, $GUI_EXPAND)
$item2 = GUICtrlCreateTreeViewItem("Weapon 2", $TreeView)
$subitem1 = GUICtrlCreateTreeViewItem("Old ID: 1", $item2)
$subitem2 = GUICtrlCreateTreeViewItem("New ID: 1", $item2)
GUICtrlSetState($item2, $GUI_EXPAND)
$Input1 = GUICtrlCreateInput("", 344, 32, 249, 21)
$Input2 = GUICtrlCreateInput("", 344, 65, 249, 21)
$Button1 = GUICtrlCreateButton("Ок", 520, 100, 75, 25, $BS_DEFPUSHBUTTON)
GUISetState(@SW_SHOW)
Local $txt, $chkt

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			$txt = StringStripWS(GUICtrlRead($Input1), 3)
			$chkt = 'Old ID: '
			GUICtrlSetData($Input1, '')
			If Not $txt Then
				$txt = StringStripWS(GUICtrlRead($Input2), 3)
				$chkt = 'New ID: '
				GUICtrlSetData($Input2, '')
			EndIf
			If $txt Then
				Local $hParent = _GUICtrlTreeView_GetFirstItem($TreeView)
				If $hParent Then _SetText($TreeView, $hParent, $txt, $chkt)
				$chkt = ''
			EndIf

	EndSwitch
WEnd

Func _SetText($TV, $hParent, $Text, $CheckTxt)
	Local $hNext = __TVT($TV, $hParent, $Text, $CheckTxt)
	If Not $hNext Then Return
	_SetText($TV, $hNext, $Text, $CheckTxt)
EndFunc   ;==>_SetText

Func __TVT($TV, $hParent, $Text, $CheckTxt)
	Local $hChild = _GUICtrlTreeView_GetFirstChild($TV, $hParent)
	If Not $hChild Then Return
	While 1
		If StringInStr(_GUICtrlTreeView_GetText($TV, $hChild), $CheckTxt) Then
			_GUICtrlTreeView_SetText($TV, $hChild, $CheckTxt & $Text)
			ExitLoop
		EndIf
		$hChild = _GUICtrlTreeView_GetNextChild($TV, $hChild)
		If Not $hChild Then ExitLoop
	WEnd
	Return _GUICtrlTreeView_GetNextSibling($TV, $hParent)
EndFunc   ;==>__TVT
 
Автор
SealAlbinos

SealAlbinos

Продвинутый
Сообщения
152
Репутация
57
Опять же срабатывает так что он меняет в первой категории и во второй категории, можно ли сделать так чтоб именно изменял в выделенной категории
т.е если выделано Weapon 1 то именно там и изменял значение, а на Weapon 2 он не залезал
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			$txt = StringStripWS(GUICtrlRead($Input1), 3)
			$chkt = 'Old ID: '
			GUICtrlSetData($Input1, '')
			If Not $txt Then
				$txt = StringStripWS(GUICtrlRead($Input2), 3)
				$chkt = 'New ID: '
				GUICtrlSetData($Input2, '')
			EndIf
			If $txt Then
				Local $hParent = _GUICtrlTreeView_GetSelection($TreeView)
				If $hParent Then __TVT($TreeView, $hParent, $txt, $chkt)
				$chkt = ''
			EndIf

	EndSwitch
WEnd

Func __TVT($TV, $hParent, $Text, $CheckTxt)
	Local $hChild = _GUICtrlTreeView_GetFirstChild($TV, $hParent)
	If Not $hChild Then Return
	While 1
		If StringInStr(_GUICtrlTreeView_GetText($TV, $hChild), $CheckTxt) Then
			_GUICtrlTreeView_SetText($TV, $hChild, $CheckTxt & $Text)
			ExitLoop
		EndIf
		$hChild = _GUICtrlTreeView_GetNextChild($TV, $hChild)
		If Not $hChild Then ExitLoop
	WEnd
EndFunc   ;==>__TVT
тогда так
 
Автор
SealAlbinos

SealAlbinos

Продвинутый
Сообщения
152
Репутация
57
Спасибо большое очень выручил
 
Верх