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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] При $GUI_EVENT_CLOSE окно зависает. (http://forum.oszone.net/showthread.php?t=201053)

Centrinar 03-03-2011 22:48 1626745

При $GUI_EVENT_CLOSE окно зависает.
 
Вложений: 1
Выкладываю образец скрипта, при нажатии на кнопку и закрытии окна виснут. А надо что бы при закрытии второго окна первое оставалось. СПАСИБО

Creat0R 03-03-2011 23:21 1626771

Нужно обрабатывать события для всех элементов в одном цикле, а GUI создавать например через функцию:

Код:

#include <GUIConstantsEx.au3>
#include <ComboConstants.au3>
#include <GUIListView.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <GuiMenu.au3>
#include <Misc.au3>
#include <WinAPIEx.au3>

OnAutoItExitRegister('_Del_BackUpIni')
_Singleton(@ScriptName)

Global $sData, $aSection_N, $iColumns, $iColumn_W = 100, $iLeft = 10, $iY_LV = 60, _
        $hListView, $iLast_LV_Index, $iLast_LV_SubIndex, $hMain_GUI, $hEditor, $fEdit = False, _
        $nInputEditor, $aRect, $sFile, $iCountRow, $aChangeSubMenu[1], $aOld[1], $aNew[1], _
        $fLV = False, $fCombo = False

Global $hIniEditor_GUI, $hEditor, $nComboSection, $nListView, $iW_LV, $iDelta, $nInputIni, $nButtonDefault, $nButtonSave, _
        $nSubMenuEdit, $nSubMenuDel, $nSubMenuDelAll, $nContextMenuN, $nSubMenuNF, $nSubMenuNE, _
        $nContextMenu, $nComboEditor, $hContextMenu, $nContextMenu

$hMain_GUI = GUICreate("My GUI Tab", 200, 200)
$Button = GUICtrlCreateButton("Кнопка", 30, 30, 100, 20)

GUISetState(@SW_SHOW, $hMain_GUI)

While 1
        $aMsg = GUIGetMsg(1)
       
        If $aMsg[0] = 0 Then
                ContinueLoop
        EndIf
       
        Switch $aMsg[1]
                Case $hIniEditor_GUI
                        Switch $aMsg[0]
                                Case $GUI_EVENT_CLOSE
                                        GUIDelete($hIniEditor_GUI)
                                        GUIDelete($hEditor)
                                Case $nComboSection
                                        GUICtrlSetState($nListView, $GUI_FOCUS)
                                        _GUICtrlListView_DeleteAllItems($hListView)
                                        For $i = $iColumns - 1 To 0 Step -1
                                                _GUICtrlListView_DeleteColumn($hListView, 1)
                                        Next
                                        For $i = 1 To 5
                                                $aSection_N = _IniReadSectionMy($sFile, GUICtrlRead($nComboSection))
                                                $iColumns = @extended
                                                If Not @error Then ExitLoop
                                        Next
                                        If Not @error Then
                                                If ($iColumns + 1) * $iColumn_W <> $iW_LV Then
                                                        $iW_LV = ($iColumns + 1) * $iColumn_W
                                                        If $iW_LV + $iLeft * 2 + $iDelta < 400 Then
                                                                $iW_LV = 400 - $iLeft * 2
                                                        EndIf
                                                        WinMove($hMain_GUI, '', (@DesktopWidth - ($iW_LV + $iLeft * 2 + $iDelta)) / 2, _
                                                                        (@DesktopHeight - 400) / 2, $iW_LV + $iLeft * 2 + $iDelta * ($iColumns + 2))

                                                        GUICtrlSetPos($nInputIni, $iLeft, 5, $iW_LV + $iDelta * ($iColumns + 1))
                                                        GUICtrlSetPos($nListView, $iLeft, $iY_LV, $iW_LV + $iDelta * ($iColumns + 1))
                                                EndIf
                                                For $i = 1 To $iColumns
                                                        _GUICtrlListView_AddColumn($hListView, 'Значение ' & $i, $iColumn_W, 2)
                                                Next
                                                _GUICtrlListView_AddArray($hListView, $aSection_N)
                                                $aSection_N = ''
                                                _SubMenuChange()
                                        Else
                                                MsgBox(16, 'Error', 'Произошла ошибка. Попробуйте еще раз.')
                                        EndIf
                                Case $nButtonDefault
                                        $sFileDefault = @ScriptDir & '\BackUpIni\' & _
                                                StringRegExpReplace(GUICtrlRead($nInputIni), '^.*\\', '')
                                        _GUICtrlListView_DeleteAllItems($hListView)
                                        For $i = $iColumns - 1 To 0 Step -1
                                                _GUICtrlListView_DeleteColumn($hListView, 1)
                                        Next
                                        For $i = 1 To 5
                                                $aSection_N = _IniReadSectionMy($sFileDefault, GUICtrlRead($nComboSection))
                                                $iColumns = @extended
                                                If Not @error Then ExitLoop
                                        Next
                                        If Not @error Then
                                                If ($iColumns + 1) * $iColumn_W <> $iW_LV Then
                                                        $iW_LV = ($iColumns + 1) * $iColumn_W
                                                        If $iW_LV + $iLeft * 2 + $iDelta < 400 Then
                                                                $iW_LV = 400 - $iLeft * 2
                                                        EndIf
                                                        WinMove($hMain_GUI, '', (@DesktopWidth - ($iW_LV + $iLeft * 2 + $iDelta)) / 2, _
                                                                        (@DesktopHeight - 400) / 2, $iW_LV + $iLeft * 2 + $iDelta * 2)

                                                        GUICtrlSetPos($nInputIni, $iLeft, 5, $iW_LV + $iDelta)
                                                        GUICtrlSetPos($nListView, $iLeft, $iY_LV, $iW_LV + $iDelta)
                                                EndIf
                                                For $i = 1 To $iColumns
                                                        _GUICtrlListView_AddColumn($hListView, 'Значение ' & $i, $iColumn_W, 2)
                                                Next
                                                _GUICtrlListView_AddArray($hListView, $aSection_N)
                                                $aSection_N = ''
                                                _SubMenuChange()
                                        Else
                                                MsgBox(16, 'Error', 'Произошла ошибка. Попробуйте еще раз.')
                                        EndIf
                                        GUICtrlSetState($nListView, $GUI_FOCUS)
                                Case $nButtonSave
                                        $iLV = _GUICtrlListView_GetItemCount($hListView)
                                        If $iLV Then
                                                $sSectionSave = GUICtrlRead($nComboSection)
                                                $sFileSave = GUICtrlRead($nInputIni)
                                                IniDelete($sFileSave, $sSectionSave)
                                                For $i = 0 To $iLV - 1
                                                        $sValue = ''
                                                        $sKeySave = _GUICtrlListView_GetItemText($hListView, $i)
                                                        For $j = 1 To $iColumns
                                                                $sTempSave = _GUICtrlListView_GetItemText($hListView, $i, $j)
                                                                If $sTempSave Then
                                                                        $sValue &= '<' & $sTempSave & '>'
                                                                Else
                                                                        $sValue &= '<Здесь не знаю, что надо>'
                                                                EndIf
                                                        Next
                                                        IniWrite($sFileSave, $sSectionSave, $sKeySave, $sValue)
                                                Next
                                        EndIf
                                        GUICtrlSetState($nListView, $GUI_FOCUS)
                                        $iLV = 0
                                        $sSectionSave = ''
                                        $sFileSave = ''
                                        $sValue = ''
                                        $sKeySave = ''
                                        $sTempSave = ''
                                Case $nSubMenuEdit
                                        _Editor_LV_Show()
                                Case $nSubMenuDel
                                        _GUICtrlListView_SetItemText($hListView, $iLast_LV_Index, '', $iLast_LV_SubIndex)
                                        _SubMenuChange()
                                Case $nSubMenuDelAll
                                        _GUICtrlListView_DeleteItem($hListView, $iLast_LV_Index)
                                        _SubMenuChange()
                                Case $nListView
                                        If GUICtrlGetState($nListView) = 0 Then
                                                ShowMenu($hMain_GUI, $nContextMenuN, $hListView, 1)
                                        EndIf
                                Case $nSubMenuNF
                                        $iLV = _GUICtrlListView_GetItemCount($hListView)
                                        If $iLV Then
                                                For $i = 0 To $iLV - 1
                                                        $sOld = _GUICtrlListView_GetItemText($hListView, $i)
                                                        $sNew = $i + 1 & StringRegExpReplace($sOld, '[0-9]', '')
                                                        _GUICtrlListView_SetItemText($hListView, $i, $sNew)
                                                Next
                                        EndIf
                                        $iLV = 0
                                Case $nSubMenuNE
                                        $iLV = _GUICtrlListView_GetItemCount($hListView)
                                        If $iLV Then
                                                For $i = 0 To $iLV - 1
                                                        $sOld = _GUICtrlListView_GetItemText($hListView, $i)
                                                        $sNew = StringRegExpReplace($sOld, '[0-9]', '') & $i + 1
                                                        _GUICtrlListView_SetItemText($hListView, $i, $sNew)
                                                Next
                                        EndIf
                                        $iLV = 0
                                Case Else
                                        $iCountRow = _GUICtrlListView_GetItemCount($hListView) - 1
                                       
                                        For $i = 0 To $iCountRow
                                                If $aMsg[0] = $aChangeSubMenu[$i] Then
                                                        ReDim $aOld[$iColumns + 1]
                                                        For $j = 1 To $iColumns
                                                                $aOld[$j] = _GUICtrlListView_GetItemText($hListView, $iLast_LV_Index, $j)
                                                        Next
                                                        ReDim $aNew[$iColumns + 1]
                                                        For $j = 1 To $iColumns
                                                                $aNew[$j] = _GUICtrlListView_GetItemText($hListView, $i, $j)
                                                        Next
                                                        For $j = 1 To $iColumns
                                                                _GUICtrlListView_SetItemText($hListView, $i, $aOld[$j], $j)
                                                        Next
                                                        For $j = 1 To $iColumns
                                                                _GUICtrlListView_SetItemText($hListView, $iLast_LV_Index, $aNew[$j], $j)
                                                        Next
                                                        _SubMenuChange()
                                                Else
                                                        ContinueLoop
                                                EndIf
                                        Next
                        EndSwitch
                Case $hMain_GUI
                        Switch $aMsg[0]
                                Case $GUI_EVENT_CLOSE
                                        Exit
                                Case $Button
                                        If Not @Compiled Then
                                                $sFile = @ScriptDir & '\conf.ini'
                                                If Not FileExists($sFile) Then
                                                        MsgBox(16, 'Error', 'Отсутствует файл ' & $sFile)
                                                        Exit
                                                EndIf
                                        Else
                                                If Not $CmdLine[0] Then
                                                        MsgBox(16, 'Error', 'Для запуска перетащите' & @CRLF & 'ини-файл на иконку утилиты')
                                                        Exit
                                                Else
                                                        $sFile = $CmdLine[1]
                                                EndIf
                                        EndIf

                                        If StringRight($sFile, 4) <> '.ini' Then
                                                MsgBox(16, 'Error', 'Это не ини-файл.')
                                                Exit
                                        EndIf

                                        $iDelta = _WinAPI_GetSystemMetrics(33)

                                        For $i = 1 To 5
                                                $aSectionsAll = IniReadSectionNames($sFile)
                                                If Not @error Then ExitLoop
                                        Next
                                        If @error Then
                                                MsgBox(16, 'Error', 'Произошла ошибка. Попробуйте еще раз.')
                                                Exit
                                        EndIf

                                        For $i = 1 To $aSectionsAll[0]
                                                $sData &= $aSectionsAll[$i] & '|'
                                        Next
                                        $sData = StringTrimRight($sData, 1)

                                        For $i = 1 To 5
                                                $aSection_N = _IniReadSectionMy($sFile, $aSectionsAll[$aSectionsAll[0]])
                                                $iColumns = @extended
                                                If Not @error Then ExitLoop
                                        Next
                                        If @error Then
                                                MsgBox(16, 'Error', 'Произошла ошибка. Попробуйте еще раз.')
                                                Exit
                                        EndIf

                                        FileCopy($sFile, @ScriptDir & '\BackUpIni\' & StringRegExpReplace($sFile, '^.*\\', ''), 9)

                                        $iW_LV = ($iColumns + 1) * $iColumn_W
                                        If $iW_LV + $iLeft * 2 + $iDelta < 400 Then
                                                $iW_LV = 400 - $iLeft * 2 - $iDelta
                                        EndIf
                                       
                                        _IniEditor_Create()
                        EndSwitch
        EndSwitch
WEnd

Func _IniEditor_Create()
        If $hIniEditor_GUI And WinExists($hIniEditor_GUI) Then Return
       
        $hIniEditor_GUI = GUICreate('Редактор ini-файлов', $iW_LV + $iLeft * 2 + $iDelta, 400, _
                (@DesktopWidth - ($iW_LV + $iLeft * 2 + $iDelta)) / 2, (@DesktopHeight - 400) / 2)
        GUICtrlCreatePic(@ScriptDir & "\images\001.jpg", 0, 0, (@DesktopWidth - ($iW_LV + $iLeft * 2 + $iDelta)), (@DesktopHeight - 400), $WS_CLIPSIBLINGS)
       
        ;GUISetBkColor(0x00FFFF)
       
        $nInputIni = GUICtrlCreateInput($sFile, $iLeft, 5, $iW_LV + $iDelta, 20, _
                BitOR($GUI_SS_DEFAULT_INPUT, $ES_LEFT, $ES_READONLY))
        GUICtrlSetBkColor(-1, 0xF5F5DC)
        $nComboSection = GUICtrlCreateCombo('', $iLeft, 33, 100, 20, _
                BitOR($GUI_SS_DEFAULT_COMBO, $CBS_SIMPLE, $ES_READONLY))
        GUICtrlSetData(-1, $sData, $aSectionsAll[$aSectionsAll[0]])
        GUICtrlSetBkColor(-1, 0xF5F5DC)
        GUICtrlSetResizing($nComboSection, $GUI_DOCKLEFT + $GUI_DOCKSIZE)
        $sData = ''
        $aSectionsAll = ''

        $nButtonSave = GUICtrlCreateButton('Сохранить', 120, 32, 60, 22)
        GUICtrlSetResizing($nButtonSave, $GUI_DOCKLEFT + $GUI_DOCKSIZE)
        $nButtonDefault = GUICtrlCreateButton('Отменить', 190, 32, 60, 22)
        GUICtrlSetResizing($nButtonDefault, $GUI_DOCKLEFT + $GUI_DOCKSIZE)

        $nListView = GUICtrlCreateListView('', $iLeft, $iY_LV, $iW_LV + $iDelta, 330, _
                $LVS_REPORT, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
        GUICtrlSetBkColor(-1, 0xF5F5DC)
        $hListView = GUICtrlGetHandle($nListView)
        _GUICtrlListView_AddColumn($hListView, '1', $iColumn_W, 2)
        _GUICtrlListView_AddColumn($hListView, '1', $iColumn_W, 2)
        _GUICtrlListView_AddColumn($hListView, '1', $iColumn_W, 2)
        _GUICtrlListView_AddColumn($hListView, '1', $iColumn_W, 2)
        _GUICtrlListView_AddColumn($hListView, '1', $iColumn_W, 2)
        _GUICtrlListView_AddColumn($hListView, '1', $iColumn_W, 2)
        _GUICtrlListView_AddColumn($hListView, '1', $iColumn_W, 2)
        _GUICtrlListView_AddColumn($hListView, '1', $iColumn_W, 2)
        _GUICtrlListView_AddColumn($hListView, '1', $iColumn_W, 2)
        ;For $i = 1 To $iColumns
        ;        _GUICtrlListView_AddColumn($hListView, 'Значение ' & $i, $iColumn_W, 2)
        ;Next
        _GUICtrlListView_AddArray($hListView, $aSection_N)
        $aSection_N = ''

        GUICtrlSetState($nListView, $GUI_FOCUS)
        $nDummyMenu = GUICtrlCreateDummy()
        $nContextMenu = GUICtrlCreateContextMenu($nDummyMenu)
        $hContextMenu = GUICtrlGetHandle($nContextMenu)
        $nSubMenuDel = GUICtrlCreateMenuItem('Удалить значение', $nContextMenu)
        $nSubMenuDelAll = GUICtrlCreateMenuItem('Удалить строку', $nContextMenu)
        $nSubMenuEdit = GUICtrlCreateMenuItem('Редактировать значение', $nContextMenu)

        _SubMenuChange(0)

        $nDummyMenuN = GUICtrlCreateDummy()
        $nContextMenuN = GUICtrlCreateContextMenu($nDummyMenuN)
        $hContextMenuN = GUICtrlGetHandle($nContextMenuN)
        $nSubMenuN = GUICtrlCreateMenu('Пронумеровать ключи', $nContextMenuN)
        $nSubMenuNF = GUICtrlCreateMenuItem('Число в начале', $nSubMenuN)
        $nSubMenuNE = GUICtrlCreateMenuItem('Число в конце', $nSubMenuN)

        $hEditor = GUICreate('Редактировать', $iColumn_W, 14, 110, 100, $WS_POPUP, _
                BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST, $WS_EX_COMPOSITED))
        $nInputEditor = GUICtrlCreateInput('', 0, 0, $iColumn_W, 14);, $ES_CENTER)
        GUICtrlSetBkColor(-1, 0xDCDCDC)
        GUICtrlSetState(-1, $GUI_HIDE)

        $nComboEditor = GUICtrlCreateCombo('', 0, 0, $iColumn_W, 14)
        GUICtrlSetBkColor(-1, 0xDCDCDC)
        GUICtrlSetState(-1, $GUI_HIDE)

        _WinAPI_SetParent($hEditor, $hIniEditor_GUI)

        GUISetState(@SW_SHOW, $hIniEditor_GUI)
        GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')

        ;_WinAPI_EmptyWorkingSet()
EndFunc

Func ShowMenu($hWnd, $nContextID, $nContextControlID, $iMouse = 0)
        Local $hMenu = GUICtrlGetHandle($nContextID)
        Local $iCtrlPos = ControlGetPos($hWnd, '', $nContextControlID)
        Local $X = $iCtrlPos[0]
        Local $Y = $iCtrlPos[1] + $iCtrlPos[3]
        ClientToScreen($hWnd, $X, $Y)
        If $iMouse Then
                $X = MouseGetPos(0)
                $Y = MouseGetPos(1)
        EndIf
        DllCall('user32.dll', 'int', 'TrackPopupMenuEx', 'hwnd', $hMenu, 'int', 0, 'int', _
                        $X, 'int', $Y, 'hwnd', $hWnd, 'ptr', 0)
EndFunc  ;==>ShowMenu

Func ClientToScreen($hWnd, ByRef $X, ByRef $Y)
        Local $stPoint = DllStructCreate('int;int')

        DllStructSetData($stPoint, 1, $X)
        DllStructSetData($stPoint, 2, $Y)
        DllCall('user32.dll', 'int', 'ClientToScreen', 'hwnd', $hWnd, 'ptr', _
                        DllStructGetPtr($stPoint))
        $X = DllStructGetData($stPoint, 1)
        $Y = DllStructGetData($stPoint, 2)
        $stPoint = 0
EndFunc  ;==>ClientToScreen

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
        Local $hWndFrom, $iCode, $tNMHDR, $hWndListView, $tInfo

        $hWndListView = $hListView
        If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

        $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, 'hWndFrom'))
        $iCode = DllStructGetData($tNMHDR, 'Code')

        Switch $hWndFrom
                Case $hWndListView
                        Switch $iCode
                                Case $NM_RCLICK
                                        If $fEdit Then
                                                _Editor_LV_Save()
                                        EndIf
                                        $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                                        $iIndexItem = DllStructGetData($tInfo, 'Index')
                                        $iIndexSubItem = DllStructGetData($tInfo, 'SubItem')
                                        If $iIndexSubItem <> -1 Then
                                                $iLast_LV_SubIndex = $iIndexSubItem
                                        EndIf
                                        If $iIndexItem <> -1 Then
                                                $iLast_LV_Index = $iIndexItem
                                                For $i = 0 To $iCountRow
                                                        GUICtrlSetState($aChangeSubMenu[$i], $GUI_ENABLE)
                                                Next
                                                GUICtrlSetState($aChangeSubMenu[$iIndexItem], $GUI_DISABLE)
                                                ShowMenu($hWnd, $nContextMenu, $hListView, 1)
                                        EndIf
                                Case $NM_DBLCLK
                                        $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                                        $iIndexItem = DllStructGetData($tInfo, 'Index')
                                        $iIndexSubItem = DllStructGetData($tInfo, 'SubItem')
                                        If $iIndexSubItem <> -1 Then
                                                $iLast_LV_SubIndex = $iIndexSubItem
                                        EndIf
                                        If $iIndexItem <> -1 Then
                                                $iLast_LV_Index = $iIndexItem
                                        EndIf
                                        If Not $fEdit Then
                                                _Editor_LV_Show()
                                        EndIf
                                Case $NM_CLICK, $NM_KILLFOCUS, $LVN_COLUMNCLICK
                                        If $fEdit Then
                                                _Editor_LV_Save()
                                        EndIf
                        EndSwitch
        EndSwitch
        Return $GUI_RUNDEFMSG
