Что нового

Скрипт, оптимизирующий написание объявление функций

dr.room

Новичок
Сообщения
283
Репутация
0
Версия AutoIt:
3.3.14.2
Описание:
Есть документ - предположим с названием «GUI» с простым, но не маленьким скриптом.
Есть в нём GUI - на много кнопок. Есть функции, что ими вызываются
В чём вопрос.
Следует записать объявление функций при клике по кнопки таким образом, чтобы:
- была объявлена функция соответствующая номеру кнопки;
- и также, были объявлены, предварительно, функции, предшествующие (если есть) вызываемой функции
Примерно как на кнопках 37-40
Т.е. нужен скрипт, правильно прописывающий сами объявления функций, в документ с названием «GUI»

Примечания:
Сам документ "GUI" содержит следующий код (пример)
Код:
#cs ----------------------------------------------------------------------------
Действие при нажатии - пока что обычный MsgBox (это для примера)
Действующие в примере кнопки: 40-37.
#ce ----------------------------------------------------------------------------
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <WinAPISys.au3>
#include <UIAutomate.au3>
#include <ButtonConstants.au3>

Opt("WinTitleMatchMode", 2)
Opt("WinWaitDelay",100)

HotKeySet("{ESC}", "_Exit")
Global $Paused
HotKeySet("{F9}", "TogglePause")






	Local $hGui, $OptionsBtn, $OptionsDummy, $OptionsContext, $OptionsCommon, $OptionsFile, $msg
	Local $OptionsExit, $HelpBtn, $HelpDummy, $HelpContext, $HelpWWW, $HelpAbout
	Local $TriBtn, $TriDummy, $TriContext, $TriWWW, $TriAbout
	Local $textGuiCtrlCreateLabel,$S_CENTER

	$hGui = GUICreate("Выбор вариантов: 3 категории", 550, 100)


	$font = "Verdana"
	$textGuiCtrlCreateLabel = GUICtrlCreateLabel ('Нужно выбрать: сколько 3-ёх очковых бросков ', 10, 8, 480, 17, $SS_CENTER)



	$textGuiCtrlCreateLabel_2 = GUICtrlCreateLabel ('в среднем за игру делает Шакил О’Нил"', 10, 30, 480, 17, $SS_CENTER)
	GUICtrlSetFont($textGuiCtrlCreateLabel_2,9,400)



	$1Knopka = GUICtrlCreateButton("&От 1 до 10", 10, 60, 90, 20, $BS_FLAT)


	$1Dummy = GUICtrlCreateDummy()
	$1Context = GUICtrlCreateContextMenu($1Dummy)
	$1variant_vibora = GUICtrlCreateMenuItem("1 (бросков)", $1Context)
	GUICtrlCreateMenuItem("", $1Context)
	$2variant_vibora = GUICtrlCreateMenuItem("2 (бросков)", $1Context)
	GUICtrlCreateMenuItem("", $1Context)
	$3variant_vibora = GUICtrlCreateMenuItem("3 (бросков)", $1Context)
	GUICtrlCreateMenuItem("", $1Context)
	$4variant_vibora = GUICtrlCreateMenuItem("4 (бросков)", $1Context)
	GUICtrlCreateMenuItem("", $1Context)
	$5variant_vibora = GUICtrlCreateMenuItem("5 (бросков)", $1Context)
	GUICtrlCreateMenuItem("", $1Context)
	$6variant_vibora = GUICtrlCreateMenuItem("6 (бросков)", $1Context)
	GUICtrlCreateMenuItem("", $1Context)
	$7variant_vibora = GUICtrlCreateMenuItem("7 (бросков)", $1Context)
	GUICtrlCreateMenuItem("", $1Context)
	$8variant_vibora = GUICtrlCreateMenuItem("8 (бросков)", $1Context)
	GUICtrlCreateMenuItem("", $1Context)
	$9variant_vibora = GUICtrlCreateMenuItem("9 (бросков)", $1Context)
	GUICtrlCreateMenuItem("", $1Context)
	$10variant_vibora = GUICtrlCreateMenuItem("10 (бросков)", $1Context)
	GUICtrlCreateMenuItem("", $1Context)


	$2Knopka = GUICtrlCreateButton("&От 11 до 20", 110, 60, 90, 20, $BS_FLAT)


	$2Dummy = GUICtrlCreateDummy()
	$2Context = GUICtrlCreateContextMenu($2Dummy)
	$11variant_vibora = GUICtrlCreateMenuItem("11 (бросков)", $2Context)
	GUICtrlCreateMenuItem("", $2Context)
	$12variant_vibora = GUICtrlCreateMenuItem("12 (бросков)", $2Context)
	GUICtrlCreateMenuItem("", $2Context)
	$13variant_vibora = GUICtrlCreateMenuItem("13 (бросков)", $2Context)
	GUICtrlCreateMenuItem("", $2Context)
	$14variant_vibora = GUICtrlCreateMenuItem("14 (бросков)", $2Context)
	GUICtrlCreateMenuItem("", $2Context)
	$15variant_vibora = GUICtrlCreateMenuItem("15 (бросков)", $2Context)
	GUICtrlCreateMenuItem("", $2Context)
	$16variant_vibora = GUICtrlCreateMenuItem("16 (бросков)", $2Context)
	GUICtrlCreateMenuItem("", $2Context)
	$17variant_vibora = GUICtrlCreateMenuItem("17 (бросков)", $2Context)
	GUICtrlCreateMenuItem("", $2Context)
	$18variant_vibora = GUICtrlCreateMenuItem("18 (бросков)", $2Context)
	GUICtrlCreateMenuItem("", $2Context)
	$19variant_vibora = GUICtrlCreateMenuItem("19 (бросков)", $2Context)
	GUICtrlCreateMenuItem("", $2Context)
	$20variant_vibora = GUICtrlCreateMenuItem("20 (бросков)", $2Context)
	GUICtrlCreateMenuItem("", $2Context)


	$3Knopka = GUICtrlCreateButton("&От 21 до 30", 210, 60, 90, 20, $BS_FLAT)


	$3Dummy = GUICtrlCreateDummy()
	$3Context = GUICtrlCreateContextMenu($3Dummy)
	$21variant_vibora = GUICtrlCreateMenuItem("21 (бросков)", $3Context)
	GUICtrlCreateMenuItem("", $3Context)
	$22variant_vibora = GUICtrlCreateMenuItem("22 (бросков)", $3Context)
	GUICtrlCreateMenuItem("", $3Context)
	$23variant_vibora = GUICtrlCreateMenuItem("23 (бросков)", $3Context)
	GUICtrlCreateMenuItem("", $3Context)
	$24variant_vibora = GUICtrlCreateMenuItem("24 (бросков)", $3Context)
	GUICtrlCreateMenuItem("", $3Context)
	$25variant_vibora = GUICtrlCreateMenuItem("25 (бросков)", $3Context)
	GUICtrlCreateMenuItem("", $3Context)
	$26variant_vibora = GUICtrlCreateMenuItem("26 (бросков)", $3Context)
	GUICtrlCreateMenuItem("", $3Context)
	$27variant_vibora = GUICtrlCreateMenuItem("27 (бросков)", $3Context)
	GUICtrlCreateMenuItem("", $3Context)
	$28variant_vibora = GUICtrlCreateMenuItem("28 (бросков)", $3Context)
	GUICtrlCreateMenuItem("", $3Context)
	$29variant_vibora = GUICtrlCreateMenuItem("29 (бросков)", $3Context)
	GUICtrlCreateMenuItem("", $3Context)
	$30variant_vibora = GUICtrlCreateMenuItem("30 (бросков)", $3Context)
	GUICtrlCreateMenuItem("", $3Context)


	$4Knopka = GUICtrlCreateButton("&От 31 до 40", 310, 60, 90, 20, $BS_FLAT)


	$4Dummy = GUICtrlCreateDummy()
	$4Context = GUICtrlCreateContextMenu($4Dummy)
	$31variant_vibora = GUICtrlCreateMenuItem("31 (бросков)", $4Context)
	GUICtrlCreateMenuItem("", $4Context)
	$32variant_vibora = GUICtrlCreateMenuItem("32 (бросков)", $4Context)
	GUICtrlCreateMenuItem("", $4Context)
	$33variant_vibora = GUICtrlCreateMenuItem("33 (бросков)", $4Context)
	GUICtrlCreateMenuItem("", $4Context)
	$34variant_vibora = GUICtrlCreateMenuItem("34 (бросков)", $4Context)
	GUICtrlCreateMenuItem("", $4Context)
	$35variant_vibora = GUICtrlCreateMenuItem("35 (бросков)", $4Context)
	GUICtrlCreateMenuItem("", $4Context)
	$36variant_vibora = GUICtrlCreateMenuItem("36 (бросков)", $4Context)
	GUICtrlCreateMenuItem("", $4Context)
	$37variant_vibora = GUICtrlCreateMenuItem("37 (бросков)", $4Context)
	GUICtrlCreateMenuItem("", $4Context)
	$38variant_vibora = GUICtrlCreateMenuItem("38 (бросков)", $4Context)
	GUICtrlCreateMenuItem("", $4Context)
	$39variant_vibora = GUICtrlCreateMenuItem("39 (бросков)", $4Context)
	GUICtrlCreateMenuItem("", $4Context)
	$40variant_vibora = GUICtrlCreateMenuItem("40 (бросков)", $4Context)
	GUICtrlCreateMenuItem("", $4Context)
	GUISetState()

	While 1
		$msg = GUIGetMsg()

		Switch $msg
			Case  $GUI_EVENT_CLOSE
				ExitLoop

			Case $1Knopka
				ShowMenu($hGui, $msg, $1Context)

			Case $2Knopka
				ShowMenu($hGui, $msg, $2Context)

			Case $3Knopka
				ShowMenu($hGui, $msg, $3Context)

			Case $4Knopka
				ShowMenu($hGui, $msg, $4Context)

			Case $1variant_vibora

									ExitLoop
			Case $2variant_vibora

									ExitLoop
			Case $3variant_vibora

									ExitLoop
			Case $4variant_vibora

									ExitLoop
			Case $5variant_vibora

									ExitLoop
			Case $6variant_vibora

									ExitLoop
			Case $7variant_vibora


									ExitLoop
			Case $8variant_vibora

									ExitLoop
			Case $9variant_vibora

									ExitLoop
			Case $10variant_vibora

									ExitLoop

			Case $11variant_vibora

									ExitLoop
			Case $12variant_vibora

									ExitLoop
			Case $13variant_vibora

									ExitLoop
			Case $14variant_vibora

									ExitLoop
			Case $15variant_vibora

									ExitLoop
			Case $16variant_vibora


									ExitLoop
			Case $17variant_vibora

									ExitLoop
			Case $18variant_vibora

									ExitLoop
			Case $19variant_vibora

									ExitLoop
			Case $20variant_vibora

									ExitLoop

			Case $21variant_vibora

									ExitLoop
			Case $22variant_vibora

									ExitLoop
			Case $23variant_vibora

									ExitLoop
			Case $24variant_vibora

									ExitLoop
			Case $25variant_vibora

									ExitLoop
			Case $26variant_vibora

									ExitLoop
			Case $27variant_vibora

									ExitLoop
			Case $28variant_vibora

									ExitLoop
			Case $29variant_vibora

									ExitLoop
			Case $30variant_vibora

									ExitLoop

			Case $31variant_vibora

									ExitLoop
			Case $32variant_vibora

									ExitLoop
			Case $33variant_vibora

									ExitLoop
			Case $34variant_vibora

									ExitLoop
			Case $35variant_vibora

									ExitLoop
			Case $36variant_vibora

									ExitLoop
			Case $37variant_vibora
			deystvie_40()
			deystvie_39()
			deystvie_38()
			deystvie_37()

									ExitLoop
			Case $38variant_vibora
			deystvie_40()
			deystvie_39()
			deystvie_38()

									ExitLoop
			Case $39variant_vibora
			deystvie_40()
			deystvie_39()

									ExitLoop
			Case $40variant_vibora
			deystvie_40()
									ExitLoop

		EndSwitch
	WEnd
	GUIDelete()





