Что нового

Возможность редактирования GUICtrlCreateTreeViewitem по двойному клику

ZlojBoter

Новичок
Сообщения
55
Репутация
0
Существует ли возможность редактировать такой Gui элемент как
Код:
GUICtrlCreateTreeViewitem
по двойному клику? Т.е. чтобы пользователь нажимал двойным кликом на этот элемент и открывалось поле для редактирования. В свойствах стилей я такого не нашел, однако, может есть какие-то расширенные версии функции
Код:
GUICtrlCreateTreeView
? Решить проблему при помощи костыля я конечно могу, первое что приходит в голову - отлавливать двойной клик и лепить над этим элементом
Код:
GUICtrlCreateEdit
, а после потери фокуса ввода программно редактировать
Код:
GUICtrlCreateTreeView
. Однако, хотелось бы найти более "человеческий" способ решения задачи...
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
как пример. возможно, кое что лишнее. Но принцип, думаю, понятен
Код:
#include <GUIConstantsEx.au3>
#include <TreeViewConstants.au3>
#include <GuiTreeView.au3>
#include <WindowsConstants.au3>
Global $hGTVE, $hModificationItemTV, $sNewTxtItemTV
Global $Form1 = GUICreate("Form1", 390, 426, 619, 180)
Global $TreeView1 = GUICtrlCreateTreeView(40, 8, 313, 385, BitOR($TVS_HASBUTTONS, $TVS_EDITLABELS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS))
For $i = 0 To 20
    GUICtrlCreateTreeViewItem(Random(100000, 100000000, 1), $TreeView1)