EndFunc  ;==>WM_NOTIFY

Func _Editor_LV_Save()
        HotKeySet('{ENTER}')
        HotKeySet('{UP}')
        HotKeySet('{DOWN}')
        If Not $fCombo Then
                _GUICtrlListView_SetItemText($hListView, $iLast_LV_Index, GUICtrlRead($nInputEditor), _
                                $iLast_LV_SubIndex)
                GUICtrlSetData($nInputEditor, '')
                GUISetState(@SW_HIDE, $hEditor)
                _SubMenuChange()
        Else
                Local $sFromComboEditor = GUICtrlRead($nComboEditor)
                If $sFromComboEditor Then
                        _GUICtrlListView_SetItemText($hListView, $iLast_LV_Index, $sFromComboEditor, $iLast_LV_SubIndex)
                EndIf
                GUISetState(@SW_HIDE, $hEditor)
                GUICtrlSetData($nComboEditor, '')
        EndIf
        $aRect = ''
        $fEdit = False
EndFunc  ;==>_Editor_LV_Save

Func _Editor_LV_Show()
        $aRect = _GUICtrlListView_GetSubItemRect($hListView, $iLast_LV_Index, $iLast_LV_SubIndex)
        WinMove($hEditor, '', $aRect[0] + $iLeft + $iDelta, $aRect[1] + $iY_LV, $iColumn_W, _
                        ($aRect[3] - $aRect[1]) + $iDelta)
        ;If $iLast_LV_SubIndex Then
                Switch $iLast_LV_SubIndex
                        Case 4 ;первая колонка.
                                GUICtrlSetPos($nComboEditor, 0, 0, $iColumn_W, ($aRect[3] - $aRect[1]) + $iDelta)
                                GUICtrlSetData($nComboEditor, 'yes|no')
                                GUICtrlSetState($nComboEditor, $GUI_SHOW)
                                GUICtrlSetState($nInputEditor, $GUI_HIDE)
                                GUISetState(@SW_SHOW, $hEditor)
                                $fCombo = True
                        Case 5 ;пятая колонка
                                GUICtrlSetPos($nComboEditor, 0, 0, $iColumn_W, ($aRect[3] - $aRect[1]) + $iDelta)
                                GUICtrlSetData($nComboEditor, 'yes|no')
                                GUICtrlSetState($nComboEditor, $GUI_SHOW)
                                GUICtrlSetState($nInputEditor, $GUI_HIDE)
                                GUISetState(@SW_SHOW, $hEditor)
                                $fCombo = True
                        Case Else ;любая, кроме тех, которые указаны выше.
                                GUICtrlSetPos($nInputEditor, 0, 0, $iColumn_W, ($aRect[3] - $aRect[1]) + $iDelta)
                                $sText = _GUICtrlListView_GetItemText($hListView, $iLast_LV_Index, $iLast_LV_SubIndex)
                                GUICtrlSetData($nInputEditor, $sText)
                                GUICtrlSetState($nInputEditor, $GUI_SHOW)
                                GUICtrlSetState($nComboEditor, $GUI_HIDE)
                                GUISetState(@SW_SHOW, $hEditor)
                                $fCombo = False
                EndSwitch
        ;EndIf
        $fEdit = True
        HotKeySet('{ENTER}', '_Editor_LV_Save')
        HotKeySet('{UP}', '_Editor_LV_Save')
        HotKeySet('{DOWN}', '_Editor_LV_Save')