Func ShowMenu($hWnd, $CtrlID, $nContextID)
	Local $arPos, $x, $y
	Local $hMenu = GUICtrlGetHandle($nContextID)

	$arPos = ControlGetPos($hWnd, "", $CtrlID)

	$x = $arPos[0]
	$y = $arPos[1] + $arPos[3]

	ClientToScreen($hWnd, $x, $y)
	TrackPopupMenu($hWnd, $hMenu, $x, $y)
EndFunc


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


Func TrackPopupMenu($hWnd, $hMenu, $x, $y)

	DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0, "int", $x, "int", $y, "hwnd", $hWnd, "ptr", 0)
EndFunc



#CS
Функции при клике на кнопку...
#CE

Func deystvie_1()
MsgBox(64,"","Выбрано: 1",1)
EndFunc


Func deystvie_2()
MsgBox(64,"","Выбрано: 1",1)
MsgBox(64,"","Выбрано: 2",1)

EndFunc


Func deystvie_3()
MsgBox(64,"","Выбрано: 1",1)
MsgBox(64,"","Выбрано: 2",1)
MsgBox(64,"","Выбрано: 3",1)

EndFunc


Func deystvie_4()

EndFunc


Func deystvie_5()

EndFunc


Func deystvie_6()

EndFunc



Func deystvie_7()

