Войти

Показать полную графическую версию : [решено] При $GUI_EVENT_CLOSE окно зависает.


Centrinar
03-03-2011, 22:48
Выкладываю образец скрипта, при нажатии на кнопку и закрытии окна виснут. А надо что бы при закрытии второго окна первое оставалось. СПАСИБО

Creat0R
03-03-2011, 23:21
Нужно обрабатывать события для всех элементов в одном цикле, а 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
Можно как нибудь в кратце описать как это делается, т.е. как правильно назначаються $aMsg[...] , какие Global прописываем и т.д. А то я пока читал этот скрипт аж голова закружилась

Creat0R
05-03-2011, 02:48
Можно как нибудь в кратце описать как это делается »
Вкратце - нет. Читай справку и смотри примеры в ней.
Всё что могу сделать, так это привести ещё один простой пример обработки событий от двух GUI:

#include (http://www.autoitscript.com/autoit3/docs/keywords.htm##include) <ButtonConstants.au3>
#include (http://www.autoitscript.com/autoit3/docs/keywords.htm##include) <GUIConstantsEx.au3>
#include (http://www.autoitscript.com/autoit3/docs/keywords.htm##include) <WindowsConstants.au3>

#Region Main form
$hMain_GUI = GUICreate (http://www.autoitscript.com/autoit3/docs/functions/GUICreate.htm)("Главное окно", 300, 200)
$nStngs_Btn = GUICtrlCreateButton (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateButton.htm)("Настройки", 10, 170, 70, 20)
$nExit_Btn = GUICtrlCreateButton (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateButton.htm)("Выход", 90, 170, 70, 20)
GUISetState (http://www.autoitscript.com/autoit3/docs/functions/GUISetState.htm)(@SW_SHOW (http://www.autoitscript.com/autoit3/docs/macros.htm#@sw_show), $hMain_GUI)
#EndRegion Main form

#Region Settings form
$hStngs_GUI = GUICreate (http://www.autoitscript.com/autoit3/docs/functions/GUICreate.htm)("Настройки", 400, 200)
$nStngs_Ok_Btn = GUICtrlCreateButton (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateButton.htm)("ОК", 10, 170, 80, 25)
$nStngs_Close_Btn = GUICtrlCreateButton (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateButton.htm)("Закрыть", 310, 170, 80, 25)
#EndRegion Settings form

While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) 1
$aMsg = GUIGetMsg (http://www.autoitscript.com/autoit3/docs/functions/GUIGetMsg.htm)(1) ;Расширенная обработка событий

Switch (http://www.autoitscript.com/autoit3/docs/keywords.htm#Switch) $aMsg[0]
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) $GUI_EVENT_CLOSE, $nExit_Btn, $nStngs_Close_Btn
Switch (http://www.autoitscript.com/autoit3/docs/keywords.htm#Switch) $aMsg[1]
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) $hMain_GUI ;Событие поступило от главного окна - завершаем работу скрипта
Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit)
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) $hStngs_GUI ;Событие поступило от окна настроек - закрываем его
GUISetState (http://www.autoitscript.com/autoit3/docs/functions/GUISetState.htm)(@SW_HIDE (http://www.autoitscript.com/autoit3/docs/macros.htm#@sw_hide), $hStngs_GUI)
EndSwitch (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndSwitch)
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) $nStngs_Btn
GUISetState (http://www.autoitscript.com/autoit3/docs/functions/GUISetState.htm)(@SW_SHOW (http://www.autoitscript.com/autoit3/docs/macros.htm#@sw_show), $hStngs_GUI)
EndSwitch (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndSwitch)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)

Centrinar
09-03-2011, 03:02
Разобрался спасибо! А если у меня есть переменная:

$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
:sorry:

Creat0R
09-03-2011, 19:20
А если у меня есть переменная »
Ничего не понял, какая переменная, и как оно связано с данной темой?

Centrinar
10-03-2011, 00:18
пардон...

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
как их в Casе правильно вписать? »
Case $Buttons[1] To $Buttons[2]

Centrinar
10-03-2011, 00:31
а если мне число этих $Buttons[1] не известно их может быть и 7 и 8?

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

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

Creat0R
10-03-2011, 00:44
а если мне число этих $Buttons[1] не известно их может быть и 7 и 8? »
Case $Buttons[1] To $Buttons[Ubound($Buttons)-1]

Centrinar
10-03-2011, 12:26
А если у каждой $Button разные действия? (если проще то как узнать название нажимаемой кнопки?)

madmasles
10-03-2011, 14:48
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
Centrinar, это уже не имеет никакого отношения к теме, тем более что оно уже помечена как решенная.




© OSzone.net 2001-2012