Что нового

Не отрабатывает функция обновления скрипта

saavaage

Знающий
Сообщения
171
Репутация
17
Есть код:

Код:
#include <ButtonConstants.au3>
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#Include <WinAPIEx.au3>

Global $hKey, $sKey, $hSubKey, $sData, $tData, $aCreateNew, $aList1, $sList1 ='', $aList2, $sList2 ='', $Count = 1
Dim $aKey[1]
Global $hKeySR, $hKeyRR

Opt("GUIOnEventMode", 1)


#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate('Редактирование меню "Создать"', 505, 355, 236, 233)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
$Group_Delete = GUICtrlCreateGroup("Удалить из меню", 8, 8, 489, 201)
$ListView_New = GUICtrlGetHandle(GUICtrlCreateListView("Расширение|Путь к ShellNew...", 16, 26, 377, 172, -1, BitOR($WS_EX_CLIENTEDGE, $LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT)))
_GUICtrlListView_SetColumnWidth(-1, 0, 80)
_GUICtrlListView_SetColumnWidth(-1, 1, 272)
$Button_SelectAllNew = GUICtrlCreateButton("Выделить Все", 400, 26, 89, 39, BitOR($BS_MULTILINE,$WS_GROUP))
GUICtrlSetOnEvent(-1, '_SelectAllNew')
$Button_UnSelectAllNew = GUICtrlCreateButton("Отменить", 400, 78, 89, 39, BitOR($BS_MULTILINE,$WS_GROUP))
GUICtrlSetOnEvent(-1, '_UnSelectAllNew')
$Button_CleanNew = GUICtrlCreateButton("Удалить", 400, 160, 89, 39, BitOR($BS_MULTILINE,$WS_GROUP))
GUICtrlSetOnEvent(-1, '_CleanNew')
$Button_RefreshNew = GUICtrlCreateButton("Обновить", 400, 305, 89, 39, BitOR($BS_MULTILINE,$WS_GROUP))
GUICtrlSetOnEvent(-1, '_RefreshNew')

#EndRegion ### END Koda GUI section ###
_ArCreateNew()

GUISetState()


While 1
    Sleep(100)
WEnd


Func CLOSEClicked()
   Exit
EndFunc


Func _ArCreateNew()