EndFunc


Func deystvie_8()

EndFunc



Func deystvie_9()

EndFunc


Func deystvie_10()

EndFunc



Func deystvie_11()

EndFunc


Func deystvie_12()

EndFunc



Func deystvie_13()

EndFunc


Func deystvie_14()

EndFunc



Func deystvie_15()

EndFunc


Func deystvie_16()

EndFunc



Func deystvie_17()

EndFunc


Func deystvie_18()

EndFunc



Func deystvie_19()

EndFunc


Func deystvie_20()

EndFunc



Func deystvie_21()

EndFunc


Func deystvie_22()

EndFunc



Func deystvie_23()

EndFunc


Func deystvie_24()

EndFunc



Func deystvie_25()

EndFunc


Func deystvie_26()

EndFunc



Func deystvie_27()

EndFunc


Func deystvie_28()

EndFunc



Func deystvie_29()

EndFunc


Func deystvie_30()

EndFunc



Func deystvie_31()

EndFunc


Func deystvie_32()

EndFunc



Func deystvie_33()

EndFunc


Func deystvie_34()

EndFunc



Func deystvie_35()

EndFunc


Func deystvie_36()

EndFunc



Func deystvie_37()
MsgBox(262208,"","Выбрано: действие: # 37",2)

EndFunc