EndFunc  ;==>_Editor_LV_Show

Func _IniReadSectionMy($sFile_Ini, $sSection_Name)
        Local $aSection_Name_Temp, $aValue_Temp, $aReturn_Array[1][2], $iMax = 1

        If Not FileExists($sFile_Ini) Then Return SetError(1)
        $aSection_Name_Temp = IniReadSection($sFile_Ini, $sSection_Name)
        If @error Then Return SetError(1)
        ReDim $aReturn_Array[$aSection_Name_Temp[0][0]][$iMax + 1]
        For $i = 1 To $aSection_Name_Temp[0][0]
                If Not StringInStr($aSection_Name_Temp[$i][1], '<') Or Not _
                                StringInStr($aSection_Name_Temp[$i][1], '>') Then
                        MsgBox(16, 'Редактор ini-файлов', _
                                        'Данная утилита предназначена для редактирования только тех ини-файлов,' & _
                                        @CRLF & 'в котором все значения заключены в теги "<" и ">", например,' & _
                                        @CRLF & '<Значение 1><Значение 2><Значение 3>...<Значение N>')
                        Exit
                        ;Return SetError(1)
                EndIf
                $aValue_Temp = StringRegExp($aSection_Name_Temp[$i][1], '<(.*?)>', 3)
                If @error Then Return SetError(1)
                If $iMax < UBound($aValue_Temp) Then
                        $iMax = UBound($aValue_Temp)
                        ReDim $aReturn_Array[$aSection_Name_Temp[0][0]][$iMax + 1]
                EndIf
                $aReturn_Array[$i - 1][0] = $aSection_Name_Temp[$i][0]
                For $j = 0 To UBound($aValue_Temp) - 1
                        $aReturn_Array[$i - 1][$j + 1] = $aValue_Temp[$j]
                Next
        Next
        Return SetError(0, $iMax, $aReturn_Array)