$tData = DllStructCreate('wchar[260]')
$hKey = _WinAPI_RegOpenKey($HKEY_CLASSES_ROOT, '', $KEY_READ)
While 1
    $sData = ''

    $sKey = _WinAPI_RegEnumKey($hKey, $Count)
    If @error Then
        ExitLoop
    EndIf
    $Count += 1

    $hSubKey = _WinAPI_RegOpenKey($hKey, $sKey & '\ShellNew', $KEY_READ)
    If @error Then
        If StringLeft($sKey, 1) <> '.' Then
            ContinueLoop
        EndIf
        $hSubKey = _WinAPI_RegOpenKey($hKey, $sKey, $KEY_READ)
        If @error Then
            ContinueLoop
        EndIf
        If _WinAPI_RegQueryValue($hSubKey, '', $tData) Then
            $sData = DllStructGetData($tData, 1)
        Else
            $sData = ''
        EndIf
        _WinAPI_RegCloseKey($hSubKey)
        If Not $sData Then
            ContinueLoop
        EndIf
        $hSubKey = _WinAPI_RegOpenKey($hKey, $sKey & '\' & $sData & '\ShellNew', $KEY_READ)
        If @error Then
            ContinueLoop
        EndIf
    EndIf

    If (_WinAPI_RegQueryValue($hSubKey, 'NullFile', $tData)) Or (_WinAPI_RegQueryValue($hSubKey, 'Command', $tData)) Or (_WinAPI_RegQueryValue($hSubKey, 'FileName', $tData)) Or (_WinAPI_RegQueryValue($hSubKey, 'ItemName', $tData)) Then
        $sList1 &= StringRegExpReplace('HKEY_CLASSES_ROOT\' & $sKey & '\' & $sData, '\\*\Z', '') & '\ShellNew' & '|'
	    $sList2 &= $sKey & '|'
	EndIf
    _WinAPI_RegCloseKey($hSubKey)
WEnd
    _WinAPI_RegCloseKey($hKey)

    $aList1 = StringSplit(StringTrimRight($sList1, 1), '|', 2)
    $aList2 = StringSplit(StringTrimRight($sList2, 1), '|', 2)

    Dim $aCreateNew [UBound($aList2)][2]
  For $n = 0 To UBound($aList2) - 1
    $aCreateNew [$n][0]=$aList2[$n]
	$aCreateNew [$n][1]=$aList1[$n]
  Next
    _GUICtrlListView_AddArray($ListView_New, $aCreateNew)
EndFunc

Func _SelectAllNew() ; Выделить Все
	_GUICtrlListView_SetItemChecked($ListView_New, -1)
EndFunc

Func _UnSelectAllNew() ; Отменить
    _GUICtrlListView_SetItemChecked($ListView_New, -1, False)
EndFunc

Func _CleanNew()  ; Удалить
	For $p =1 To _GUICtrlListView_GetItemCount($ListView_New)
		If _GUICtrlListView_GetItemChecked($ListView_New, $p)=1 Then
			RegDelete(_GUICtrlListView_GetItemText($ListView_New, $p, 1))
		Endif
	Next
	_GUICtrlListView_DeleteAllItems($ListView_New)
	_ArCreateNew()
EndFunc

Func _RefreshNew() ; Обновить
	  GUICtrlSetState($Button_RefreshNew, $GUI_DISABLE)
	 _GUICtrlListView_DeleteAllItems($ListView_New)
	_ArCreateNew()
	sleep(1000)
	GUICtrlSetState($Button_RefreshNew, $GUI_ENABLE)
EndFunc


Скрипт не отрабатывает при попытке обновить информацию (кнопка "Обновить"+ в кнопке "Удалить" тоже есть функция обновления) в окне вывода ListViewNew, т.е. при удалении того/иного элемента (item) информация в окне обновляется только после перезагрузке всего скрипта....
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Код:
_GUICtrlListView_DeleteAllItems($ListView_New)

что получаем в ответ? false/true?
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
эта функция отрабатывает нормально - список очищается
 

axlwor

Скриптер
Сообщения
657
Репутация
147
значит теперь мы точно знаем что ошибка в
Код:
_ArCreateNew()

Ну и начинай через строчку выдавать
Код:
ConsoleWrite()

с полезной информацией, чтобы найти что не отрабатывается во второй (и последующие) разы
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
Все оказалось просто до безобразия. Надо было просто переместить декларирование нескольких переменных непосредственно в функцию. Переменные:
Global $sList1 ='', $sList2 ='', $Count = 1

Т.о. работающий код:

Код:
#include <ButtonConstants.au3>
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#Include <WinAPIEx.au3>

Global $hKey, $sKey, $hSubKey, $sData, $tData, $aCreateNew, $aList1, $aList2, 
Dim $aKey[1]
Global $hKeySR, $hKeyRR

Opt("GUIOnEventMode", 1)


#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate('Редактирование меню "Создать"', 505, 355, 236, 233)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
$Group_Delete = GUICtrlCreateGroup("Удалить из меню", 8, 8, 489, 201)
$ListView_New = GUICtrlGetHandle(GUICtrlCreateListView("Расширение|Путь к ShellNew...", 16, 26, 377, 172, -1, BitOR($WS_EX_CLIENTEDGE, $LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT)))
_GUICtrlListView_SetColumnWidth(-1, 0, 80)
_GUICtrlListView_SetColumnWidth(-1, 1, 272)
$Button_SelectAllNew = GUICtrlCreateButton("Выделить Все", 400, 26, 89, 39, BitOR($BS_MULTILINE,$WS_GROUP))
GUICtrlSetOnEvent(-1, '_SelectAllNew')
$Button_UnSelectAllNew = GUICtrlCreateButton("Отменить", 400, 78, 89, 39, BitOR($BS_MULTILINE,$WS_GROUP))
GUICtrlSetOnEvent(-1, '_UnSelectAllNew')
$Button_CleanNew = GUICtrlCreateButton("Удалить", 400, 160, 89, 39, BitOR($BS_MULTILINE,$WS_GROUP))
GUICtrlSetOnEvent(-1, '_CleanNew')
$Button_RefreshNew = GUICtrlCreateButton("Обновить", 400, 305, 89, 39, BitOR($BS_MULTILINE,$WS_GROUP))
GUICtrlSetOnEvent(-1, '_RefreshNew')

#EndRegion ### END Koda GUI section ###
_ArCreateNew()

GUISetState()


While 1
    Sleep(100)
WEnd


Func CLOSEClicked()
   Exit
EndFunc


Func _ArCreateNew()
Local $sList1 ='', $sList2 ='', $Count = 1
$tData = DllStructCreate('wchar[260]')
$hKey = _WinAPI_RegOpenKey($HKEY_CLASSES_ROOT, '', $KEY_READ)
While 1
    $sData = ''

    $sKey = _WinAPI_RegEnumKey($hKey, $Count)
    If @error Then
        ExitLoop
    EndIf
    $Count += 1

    $hSubKey = _WinAPI_RegOpenKey($hKey, $sKey & '\ShellNew', $KEY_READ)
    If @error Then
        If StringLeft($sKey, 1) <> '.' Then
            ContinueLoop
        EndIf
        $hSubKey = _WinAPI_RegOpenKey($hKey, $sKey, $KEY_READ)
        If @error Then
            ContinueLoop
        EndIf
        If _WinAPI_RegQueryValue($hSubKey, '', $tData) Then
            $sData = DllStructGetData($tData, 1)
        Else
            $sData = ''
        EndIf
        _WinAPI_RegCloseKey($hSubKey)
        If Not $sData Then
            ContinueLoop
        EndIf
        $hSubKey = _WinAPI_RegOpenKey($hKey, $sKey & '\' & $sData & '\ShellNew', $KEY_READ)
        If @error Then
            ContinueLoop
        EndIf
    EndIf

    If (_WinAPI_RegQueryValue($hSubKey, 'NullFile', $tData)) Or (_WinAPI_RegQueryValue($hSubKey, 'Command', $tData)) Or (_WinAPI_RegQueryValue($hSubKey, 'FileName', $tData)) Or (_WinAPI_RegQueryValue($hSubKey, 'ItemName', $tData)) Then
        $sList1 &= StringRegExpReplace('HKEY_CLASSES_ROOT\' & $sKey & '\' & $sData, '\\*\Z', '') & '\ShellNew' & '|'
        $sList2 &= $sKey & '|'
    EndIf
    _WinAPI_RegCloseKey($hSubKey)
WEnd
    _WinAPI_RegCloseKey($hKey)

    $aList1 = StringSplit(StringTrimRight($sList1, 1), '|', 2)
    $aList2 = StringSplit(StringTrimRight($sList2, 1), '|', 2)

    Dim $aCreateNew [UBound($aList2)][2]
  For $n = 0 To UBound($aList2) - 1
    $aCreateNew [$n][0]=$aList2[$n]
    $aCreateNew [$n][1]=$aList1[$n]
  Next
    _GUICtrlListView_AddArray($ListView_New, $aCreateNew)
EndFunc

Func _SelectAllNew() ; Выделить Все
    _GUICtrlListView_SetItemChecked($ListView_New, -1)
EndFunc

Func _UnSelectAllNew() ; Отменить
    _GUICtrlListView_SetItemChecked($ListView_New, -1, False)
EndFunc

Func _CleanNew()  ; Удалить
    For $p =1 To _GUICtrlListView_GetItemCount($ListView_New)
        If _GUICtrlListView_GetItemChecked($ListView_New, $p)=1 Then
            RegDelete(_GUICtrlListView_GetItemText($ListView_New, $p, 1))
        Endif
    Next
    _GUICtrlListView_DeleteAllItems($ListView_New)
    _ArCreateNew()
EndFunc

Func _RefreshNew() ; Обновить
      GUICtrlSetState($Button_RefreshNew, $GUI_DISABLE)
     _GUICtrlListView_DeleteAllItems($ListView_New)
    _ArCreateNew()
    sleep(1000)
    GUICtrlSetState($Button_RefreshNew, $GUI_ENABLE)
EndFunc
 
Верх