Func deystvie_38()
MsgBox(262208,"","Выбрано: действие: # 38",2)

EndFunc

Func deystvie_39()
MsgBox(262208,"","Выбрано: действие: # 39",2)

EndFunc


Func deystvie_40()
MsgBox(262208,"","Выбрано: действие: # 40",2)
EndFunc



#CS
Дополнительные функции
#CE

Func _Exit()
    Exit
EndFunc

Func TogglePause()
    $Paused = Not $Paused
    If $Paused Then
        ToolTip('Ручная пауза! Для снятия  жать F9', 0, 0, 'Внимание', 0, 4)
        TrayTip('Внимание', 'Ручная пауза! Для снятия жать F9', 3, 1)
    Else
        ToolTip('', 0, 0)
        TrayTip('', '', 0)
    EndIf
    While $Paused

    WEnd
EndFunc


Func _FixAccelHotKeyLayout()
    Static $iKbrdLayout, $aKbrdLayouts

    If Execute('@exitMethod') <> '' Then
        Local $iUnLoad = 1

        For $i = 1 To $aKbrdLayouts[0]
            If Hex($iKbrdLayout) = Hex('0x' & StringRight($aKbrdLayouts[$i], 4)) Then
                $iUnLoad = 0
                ExitLoop
            EndIf
        Next

        If $iUnLoad Then
            _WinAPI_UnloadKeyboardLayout($iKbrdLayout)
        EndIf

        Return
    EndIf

    $iKbrdLayout = 0x0409
    $aKbrdLayouts = _WinAPI_GetKeyboardLayoutList()
    _WinAPI_LoadKeyboardLayout($iKbrdLayout, $KLF_ACTIVATE)

    OnAutoItExitRegister('_FixAccelHotKeyLayout')
EndFunc
Спасибо
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
dr.room
Я смотрю никто не спешит отвечать, поэтому постараюсь объяснить. Ваш скрипт, мягко выражаясь, "крутит кишки" у любого человека.

1. Управляющие кнопки следует генерировать в цикле, а не копипастить на сотню строк.
2. Откройте для себя массивы, достаточно уделить этому 10 минут прочтения справки.
3. Цикл обработки сообщений переделать под использование массивов и, исходя из ваших "множеств" функций, использовать Call.
4. Не мне судить о уникальности каждого действия производимого в функциях, но полагаясь на ваши "упущения" предположу, что можно обойтись без этого копипаста.

Считайте это "принудительной" рекомендацией. Если после тяжких трудов у вас возникнут вопросы или проблемы - обращайтесь, поможем чем сможем.
 
Верх