EndFunc  ;==>_IniReadSectionMy

Func _SubMenuChange($iFlag = 1)
        If $iFlag Then
                _GUICtrlMenu_DeleteMenu($hContextMenu, 3)
        EndIf
        $nSubMenuChange = GUICtrlCreateMenu('Поменять значение местами с', $nContextMenu)
        $iCountRow = _GUICtrlListView_GetItemCount($hListView) - 1
        ReDim $aChangeSubMenu[$iCountRow + 1]
        For $i = 0 To $iCountRow
                $sChangeSubMenu = ''
                If $iColumns > 1 Then
                        For $j = 1 To 2
                                $sChangeSubMenu &= _GUICtrlListView_GetItemText($hListView, $i, $j) & Chr(32)
                        Next
                        $sChangeSubMenu &= '...'
                Else
                        $sChangeSubMenu = _GUICtrlListView_GetItemText($hListView, $i, 1) & Chr(32) & '...'
                EndIf
                $aChangeSubMenu[$i] = GUICtrlCreateMenuItem($sChangeSubMenu, $nSubMenuChange)
        Next
EndFunc  ;==>_SubMenuChange

Func _Del_BackUpIni()
        DirRemove(@ScriptDir & '\BackUpIni', 1)
EndFunc  ;==>_Del_BackUpIni


