Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Не отрабатывает функция обновления скрипта (http://forum.oszone.net/showthread.php?t=188727)

saavaage 19-10-2010 11:47 1522121

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

читать дальше »
Код:

#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) информация в окне обновляется только после перезагрузке всего скрипта....

PS Система XP SP3, autoit 3 +

saavaage 19-10-2010 15:30 1522338

Все оказалось просто до безобразия. Надо было просто переместить декларирование нескольких переменных непосредственно в функцию. Переменные:
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



Время: 13:17.

Время: 13:17.
© OSzone.net 2001-