Что нового

Не работает функция _GUICtrlTreeView_EndEdit

asdf8

Скриптер
Сообщения
564
Репутация
152
В качестве примера, подтверждающего это (т.е. что измененный текст не сохраняется), можно воспользоваться примером из справки к этой функции.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Насколько мне известно, после редактирования нужно обновлять элемент, хотя странно это...
 
Автор
A

asdf8

Скриптер
Сообщения
564
Репутация
152
CreatoR [?]
после редактирования нужно обновлять элемент

В справке по этому поводу ничего не упоминается, только флаг $fCancel - сохранять или нет изменённый текст.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
asdf8
Как и многие другие примеры видимо не содержит полный механизм, а только инициализацию элементов редактирования. В примере _GUICtrlTreeView_Create есть уведомления $TVN_BEGINLABELEDITA, $TVN_BEGINLABELEDITW, $TVN_ENDLABELEDITA, $TVN_ENDLABELEDITW, видиимо по этим событиям нужно "вручную" применить текст.
 
Автор
A

asdf8

Скриптер
Сообщения
564
Репутация
152
AZJIO [?]
В примере _GUICtrlTreeView_Create есть уведомления $TVN_BEGINLABELEDITA, $TVN_BEGINLABELEDITW, $TVN_ENDLABELEDITA, $TVN_ENDLABELEDITW, видиимо по этим событиям нужно "вручную" применить текст.
Т.е. функция _GUICtrlTreeView_EndEdit работает правильно?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
asdf8 [?]
Т.е. функция _GUICtrlTreeView_EndEdit работает правильно?
Я думаю да. Её предназначение это отправлять событие что редактирование завершено, но не собственно само редактирование. На счёт параметра Cancel, он просто отвечает за отмену отправки события, скорее всего в справке следует это упомянуть.
 
Автор
A

asdf8

Скриптер
Сообщения
564
Репутация
152
CreatoR [?]
Её предназначение это отправлять событие что редактирование завершено, но не собственно само редактирование.

При таких раскладах функции _GUICtrlTreeView_EditText и _GUICtrlTreeView_EndEdit теряют смысл (во всяком случае, я не могу придумать как их можно применять практически) и легко заменяются функцией _GUICtrlTreeView_SetText
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Функция_GUICtrlTreeView_EndEdit() нужна для уничтожения Edit элемента и отправки TVN_ENDLABELEDIT. Никакого автоматического переименования элемента не будет. Вы должны отлавливать TVN_ENDLABELEDIT, считывать из полученной структуры текст и самостоятельно обновлять элемента. Если редактирование было отменено или вызвана _GUICtrlTreeView_EndEdit(..., True), то указатель на строку текста будет содержать 0.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
asdf8
При таких раскладах функции _GUICtrlTreeView_EditText и _GUICtrlTreeView_EndEdit теряют смысл (во всяком случае, я не могу придумать как их можно применять практически) и легко заменяются функцией _GUICtrlTreeView_SetText
_GUICtrlTreeView_SetText устанавливает текст, то есть он уже должен существовать, например создать дополнительное поле ввода и кнопку.
_GUICtrlTreeView_EditText для ручного ввода по месту. К примеру по уведомлению двойного клика вызываем функцию _GUICtrlTreeView_EditText, далее нужно событие завершения, например Enter или Esc или клик мимо поля или потеря фокуса при котором вызвать функцию _GUICtrlTreeView_EndEdit.
Думаю проще разобраться посмотрев пример в _GUICtrlListView_EditLabel. Возможно созданный элемент редактирования будет иметь дескриптор. Пока нет времени разобраться, проще на офсайте поискать по ключевому слову уведомлений.

CreatoR
скорее всего в справке следует это упомянуть
Да, и пример сделать полный.
 
Автор
A

asdf8

Скриптер
Сообщения
564
Репутация
152
Yashied [?]
Функция_GUICtrlTreeView_EndEdit() нужна для уничтожения Edit элемента и отправки TVN_ENDLABELEDIT. Никакого автоматического переименования элемента не будет. Вы должны отлавливать TVN_ENDLABELEDIT
Тогда пример к этой функции в справке (и само описание функции) практически не дает представления о работе этой функции (ну, кроме того, что уничтожается элемент Edit).
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
asdf8
Посмотри Ini_Editor, добавь в скрипт
Код:
Global Const $TVN_SELCHANGED = $TVN_SELCHANGEDA
Global Const $TVN_ENDLABELEDIT = $TVN_ENDLABELEDITA
Global Const $TVN_ITEMEXPANDING = $TVN_ITEMEXPANDINGA
Global Const $TVN_BEGINLABELEDIT = $TVN_BEGINLABELEDITA
Global Const $TVN_BEGINDRAG = $TVN_BEGINDRAGA
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
asdf8 [?]
я не могу придумать как их можно применять практически
Пример:

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