Centrinar 05-03-2011 00:18 1627511

Можно как нибудь в кратце описать как это делается, т.е. как правильно назначаються $aMsg[...] , какие Global прописываем и т.д. А то я пока читал этот скрипт аж голова закружилась

Creat0R 05-03-2011 02:48 1627548

Цитата:

Цитата Centrinar
Можно как нибудь в кратце описать как это делается »

Вкратце - нет. Читай справку и смотри примеры в ней.
Всё что могу сделать, так это привести ещё один простой пример обработки событий от двух GUI:

Код:

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

#Region Main form
$hMain_GUI = GUICreate("Главное окно", 300, 200)
$nStngs_Btn = GUICtrlCreateButton("Настройки", 10, 170, 70, 20)
$nExit_Btn = GUICtrlCreateButton("Выход", 90, 170, 70, 20)
GUISetState(@SW_SHOW, $hMain_GUI)
#EndRegion Main form

#Region Settings form
$hStngs_GUI = GUICreate("Настройки", 400, 200)
$nStngs_Ok_Btn = GUICtrlCreateButton("ОК", 10, 170, 80, 25)
$nStngs_Close_Btn = GUICtrlCreateButton("Закрыть", 310, 170, 80, 25)
#EndRegion Settings form

While 1
    $aMsg = GUIGetMsg(1) ;Расширенная обработка событий

    Switch $aMsg[0]
        Case $GUI_EVENT_CLOSE, $nExit_Btn, $nStngs_Close_Btn
            Switch $aMsg[1]
                Case $hMain_GUI  ;Событие поступило от главного окна - завершаем работу скрипта
                    Exit
                Case $hStngs_GUI ;Событие поступило от окна настроек - закрываем его
                    GUISetState(@SW_HIDE, $hStngs_GUI)
            EndSwitch
        Case $nStngs_Btn
            GUISetState(@SW_SHOW, $hStngs_GUI)
    EndSwitch