Next
GUISetState()
GUIRegisterMsg($WM_NOTIFY, '_GUITreeViewEx')
Local $nMsg
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _GUITreeViewEx($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam
    Local $hItem, $nAction, $aInfTv
    Local $tStruct = DllStructCreate('struct;hwnd hWndFrom;uint_ptr IDFrom;INT Code;endstruct;' & _
            'uint Action;struct;uint OldMask;handle OldhItem;uint OldState;uint OldStateMask;' & _
            'ptr OldText;int OldTextMax;int OldImage;int OldSelectedImage;int OldChildren;lparam OldParam;endstruct;' & _
            'struct;uint NewMask;handle NewhItem;uint NewState;uint NewStateMask;' & _
            'ptr NewText;int NewTextMax;int NewImage;int NewSelectedImage;int NewChildren;lparam NewParam;endstruct;' & _
            'struct;long PointX;long PointY;endstruct', $lParam)
    Local $hWndFrom = DllStructGetData($tStruct, 'hWndFrom')
    $hGTVE = $hWndFrom
    Switch DllStructGetData($tStruct, 'Code')
        Case $TVN_SELCHANGEDA, $TVN_SELCHANGEDW
            $hItem = DllStructGetData($tStruct, 'NewhItem')
            If $hItem Then $hModificationItemTV = $hItem
        Case $NM_DBLCLK
            _GUICtrlTreeView_EditText($hGTVE, $hModificationItemTV)
        Case $TVN_ENDLABELEDITA, $TVN_ENDLABELEDITW
            Local $tInfo = DllStructCreate($tagNMHDR & ';' & $tagTVITEMEX, $lParam)
            If DllStructGetData($tInfo, 'Text') <> 0 Then
                Local $tBuffer = DllStructCreate('wchar Text[' & DllStructGetData($tInfo, 'TextMax') & ']', DllStructGetData($tInfo, 'Text'))
                If StringStripWS(DllStructGetData($tBuffer, 'Text'), 3) Then
                    $sNewTxtItemTV = StringReplace(StringRegExpReplace(DllStructGetData($tBuffer, 'Text'), '[*~|#]', ' '), '\', '')
                    _GUICtrlTreeView_SetText($hGTVE, $hModificationItemTV, $sNewTxtItemTV)
                    _GUICtrlTreeView_EndEdit($hGTVE)
                EndIf
            EndIf
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>_GUITreeViewEx
 
Автор
Z

ZlojBoter

Новичок
Сообщения
55
Репутация
0
Спасибо! Да, пожалуй, это решение подходит.
как пример. возможно, кое что лишнее. Но принцип, думаю, понятен
Код:
#include <GUIConstantsEx.au3>
#include <TreeViewConstants.au3>
#include <GuiTreeView.au3>
#include <WindowsConstants.au3>
Global $hGTVE, $hModificationItemTV, $sNewTxtItemTV
Global $Form1 = GUICreate("Form1", 390, 426, 619, 180)
Global $TreeView1 = GUICtrlCreateTreeView(40, 8, 313, 385, BitOR($TVS_HASBUTTONS, $TVS_EDITLABELS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS))
For $i = 0 To 20
    GUICtrlCreateTreeViewItem(Random(100000, 100000000, 1), $TreeView1)
Next
GUISetState()
GUIRegisterMsg($WM_NOTIFY, '_GUITreeViewEx')
Local $nMsg
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _GUITreeViewEx($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam
    Local $hItem, $nAction, $aInfTv
    Local $tStruct = DllStructCreate('struct;hwnd hWndFrom;uint_ptr IDFrom;INT Code;endstruct;' & _
            'uint Action;struct;uint OldMask;handle OldhItem;uint OldState;uint OldStateMask;' & _
            'ptr OldText;int OldTextMax;int OldImage;int OldSelectedImage;int OldChildren;lparam OldParam;endstruct;' & _
            'struct;uint NewMask;handle NewhItem;uint NewState;uint NewStateMask;' & _
            'ptr NewText;int NewTextMax;int NewImage;int NewSelectedImage;int NewChildren;lparam NewParam;endstruct;' & _
            'struct;long PointX;long PointY;endstruct', $lParam)
    Local $hWndFrom = DllStructGetData($tStruct, 'hWndFrom')
    $hGTVE = $hWndFrom
    Switch DllStructGetData($tStruct, 'Code')
        Case $TVN_SELCHANGEDA, $TVN_SELCHANGEDW
            $hItem = DllStructGetData($tStruct, 'NewhItem')
            If $hItem Then $hModificationItemTV = $hItem
        Case $NM_DBLCLK
            _GUICtrlTreeView_EditText($hGTVE, $hModificationItemTV)
        Case $TVN_ENDLABELEDITA, $TVN_ENDLABELEDITW
            Local $tInfo = DllStructCreate($tagNMHDR & ';' & $tagTVITEMEX, $lParam)
            If DllStructGetData($tInfo, 'Text') <> 0 Then
                Local $tBuffer = DllStructCreate('wchar Text[' & DllStructGetData($tInfo, 'TextMax') & ']', DllStructGetData($tInfo, 'Text'))
                If StringStripWS(DllStructGetData($tBuffer, 'Text'), 3) Then
                    $sNewTxtItemTV = StringReplace(StringRegExpReplace(DllStructGetData($tBuffer, 'Text'), '[*~|#]', ' '), '\', '')
                    _GUICtrlTreeView_SetText($hGTVE, $hModificationItemTV, $sNewTxtItemTV)
                    _GUICtrlTreeView_EndEdit($hGTVE)
                EndIf
            EndIf
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>_GUITreeViewEx
Сообщение автоматически объединено:

как пример. возможно, кое что лишнее. Но принцип, думаю, понятен
Код:
#include <GUIConstantsEx.au3>
#include <TreeViewConstants.au3>
#include <GuiTreeView.au3>
#include <WindowsConstants.au3>
Global $hGTVE, $hModificationItemTV, $sNewTxtItemTV
Global $Form1 = GUICreate("Form1", 390, 426, 619, 180)
Global $TreeView1 = GUICtrlCreateTreeView(40, 8, 313, 385, BitOR($TVS_HASBUTTONS, $TVS_EDITLABELS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS))
For $i = 0 To 20
    GUICtrlCreateTreeViewItem(Random(100000, 100000000, 1), $TreeView1)
Next
GUISetState()
GUIRegisterMsg($WM_NOTIFY, '_GUITreeViewEx')
Local $nMsg
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _GUITreeViewEx($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam
    Local $hItem, $nAction, $aInfTv
    Local $tStruct = DllStructCreate('struct;hwnd hWndFrom;uint_ptr IDFrom;INT Code;endstruct;' & _
            'uint Action;struct;uint OldMask;handle OldhItem;uint OldState;uint OldStateMask;' & _
            'ptr OldText;int OldTextMax;int OldImage;int OldSelectedImage;int OldChildren;lparam OldParam;endstruct;' & _
            'struct;uint NewMask;handle NewhItem;uint NewState;uint NewStateMask;' & _
            'ptr NewText;int NewTextMax;int NewImage;int NewSelectedImage;int NewChildren;lparam NewParam;endstruct;' & _
            'struct;long PointX;long PointY;endstruct', $lParam)
    Local $hWndFrom = DllStructGetData($tStruct, 'hWndFrom')
    $hGTVE = $hWndFrom
    Switch DllStructGetData($tStruct, 'Code')
        Case $TVN_SELCHANGEDA, $TVN_SELCHANGEDW
            $hItem = DllStructGetData($tStruct, 'NewhItem')
            If $hItem Then $hModificationItemTV = $hItem
        Case $NM_DBLCLK
            _GUICtrlTreeView_EditText($hGTVE, $hModificationItemTV)
        Case $TVN_ENDLABELEDITA, $TVN_ENDLABELEDITW
            Local $tInfo = DllStructCreate($tagNMHDR & ';' & $tagTVITEMEX, $lParam)
            If DllStructGetData($tInfo, 'Text') <> 0 Then
                Local $tBuffer = DllStructCreate('wchar Text[' & DllStructGetData($tInfo, 'TextMax') & ']', DllStructGetData($tInfo, 'Text'))
                If StringStripWS(DllStructGetData($tBuffer, 'Text'), 3) Then
                    $sNewTxtItemTV = StringReplace(StringRegExpReplace(DllStructGetData($tBuffer, 'Text'), '[*~|#]', ' '), '\', '')
                    _GUICtrlTreeView_SetText($hGTVE, $hModificationItemTV, $sNewTxtItemTV)
                    _GUICtrlTreeView_EndEdit($hGTVE)
                EndIf
            EndIf
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>_GUITreeViewEx
Проверил. Все работает замечательно. А есть ли возможность отдельно взятые элементы заблокировать от этой функции? Например, есть вариант использования, когда список содержит группы, и было бы хорошо, если бы пользователь не мог менять их название...
 
Последнее редактирование:

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
если с лёту, то при создании пунктов добавлять их дескрипторы в массив, в котором нужные пункты помечены. при клике на пункт получаем его дескриптор, ищем этот дескриптор в массиве. Если есть допуск, то срабатывает функция начала редактирования
Код:
_GUICtrlTreeView_EditText

есть момент. при затяжным кликах система выводит пункт в редактирование. значит, если предусмотреть это вариант, то в разделе
Код:
$TVN_ENDLABELEDITA, $TVN_ENDLABELEDITW

тоже делать дополнительный поиск в массиве на разрешение редактирования.
Но тут одно НО. поиск в массиве нужно будет вынести в цикл опроса событий окна
Код:
While
Wend

то есть, создать дополнительный флаг, по значению которого будут производиться действия поиска в массиве и вызова функции начала и конца редактирования.
почему так? в функция типа WM_ циклы использовать не рекомендуется. Ибо гарантировано зависание скрипта
Сообщение автоматически объединено:

Примерно, так
Код:
#include <GUIConstantsEx.au3>
#include <TreeViewConstants.au3>
#include <GuiTreeView.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
Global $hGTVE, $hModificationItemTV, $sNewTxtItemTV, $nFlag, $iNotEdit
Global $Form1 = GUICreate("Form1", 390, 426, 619, 180)
Global $TreeView1 = GUICtrlCreateTreeView(40, 8, 313, 385, BitOR($TVS_HASBUTTONS, $TVS_EDITLABELS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS))
Local $aHItem[0][2], $idItem, $iMap
For $i = 0 To 20
    $idItem = GUICtrlCreateTreeViewItem($i, $TreeView1)
    If $i = 10 Then
        $iMap = 1;редактировать запрещено
    Else
        $iMap = 0
    EndIf
    _ArrayAdd($aHItem, GUICtrlGetHandle($idItem) & '|' & $iMap)
Next
GUISetState()
GUIRegisterMsg($WM_NOTIFY, '_GUITreeViewEx')
Local $nMsg
While 1
    If $nFlag Then
        $iNotEdit = 0
        For $i = 0 To UBound($aHItem) - 1
            If $aHItem[$i][0] = $hModificationItemTV Then
                $nFlag = 0
                If $aHItem[$i][1] = 0 Then
                    _GUICtrlTreeView_EditText($hGTVE, $hModificationItemTV)
                Else
                    $iNotEdit = 1
;~                     MsgBox(0, '', 'Запрет на редактирование', 0, $Form1)
                EndIf
            EndIf
        Next
    EndIf
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _GUITreeViewEx($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam
    Local $hItem, $nAction, $aInfTv
    Local $tStruct = DllStructCreate('struct;hwnd hWndFrom;uint_ptr IDFrom;INT Code;endstruct;' & _
            'uint Action;struct;uint OldMask;handle OldhItem;uint OldState;uint OldStateMask;' & _
            'ptr OldText;int OldTextMax;int OldImage;int OldSelectedImage;int OldChildren;lparam OldParam;endstruct;' & _
            'struct;uint NewMask;handle NewhItem;uint NewState;uint NewStateMask;' & _
            'ptr NewText;int NewTextMax;int NewImage;int NewSelectedImage;int NewChildren;lparam NewParam;endstruct;' & _
            'struct;long PointX;long PointY;endstruct', $lParam)
    Local $hWndFrom = DllStructGetData($tStruct, 'hWndFrom')
    $hGTVE = $hWndFrom
    Switch DllStructGetData($tStruct, 'Code')
        Case $TVN_SELCHANGEDA, $TVN_SELCHANGEDW
            $hItem = DllStructGetData($tStruct, 'NewhItem')
            If $hItem Then $hModificationItemTV = $hItem
        Case $NM_DBLCLK
            $nFlag = 1
;~             _GUICtrlTreeView_EditText($hGTVE, $hModificationItemTV)
        Case $TVN_ENDLABELEDITA, $TVN_ENDLABELEDITW
            If Not $iNotEdit Then
                Local $tInfo = DllStructCreate($tagNMHDR & ';' & $tagTVITEMEX, $lParam)
                If DllStructGetData($tInfo, 'Text') <> 0 Then
                    Local $tBuffer = DllStructCreate('wchar Text[' & DllStructGetData($tInfo, 'TextMax') & ']', DllStructGetData($tInfo, 'Text'))
                    If StringStripWS(DllStructGetData($tBuffer, 'Text'), 3) Then
                        $sNewTxtItemTV = StringReplace(StringRegExpReplace(DllStructGetData($tBuffer, 'Text'), '[*~|#]', ' '), '\', '')
                        _GUICtrlTreeView_SetText($hGTVE, $hModificationItemTV, $sNewTxtItemTV)
                        _GUICtrlTreeView_EndEdit($hGTVE)
                    EndIf
                EndIf
            EndIf
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>_GUITreeViewEx
 
Последнее редактирование:
Автор
Z

ZlojBoter

Новичок
Сообщения
55
Репутация
0
если с лёту, то при создании пунктов добавлять их дескрипторы в массив, в котором нужные пункты помечены. при клике на пункт получаем его дескриптор, ищем этот дескриптор в массиве. Если есть допуск, то срабатывает функция начала редактирования
Код:
_GUICtrlTreeView_EditText

есть момент. при затяжным кликах система выводит пункт в редактирование. значит, если предусмотреть это вариант, то в разделе
Код:
$TVN_ENDLABELEDITA, $TVN_ENDLABELEDITW

тоже делать дополнительный поиск в массиве на разрешение редактирования.
Но тут одно НО. поиск в массиве нужно будет вынести в цикл опроса событий окна
Код:
While
Wend

то есть, создать дополнительный флаг, по значению которого будут производиться действия поиска в массиве и вызова функции начала и конца редактирования.
почему так? в функция типа WM_ циклы использовать не рекомендуется. Ибо гарантировано зависание скрипта
Сообщение автоматически объединено:

Примерно, так
Код:
#include <GUIConstantsEx.au3>
#include <TreeViewConstants.au3>
#include <GuiTreeView.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
Global $hGTVE, $hModificationItemTV, $sNewTxtItemTV, $nFlag, $iNotEdit
Global $Form1 = GUICreate("Form1", 390, 426, 619, 180)
Global $TreeView1 = GUICtrlCreateTreeView(40, 8, 313, 385, BitOR($TVS_HASBUTTONS, $TVS_EDITLABELS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS))
Local $aHItem[0][2], $idItem, $iMap
For $i = 0 To 20
    $idItem = GUICtrlCreateTreeViewItem($i, $TreeView1)
    If $i = 10 Then
        $iMap = 1;редактировать запрещено
    Else
        $iMap = 0
    EndIf
    _ArrayAdd($aHItem, GUICtrlGetHandle($idItem) & '|' & $iMap)
Next
GUISetState()
GUIRegisterMsg($WM_NOTIFY, '_GUITreeViewEx')
Local $nMsg
While 1
    If $nFlag Then
        $iNotEdit = 0
        For $i = 0 To UBound($aHItem) - 1
            If $aHItem[$i][0] = $hModificationItemTV Then
                $nFlag = 0
                If $aHItem[$i][1] = 0 Then
                    _GUICtrlTreeView_EditText($hGTVE, $hModificationItemTV)
                Else
                    $iNotEdit = 1
;~                     MsgBox(0, '', 'Запрет на редактирование', 0, $Form1)
                EndIf
            EndIf
        Next
    EndIf
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _GUITreeViewEx($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam
    Local $hItem, $nAction, $aInfTv
    Local $tStruct = DllStructCreate('struct;hwnd hWndFrom;uint_ptr IDFrom;INT Code;endstruct;' & _
            'uint Action;struct;uint OldMask;handle OldhItem;uint OldState;uint OldStateMask;' & _
            'ptr OldText;int OldTextMax;int OldImage;int OldSelectedImage;int OldChildren;lparam OldParam;endstruct;' & _
            'struct;uint NewMask;handle NewhItem;uint NewState;uint NewStateMask;' & _
            'ptr NewText;int NewTextMax;int NewImage;int NewSelectedImage;int NewChildren;lparam NewParam;endstruct;' & _
            'struct;long PointX;long PointY;endstruct', $lParam)
    Local $hWndFrom = DllStructGetData($tStruct, 'hWndFrom')
    $hGTVE = $hWndFrom
    Switch DllStructGetData($tStruct, 'Code')
        Case $TVN_SELCHANGEDA, $TVN_SELCHANGEDW
            $hItem = DllStructGetData($tStruct, 'NewhItem')
            If $hItem Then $hModificationItemTV = $hItem
        Case $NM_DBLCLK
            $nFlag = 1
;~             _GUICtrlTreeView_EditText($hGTVE, $hModificationItemTV)
        Case $TVN_ENDLABELEDITA, $TVN_ENDLABELEDITW
            If Not $iNotEdit Then
                Local $tInfo = DllStructCreate($tagNMHDR & ';' & $tagTVITEMEX, $lParam)
                If DllStructGetData($tInfo, 'Text') <> 0 Then
                    Local $tBuffer = DllStructCreate('wchar Text[' & DllStructGetData($tInfo, 'TextMax') & ']', DllStructGetData($tInfo, 'Text'))
                    If StringStripWS(DllStructGetData($tBuffer, 'Text'), 3) Then
                        $sNewTxtItemTV = StringReplace(StringRegExpReplace(DllStructGetData($tBuffer, 'Text'), '[*~|#]', ' '), '\', '')
                        _GUICtrlTreeView_SetText($hGTVE, $hModificationItemTV, $sNewTxtItemTV)
                        _GUICtrlTreeView_EndEdit($hGTVE)
                    EndIf
                EndIf
            EndIf
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>_GUITreeViewEx
Спасибо! Обнаружил правда одну странность. Даже без включенной функции _GUITreeViewEx, элементы выводят поле для редактирования. Стиль $TVS_EDITLABELS позволяет это делать(в справке autoit этого стиля почему-то не нашел). Хотя и не сохраняют результат( баг?). Поэтому, наверное гонять цикл в теле программы не нужно, т.к. все равно нельзя запретить программе(да и не особо нужно, главное чтобы результат не сохранялся для групп) выводить поле для редактирования, и имеет смысл прогонять цикл for (к счастью не бесконечный) в самой функции.
Код:
#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.14.5
 Author:         myName

 Script Function:
    Template AutoIt script.

#ce ----------------------------------------------------------------------------

; Script Start - Add your code below here
#include <GUIConstantsEx.au3>
#include <TreeViewConstants.au3>
#include <GuiTreeView.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
Global $hGTVE, $hModificationItemTV, $sNewTxtItemTV, $nFlag, $iNotEdit
Global $Form1 = GUICreate("Form1", 390, 426, 619, 180)
Global $TreeView1 = GUICtrlCreateTreeView(40, 8, 313, 385, BitOR($TVS_HASBUTTONS, $TVS_EDITLABELS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS))
Local $aHItem[0][2], $idItem, $iMap
For $i = 0 To 20
    $idItem = GUICtrlCreateTreeViewItem($i, $TreeView1)
    If $i = 10 Then
        $iMap = 1;редактировать запрещено
    Else
        $iMap = 0
    EndIf
    _ArrayAdd($aHItem, GUICtrlGetHandle($idItem) & '|' & $iMap)
Next
GUISetState()
GUIRegisterMsg($WM_NOTIFY, '_GUITreeViewEx')
Local $nMsg
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _GUITreeViewEx($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam
    Local $hItem, $nAction, $aInfTv,$i
    Local $tStruct = DllStructCreate('struct;hwnd hWndFrom;uint_ptr IDFrom;INT Code;endstruct;' & _
            'uint Action;struct;uint OldMask;handle OldhItem;uint OldState;uint OldStateMask;' & _
            'ptr OldText;int OldTextMax;int OldImage;int OldSelectedImage;int OldChildren;lparam OldParam;endstruct;' & _
            'struct;uint NewMask;handle NewhItem;uint NewState;uint NewStateMask;' & _
            'ptr NewText;int NewTextMax;int NewImage;int NewSelectedImage;int NewChildren;lparam NewParam;endstruct;' & _
            'struct;long PointX;long PointY;endstruct', $lParam)
    Local $hWndFrom = DllStructGetData($tStruct, 'hWndFrom')
    $hGTVE = $hWndFrom
    Switch DllStructGetData($tStruct, 'Code')
        Case $TVN_SELCHANGEDA, $TVN_SELCHANGEDW
            $hItem = DllStructGetData($tStruct, 'NewhItem')
            If $hItem Then $hModificationItemTV = $hItem
        Case $NM_DBLCLK
;~             $nFlag = 1
;~             _GUICtrlTreeView_EditText($hGTVE, $hModificationItemTV)
        Case $TVN_ENDLABELEDITA, $TVN_ENDLABELEDITW



                Local $tInfo = DllStructCreate($tagNMHDR & ';' & $tagTVITEMEX, $lParam)
                If DllStructGetData($tInfo, 'Text') <> 0 Then
                    Local $tBuffer = DllStructCreate('wchar Text[' & DllStructGetData($tInfo, 'TextMax') & ']', DllStructGetData($tInfo, 'Text'))
                    If StringStripWS(DllStructGetData($tBuffer, 'Text'), 3) Then
                        $sNewTxtItemTV = StringReplace(StringRegExpReplace(DllStructGetData($tBuffer, 'Text'), '[*~|#]', ' '), '\', '')
$iNotEdit = 0
                         For $i = 0 To UBound($aHItem) - 1
            If $aHItem[$i][0] = $hModificationItemTV Then

                If $aHItem[$i][1] = 1 Then
                    $iNotEdit = 1
;~                     MsgBox(0, '', 'Запрет на редактирование', 0, $Form1)
                EndIf
            EndIf
        Next

                        If $iNotEdit = 0 Then
                        _GUICtrlTreeView_SetText($hGTVE, $hModificationItemTV, $sNewTxtItemTV)
                        EndIf
                        _GUICtrlTreeView_EndEdit($hGTVE)

                    EndIf
                EndIf

    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>_GUITreeViewEx
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Поэтому, наверное гонять цикл в теле программы не нужно, т.к. все равно нельзя запретить программе(да и не особо нужно, главное чтобы результат не сохранялся для групп)
именно об этом я и писал выше
есть момент. при затяжным кликах система выводит пункт в редактирование
этот эффект дает система.
главное, что результат не сохраняется.
 
Верх