$hGUI = GUICreate("TreeView Edit Text", 400, 300)

$iTreeView = GUICtrlCreateTreeView(10, 10, 380, 240, BitOR($TVS_EDITLABELS, $TVS_HASBUTTONS, $TVS_DISABLEDRAGDROP), $WS_EX_CLIENTEDGE)

For $i = 1 To 10
	GUICtrlCreateTreeViewItem('Item ' & $i, $iTreeView)
Next

$iRename_Bttn = GUICtrlCreateButton('Rename', 10, 270, 60, 20)

$iESC_Dummy = GUICtrlCreateDummy()
$iEnter_Dummy = GUICtrlCreateDummy()

Dim $aAccelKeys[2][2] = [['{ESC}', $iESC_Dummy], ['{ENTER}', $iEnter_Dummy]]
GUISetAccelerators($aAccelKeys)

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState(@SW_SHOW, $hGUI)

While 1
	$nMsg = GUIGetMsg()
	
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $iRename_Bttn
			$hItem = _GUICtrlTreeView_GetSelection($iTreeView)
			_GUICtrlTreeView_EditText($iTreeView, $hItem)
		Case $iESC_Dummy
			_GUICtrlTreeView_EndEdit($iTreeView, True)
		Case $iEnter_Dummy
			_GUICtrlTreeView_EndEdit($iTreeView, False)
	EndSwitch
WEnd

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndTreeview
	
    $hWndTreeview = $iTreeView
    If Not IsHWnd($iTreeView) Then $hWndTreeview = GUICtrlGetHandle($iTreeView)
	
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
	
    Switch $hWndFrom
        Case $hWndTreeview
            Switch $iCode
                Case $TVN_BEGINLABELEDITA, $TVN_BEGINLABELEDITW
					
                Case $TVN_ENDLABELEDITA, $TVN_ENDLABELEDITW
                    Local $tInfo = DllStructCreate($tagNMHDR & ";" & $tagTVITEMEX, $ilParam)
					
					If DllStructGetData($tInfo, "Text") <> 0 Then
						Local $tBuffer = DllStructCreate("wchar Text[" & DllStructGetData($tInfo, "TextMax") & "]", DllStructGetData($tInfo, "Text"))
						_GUICtrlTreeView_SetText($hWndTreeview, _GUICtrlTreeView_GetSelection($hWndTreeview), DllStructGetData($tBuffer, "Text"))
					EndIf
            EndSwitch
	EndSwitch
	
	Return $GUI_RUNDEFMSG
EndFunc


Или упрощённая версия (текст обновляется только по нажатию Enter):
Код:
#include <GUIConstantsEx.au3>
#include <GUITreeView.au3>
#include <WindowsConstants.au3>

$hGUI = GUICreate("TreeView Edit Text", 400, 300)

$iTreeView = GUICtrlCreateTreeView(10, 10, 380, 240, BitOR($TVS_EDITLABELS, $TVS_DISABLEDRAGDROP), $WS_EX_CLIENTEDGE)

For $i = 1 To 10
	GUICtrlCreateTreeViewItem('Item ' & $i, $iTreeView)
Next

$iRename_Bttn = GUICtrlCreateButton('Rename', 10, 270, 60, 20)

$iESC_Dummy = GUICtrlCreateDummy()
$iEnter_Dummy = GUICtrlCreateDummy()

Dim $aAccelKeys[2][2] = [['{ESC}', $iESC_Dummy], ['{ENTER}', $iEnter_Dummy]]
GUISetAccelerators($aAccelKeys)

GUISetState(@SW_SHOW, $hGUI)

While 1
	$nMsg = GUIGetMsg()
	
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $iRename_Bttn
			$hItem = _GUICtrlTreeView_GetSelection($iTreeView)
			_GUICtrlTreeView_EditText($iTreeView, $hItem)
		Case $iESC_Dummy
			_GUICtrlTreeView_EndEdit($iTreeView, True)
		Case $iEnter_Dummy
			$hItem = _GUICtrlTreeView_GetSelection($iTreeView)
			$hEdit = _GUICtrlTreeView_GetEditControl($iTreeView)
			
			_GUICtrlTreeView_SetText($iTreeView, $hItem, ControlGetText($hGUI, '', $hEdit))
			_GUICtrlTreeView_EndEdit($iTreeView, False)
	EndSwitch
WEnd
 
Автор
A

asdf8

Скриптер
Сообщения
564
Репутация
152
Спасибо всем, действительно хорошие примеры.

CreatoR [?]
Гораздо более подходящий пример для справки, чем тот, который сейчас там воткнут.
 
Верх