WEnd


Centrinar 09-03-2011 03:02 1630411

Разобрался спасибо! А если у меня есть переменная:
Код:

$hMain_GUI = GUICreate("Главное окно", 300, 200)
$nStngs_Btn = GUICtrlCreateButton("Настройки", 10, 170, 70, 20)
$nExit_Btn = GUICtrlCreateButton("Выход", 90, 170, 70, 20)
........
Local $Button[3]
$iLeft = 10
For $i=1 To $Perl
$Buttons[$i] = GUICtrlCreateButton ("Кнопка", $iLeft75102 , 10, 10, 20)
$iLeft += 10
Next

Как ее правильно внести?

Centrinar 09-03-2011 13:00 1630626

:sorry:

Creat0R 09-03-2011 19:20 1630893

Цитата:

Цитата Centrinar
А если у меня есть переменная »

Ничего не понял, какая переменная, и как оно связано с данной темой?

Centrinar 10-03-2011 00:18 1631092

пардон...
Код:

Local $Button[3]
$iLeft = 10
For $i=1 To $Perl
$Buttons[$i] = GUICtrlCreateButton ("Кнопка", $iLeft75102 , 10, 10, 20)
$iLeft += 10

создаються кнопки $Buttons[$i] как их в Casе правильно вписать?

Код:

While 1
For  $i = 1 To UBound($Perl)-1

    $aMsg = GUIGetMsg(1) ;Расширенная обработка событий

    Switch $aMsg[0]
        Case $GUI_EVENT_CLOSE, $nExit_Btn, $nStngs_Close_Btn
            Switch $aMsg[1]
                Case $hMain_GUI  ;Событие поступило от главного окна - завершаем работу скрипта
                    Exit
                Case $hStngs_GUI ;Событие поступило от окна настроек - закрываем его
                    GUISetState(@SW_HIDE, $hStngs_GUI)
            EndSwitch
        Case $nStngs_Btn
            GUISetState(@SW_SHOW, $hStngs_GUI)
        Case $Button[$i]
    .........................................
......................................................
.........................................................
...........................................................
    EndSwitch
next
WEnd

Скрипт работает но кнопки нажимаются ток со второго раза

Creat0R 10-03-2011 00:25 1631098

Цитата:

Цитата Centrinar
как их в Casе правильно вписать? »

Код:

Case $Buttons[1] To $Buttons[2]

Centrinar 10-03-2011 00:31 1631107

а если мне число этих $Buttons[1] не известно их может быть и 7 и 8?

$Buttons[1] to $Buttons[$i]?

При этом у каждого $Buttons свое действие должно быть(((

Creat0R 10-03-2011 00:44 1631112

Цитата:

Цитата Centrinar
а если мне число этих $Buttons[1] не известно их может быть и 7 и 8? »

Код:

Case $Buttons[1] To $Buttons[Ubound($Buttons)-1]

Centrinar 10-03-2011 12:26 1631437

А если у каждой $Button разные действия? (если проще то как узнать название нажимаемой кнопки?)

madmasles 10-03-2011 14:48 1631565

Centrinar,
Код:

#include <GuiConstantsEx.au3>
#include <StaticConstants.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>

$iRandom = Random(3, 15, 1)

Dim $aButton[$iRandom + 1][3] = [[$iRandom]]
For $i = 1 To $iRandom
    $aButton[$i][1] = $i & ' кнопка'
    $aButton[$i][2] = $i & '-е действие.'
Next

$hGui = GUICreate('Test', 200, 10 * 2 + 30 * ($iRandom + 1))
$nLabel = GUICtrlCreateLabel('', 20, 10, 160, 20, $SS_CENTER)
For $i = 1 To $iRandom
    $aButton[$i][0] = GUICtrlCreateButton($aButton[$i][1], 50, 10 + $i * 30, 100, 20)
Next
GUISetState()
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
    ;For $i = 1 To $iRandom
    ;    If $nMsg = $aButton[$i][0] Then
    ;        GUICtrlSetData($nLabel, $aButton[$i][2])
    ;    EndIf
    ;Next
WEnd

Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $nNotifyCode = BitShift($wParam, 16)
    Local $nID = BitAND($wParam, 0xFFFF)

    If $nNotifyCode = $BN_CLICKED Then
        For $i = 1 To $iRandom
            If $nID = $aButton[$i][0] Then
                GUICtrlSetData($nLabel, $aButton[$i][1] & ' ---> ' & $aButton[$i][2])
            EndIf
        Next
    EndIf

    Return $GUI_RUNDEFMSG
EndFunc  ;==>WM_COMMAND


Creat0R 10-03-2011 15:20 1631597

Centrinar, это уже не имеет никакого отношения к теме, тем более что оно уже помечена как решенная.


Время: 22:53.

Время: 22:53.
© OSzone.net 2001-