Что нового

динамическое создание меню при его вызове

running-frag

why me?
Сообщения
441
Репутация
60
Код:
Local $hCharName[10][10]

$hCharName[0][0] = 	GUICtrlCreateLabel 	("select character", 10, 5, 480, 30, BitOR ($SS_CENTER, $SS_CENTERIMAGE))
					GUICtrlSetFont 		(-1, 20)
					GUICtrlSetBkColor	(-1, 0xFFFFFF)

$hCharName[1][0] = 	GUICtrlCreateContextMenu 	($hCharName[0][0])
$hCharName[2][1] = 	GUICtrlCreateMenuItem 		("create new character", $hCharName[1][0])
$hCharName[2][2] = 	GUICtrlCreateMenu 			("set IP to", $hCharName[1][0])

Простенькое создание контекстового меню.

Т.е. смысл такой. В меню будет "кнопка создать" новое значение. После чего значение пишется в .ini После при вызове все значение с .ini считываются и подставляются в наше контекстное меню. Другими словами нужно динамическое изменение контекстного меню.

Вопрос такой как будет выглядеть функция которая будет "менять содержание меню" при вызове самого меню.



Добавлено:
Сообщение автоматически объединено:

Более полный пример.
Код:
#include <GUIConstantsEx.au3>

Global $hGUI, $hAction
Global $hCharName[10][10]

$hGUI = 			GUICreate 			("hGUI", 500, 300)
$hCharName[0][0] = 	GUICtrlCreateLabel 	("select character", 10, 5, 480, 30)
					GUICtrlSetFont 		(-1, 20)
					GUICtrlSetBkColor	(-1, 0xFFFFFF)

$hCharName[1][0] = 	GUICtrlCreateContextMenu 	($hCharName[0][0])
$hCharName[2][1] = 	GUICtrlCreateMenuItem 		("character11", $hCharName[1][0])
$hCharName[2][2] = 	GUICtrlCreateMenu 			("create new", 	$hCharName[1][0])
$hCharName[2][3] = 	GUICtrlCreateMenuItem 		("character22", $hCharName[1][0])
$hCharName[2][4] = 	GUICtrlCreateMenuItem 		("character33", $hCharName[1][0])
$hCharName[2][5] = 	GUICtrlCreateMenuItem 		("character44", $hCharName[1][0])
$hCharName[2][6] = 	GUICtrlCreateMenuItem 		("character55", $hCharName[1][0])


					GUISetState (@SW_SHOW)
					
					
While True
	$hAction = GUIGetMsg () 
	If $hAction = $GUI_EVENT_CLOSE Then ExitLoop
WEnd


Просто тут не одна трудность с "удалением старого и наполнением". Тут ещё трудно отловить "на что кликнули", нужен текст того на что был клик.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,670
Репутация
2,463
Как то так:

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>

Global $aChars[1]

$hGUI = GUICreate("Dynamic Menu", 500, 40)

$iLabel =  GUICtrlCreateLabel("select character", 10, 5, 480, 30, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetFont(-1, 20)
GUICtrlSetBkColor(-1, 0xFFFFFF)

$iMenu = GUICtrlCreateContextMenu($iLabel)
$iCreateChar_MItem = GUICtrlCreateMenuItem("create new character", $iMenu)
$iChars_Menu = GUICtrlCreateMenu("set IP to", $iMenu)

GUISetState(@SW_SHOW, $hGUI)

While 1
	$iMsg = GUIGetMsg()

	Switch $iMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $iCreateChar_MItem
			$sCharacter = InputBox("Character name", "Type Character name:", "", "", 300, 150, Default, Default, 0, $hGUI)
			If @error Or StringStripWS($sCharacter, 8) = "" Then ContinueLoop
			
			$aChars[0] += 1
			ReDim $aChars[$aChars[0]+1]
			$aChars[$aChars[0]] = GUICtrlCreateMenuItem($sCharacter, $iChars_Menu)
			
			IniWrite(@ScriptDir & "\Chars.ini", "Chars", $aChars[0], $sCharacter)
	EndSwitch
WEnd
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
Да это подходит. Но вопрос с "удалением" он не решает. Допустим у нас будет ещё одно подменю аля "delete ->" где будет тот же список чаров и по клику на него чар затирается из массива.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,670
Репутация
2,463
running-frag [?]
вопрос с "удалением" он не решает
А вопрос с удалением не стоял ;).


Допустим у нас будет ещё одно подменю аля "delete ->" где будет тот же список чаров и по клику на него чар затирается из массива.
А зачем ещё одно меню, можно удалять по списку, вот так примерно:
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <GUIListView.au3>

Global $aChars[1]

$hGUI = GUICreate("Dynamic Menu", 500, 40)

$iLabel =  GUICtrlCreateLabel("select character", 10, 5, 480, 30, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetFont(-1, 20)
GUICtrlSetBkColor(-1, 0xFFFFFF)

$iMenu = GUICtrlCreateContextMenu($iLabel)
$iCreateChar_MItem = GUICtrlCreateMenuItem("Create new character", $iMenu)
$iDeleteChar_MItem = GUICtrlCreateMenuItem("Delete characters...", $iMenu)
$iChars_Menu = GUICtrlCreateMenu("set IP to", $iMenu)

GUISetState(@SW_SHOW, $hGUI)

While 1
	$iMsg = GUIGetMsg()
	
	Switch $iMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $iCreateChar_MItem
			$sCharacter = InputBox("Character name", "Type Character name:", "", "", 300, 150, Default, Default, 0, $hGUI)
			If @error Or StringStripWS($sCharacter, 8) = "" Then ContinueLoop
			
			$aChars[0] += 1
			ReDim $aChars[$aChars[0]+1]
			$aChars[$aChars[0]] = GUICtrlCreateMenuItem($sCharacter, $iChars_Menu)
			
			IniWrite(@ScriptDir & "\Chars.ini", "Chars", $aChars[0], $sCharacter)
		Case $iDeleteChar_MItem
			If $aChars[0] = 0 Then
				MsgBox(48, "Attention", "No characters created.", 0, $hGUI)
				ContinueLoop
			EndIf
			
			GUISetState(@SW_DISABLE, $hGUI)
			$hDeleteChar_GUI = GUICreate("Delete Characters", 300, 400, -1, -1, -1, -1, $hGUI)
			
			$iLV = GUICtrlCreateListView("Chars", 20, 50, 260, 300)
			_GUICtrlListView_SetExtendedListViewStyle($iLV, $LVS_EX_CHECKBOXES)
			
			For $i = 1 To $aChars[0]
				GUICtrlCreateListViewItem(GUICtrlRead($aChars[$i], 1), $iLV)
			Next
			
			$iDelete_Bttn = GUICtrlCreateButton("Delete checked", 20, 370, 90, 20)
			
			GUISetState(@SW_SHOW, $hDeleteChar_GUI)
			
			While 1
				$iMsg = GUIGetMsg()
			
				Switch $iMsg
					Case $GUI_EVENT_CLOSE
						ExitLoop
					Case $iDelete_Bttn
						For $i = $aChars[0] To 1 Step -1
							If _GUICtrlListView_GetItemChecked($iLV, $i-1) Then
								GUICtrlDelete($aChars[$i])
								IniDelete(@ScriptDir & "\Chars.ini", "Chars", $i)
								_ArrayDelete($aChars, $i)
								$aChars[0] -= 1
							EndIf
						Next
						
						_ArrayDisplay($aChars)
						
						ExitLoop
				EndSwitch
			WEnd
			
			GUISetState(@SW_ENABLE, $hGUI)
			GUIDelete($hDeleteChar_GUI)
	EndSwitch
WEnd
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
Да не стоял. :smile: И на последок не отходя от темы. Ну а как же (всё же) выбрать нужный элемент то? Ну т.е. я не пойму вот что. Натыкали мы элементов в меню\ini. Они у нас есть. Но я по прежднему не могу сообразить как "выбрать" элемент. Допустим нужно тыкнув на элемент что б он перезаписался в наш GUICtrlCreateLabel ().

PS: Я к чему "вокруг да около", если у нас точное количество элементов и мы знаем что там, то написать условие не трудно, т.к. у нас элементы не "бегают вверх\вниз". Но когда у нас список "динамический" как мы можем получить строку на какую тыкнули.


Добавлено:
Сообщение автоматически объединено:

Походу проще чем думалось...
Код:
GUICtrlRead($aChars[$i])

Но вот только как получить индекс после клика в меню.


Добавлено:
Сообщение автоматически объединено:

Ам, если нагляднее не решена проблема "выбора". Нам нужно что бы после выбора "Select -> Char_name" наш Label менялся на то что клацнули (Char_name).

Добавлено "подгрузка" из ini значений.
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <GUIListView.au3>

Global $aChars[1]

$hGUI = 	GUICreate("Dynamic Menu", 500, 40)

$iLabel =  	GUICtrlCreateLabel("select character", 10, 5, 480, 30, BitOR($SS_CENTER, $SS_CENTERIMAGE))
			GUICtrlSetFont(-1, 20)
			GUICtrlSetBkColor(-1, 0xFFFFFF)

$iMenu = 				GUICtrlCreateContextMenu	($iLabel)
$iCreateChar_MItem = 	GUICtrlCreateMenuItem 		("Create new character", $iMenu)
$iDeleteChar_MItem = 	GUICtrlCreateMenuItem 		("Delete character...", $iMenu)
$iChars_Menu = 			GUICtrlCreateMenu 			("Select", $iMenu)

			GUISetState(@SW_SHOW, $hGUI)

load () ; грузим из ini

While 1
    $iMsg = GUIGetMsg()
   
    Switch $iMsg
        Case $GUI_EVENT_CLOSE
            Exit
			
        Case $iCreateChar_MItem
            create_new ()
			
        Case $iDeleteChar_MItem
            delete ()
			
			
    EndSwitch
WEnd


Func create_new ($_string = False)
	If Not $_string Then
		$sCharacter = InputBox ("Character name", "Type Character name:", "", "", 300, 150, Default, Default, 0, $hGUI)
		If @error Or StringStripWS ($sCharacter, 8) = "" Then Return
	Else
		$sCharacter = $_string
	EndIf
    
    $aChars[0] += 1
    ReDim $aChars[$aChars[0]+1]
    $aChars[$aChars[0]] = GUICtrlCreateMenuItem($sCharacter, $iChars_Menu)
           
    IniWrite(@ScriptDir & "Chars.ini", "Chars", $aChars[0], $sCharacter)
	
EndFunc

Func delete ()
	
	If $aChars[0] = 0 Then
        MsgBox(48, "Attention", "No characters created.", 0, $hGUI)
		Return
        ;ContinueLoop
	EndIf
           
    GUISetState(@SW_DISABLE, $hGUI)
    $hDeleteChar_GUI = GUICreate("Delete Char", 300, 400, -1, -1, -1, -1, $hGUI)
           
    $iLV = GUICtrlCreateListView("Chars", 20, 50, 260, 300)
    _GUICtrlListView_SetExtendedListViewStyle($iLV, $LVS_EX_CHECKBOXES)
           
    For $i = 1 To $aChars[0]
		GUICtrlCreateListViewItem(GUICtrlRead($aChars[$i], 1), $iLV)
	Next
           
    $iDelete_Bttn = GUICtrlCreateButton("Delete chekced", 20, 370, 90, 20)
           
    GUISetState(@SW_SHOW, $hDeleteChar_GUI)
           
    While 1
		$iMsg = GUIGetMsg()
           
        Switch $iMsg
			Case $GUI_EVENT_CLOSE
				ExitLoop
			Case $iDelete_Bttn
				For $i = $aChars[0] To 1 Step -1
					If _GUICtrlListView_GetItemChecked($iLV, $i-1) Then
						GUICtrlDelete ($aChars[$i])
                        IniDelete (@ScriptDir & "Chars.ini", "Chars", $i)
                        _ArrayDelete($aChars, $i)
                        $aChars[0] -= 1
					EndIf
				Next
                _ArrayDisplay($aChars)
                ExitLoop
				
			EndSwitch
	WEnd
           
	GUISetState(@SW_ENABLE, $hGUI)
    GUIDelete($hDeleteChar_GUI)
	
EndFunc

Func load ()
	
	Local $_array = IniReadSection ("Chars.ini", "Chars")
	;_ArrayDisplay ($_array)
	For $i = 1 To $_array[0][0]
		create_new ($_array[$i][1])
	Next
	
EndFunc


Желаемое вообще как то можно реализовать? :(


Добавлено:
Сообщение автоматически объединено:

Код:
For $k = 1 To $aChars[0]
		If $iMsg = $aChars[$k] Then MsgBox (0, 0, GUICtrlRead ($aChars[$k], 1))
	Next


Если добавить то вопрос решается.

Ещё раз спс за помощь.


Добавлено:
Сообщение автоматически объединено:

Так же буду благодарен если кто нибудь покажет "другие варианты получения строки". Ибо не очень нравится что крутится постоянно в цикле. :(
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,670
Репутация
2,463
running-frag [?]
буду благодарен если кто нибудь покажет "другие варианты получения строки". Ибо не очень нравится что крутится постоянно в цикле.
Код:
Case Else
            If $aChars[0] > 0 And $iMsg >= $aChars[1] And $iMsg <= $aChars[$aChars[0]] Then
                MsgBox(0, 0, GUICtrlRead($iMsg, 1))
            EndIf
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
В общем есть проблема. :'(
Вот переделанный код (ну как я его вижу)

Код:
#include <Array.au3>					; _ArrayDisplay ()
#Include <File.au3>						; _FileReadToArray()
#include <WinAPIex.au3>
#include <GDIPlus.au3>
#Include <ScreenCapture.au3>
#include <WinAPI.au3>
#include <Constants.au3>				; $IMAGE_BITMAP
#include <WindowsConstants.au3>			; $WS_POPUPWINDOW | $WS_EX_TOOLWINDOW
#include <EditConstants.au3>			; $ES_PASSWORD
#include <ButtonConstants.au3>			; $BS_CENTER, $BS_VCENTER
#include <TabConstants.au3>				; $TCS_FLATBUTTONS
#include <GUIConstantsEx.au3>			; $GUI_EVENT_CLOSE
#include <StaticConstants.au3>			; $SS_CENTER | $SS_CENTERIMAGE
#Include <GuiListBox.au3>				; $LBS_STANDARD
#Include <GuiListView.au3>
#Include <GuiComboBox.au3>				; _GUICtrlComboBox_...


Global $hGUI_child = 		GUICreate ("characters", 500, 450, -1, -1, -1, -1)
Global $stFile[2] = [False, "character.ini"]
Global $hCharArray[1] = [0]	; массив для чаров меню

Global $hCharLabel = 		GUICtrlCreateLabel 	("select character", 10, 5, 480, 30, BitOR ($SS_CENTER, $SS_CENTERIMAGE))
							GUICtrlSetFont 		($hCharLabel, 20)
							GUICtrlSetBkColor	($hCharLabel, 0xFFFFFF)

Global $hCharMenu = 		GUICtrlCreateContextMenu	($hCharLabel)
Global $hCharMenuCreate = 	GUICtrlCreateMenuItem 		("Create new character", 	$hCharMenu)
Global $hCharMenuDelete = 	GUICtrlCreateMenuItem 		("Delete character...", 	$hCharMenu)
Global $hCharMenuSelect = 	GUICtrlCreateMenu 			("Select", 					$hCharMenu)

GUISetState (@SW_SHOW, $hGUI_child)


_GUI_charLoad ()

While True
	$hAction = GUIGetMsg (1)
	
	
	If $hAction[0] = $hCharMenuCreate Then _GUI_charCreate ()				; меню создать перса на label
	If $hAction[0] = $hCharMenuDelete Then _GUI_charDelete ()				; меню удалить перса на label
	If $hAction[0] = $GUI_EVENT_CLOSE Then ExitLoop
	
	For $k = 1 To $hCharArray[0]
		If $hAction[0] = $hCharArray[$k] Then
			MsgBox (0, 0, GUICtrlRead ($hCharArray[$k], 1))
			_ArrayDisplay ($hCharArray)
		EndIf
	Next
	
WEnd




Func _GUI_charCreate ($_string = False)
	Local $_exit = False						; флаг для дубляжей
	Local $_load = True
	
	If Not $_string Then			; если не задано имя тогда просим ввести
		$_load = False
		$_string = InputBox ("Character name", "Type Character name:", "", "", 300, 150, Default, Default, 0, $hGUI_child)
		If @error Then				; cancel or other
			Return
		EndIf
	EndIf
    
	For $i = 1 To $hCharArray[0]				; пробегаем массив
		If $_string == GUICtrlRead ($hCharArray[$i], 1) Then $_exit = True
	Next
	
	If $_exit Then Return
	
	$hCharArray[0] += 1
	ReDim $hCharArray[$hCharArray[0]+1]
	$hCharArray[$hCharArray[0]] = GUICtrlCreateMenuItem ($_string, $hCharMenuSelect)
	       
    IniWrite ($stFile[1], $_string, "created", "true")
EndFunc

Func _GUI_charDelete ()
	_GUI_charLoad ()
	
	If $hCharArray[0] = 0 Then
        MsgBox (48, "Attention", "Character list is empty.", 0, $hGUI_child)
		Return
	EndIf
           
								GUISetState 				(@SW_DISABLE, $hGUI_child)
	Local $hCharDelete_gui = 	GUICreate 					("Delete Chararacter", 300, 400, -1, -1, -1, -1, $hGUI_child)
	Local $hCharDelete_lst = 	_GUICtrlListView_Create						($hCharDelete_gui, "Characters", 5, 5, 260, 300)
								_GUICtrlListView_SetColumnWidth				($hCharDelete_lst, 0, $LVSCW_AUTOSIZE_USEHEADER)
								_GUICtrlListView_SetExtendedListViewStyle 	($hCharDelete_lst, $LVS_EX_CHECKBOXES)
	
	For $p = 1 To $hCharArray[0]
								_GUICtrlListView_InsertItem ($hCharDelete_lst, GUICtrlRead ($hCharArray[$p], 1), 0)
	Next

	Local $hCharDelete_btn = 	GUICtrlCreateButton 		("Delete checked", 20, 370, 90, 20)
								GUISetState 				(@SW_SHOW, $hCharDelete_gui)
	
	Local $hCharDelete_act
	
    While True
		$hCharDelete_act = GUIGetMsg()
           
		Select
			Case $hCharDelete_act = $GUI_EVENT_CLOSE
				ExitLoop
				
			Case $hCharDelete_act = $hCharDelete_btn
				For $i = $hCharArray[0] To 1 Step -1
					If _GUICtrlListView_GetItemChecked ($hCharDelete_lst, $i -1) Then
						Local $_charName = _GUICtrlListView_GetItemText ($hCharDelete_lst, $i -1)
						IniDelete ($stFile[1], $_charName)
					EndIf
				Next
				
                ExitLoop
				
			EndSelect
	WEnd
								GUIDelete 					($hCharDelete_gui)
								GUISetState 				(@SW_ENABLE, $hGUI_child)
	_GUI_charLoad ()
EndFunc

Func _GUI_charLoad ()
	Local $_array = IniReadSectionNames ($stFile[1])			; считываем все имена чаров (секции)
	
	For $k = 1 To $hCharArray[0]			; затираем gui
		GUICtrlDelete ($hCharArray[$k])		; удаляем хэндлы
	Next
	
	ReDim $hCharArray[1]	; затираем массив
	$hCharArray[0] = 0		; затираем счётчик
	
	If @error Then Return
	If Not (IsArray ($_array)) Or $_array[0] = 0 Then Return	; если массив и не нулевой
	
	For $i = 1 To $_array[0]
		_GUI_charCreate ($_array[$i])		; добавляем в меню чара
	Next
	
EndFunc

Сам по себе он работает хорошо. Внимание сейчас приделяется "клику на созданном чаре (элементе)". Т.е. сейчас создаём - выбераем вылетает MsgBox (). Когда я его вставляю в код программы где и так до...много условий у меня не срабатывает выбор из меню (а именно выбор перса). НО! Если сначало или создать, или удалить тогда эти менюхи "просыпаются" и MsgBox начинает срабатывать. Вопрос хоть даже и в теории но... Где может быть косяк?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,670
Репутация
2,463
running-frag [?]
Вот переделанный код
Не понять мне твой стиль написания кода... ладно.

Когда я его вставляю в код программы где и так до...много условий у меня не срабатывает выбор из меню (а именно выбор перса)
Нужно видеть весь код чтобы сказать точно.
И у тебя ошибка, при удалении массив не изменяется.

P.S.
Ты всё равно не использовал то что я предложил, зачем лишний цикл в цикле?
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
CreatoR [?]
И у тебя ошибка, при удалении массив не изменяется.
Задумка была следующая. "Обновляем - удаляем - обновляем". Т.е. функция _GUI_charLoad () каждый раз "пересоздаёт" значения. Таким образом мы всегда имеем актуальные данные ДО выполнения того же удаления и ПОСЛЕ.

Ты всё равно не использовал то что я предложил, зачем лишний цикл в цикле?
Та тут с этим сначало бы разобраться а потом уже в главном цикле менять. :(




Добавлено:
Сообщение автоматически объединено:

Ещё подгон, когда добавляю чара то MsgBox() вылазит только на только что добавленном (на остальных не срабатывает). А когда его удаляю (или любой другой элемент) то начинают работать все правильно. :stars:
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
Да там ойойойойой больше будет вопросов. Но обрезал немного, с ним тоже не пашет (методом исключения). Вот огрызки при которых не пашет.

Код:
While True
	$hAction = GUIGetMsg (1)
	
	Select
		#REGION====== GUI
		; закрытие главного окна
		; закрытие главного окна
		Case $hAction[1] = $hGUI And $hAction[0] = $GUI_EVENT_CLOSE							; закрытие главного окна
			ExitLoop
		Case $hAction[1] = $hGUI_child 
			; закрытие дочернего окна
			; закрытие дочернего окна
			;If $hAction[0] = $GUI_EVENT_CLOSE Then
			;	_GUI_childWindowClear ()
			;	ContinueLoop
			;EndIf
			
			
			; другие действия
			; другие действия			
			Switch (WinGetTitle ($hGUI_child))
				Case "character"
					;If $hAction[0] = $hCharMenuCreate Then _GUI_charCreate ()				; меню создать перса на label
					;If $hAction[0] = $hCharMenuDelete Then _GUI_charDelete ()				; меню удалить перса на label
					
					
					; тут надо счётчит для выбора переделать
					;If $hAction[0] = 0x011F Then
					;_ArrayDisplay ($hCharArray)
						For $k = 1 To $hCharArray[0]
							ConsoleWrite ("action is "& $hAction[0]& " @"& $k & " " &GUICtrlRead ($hCharArray[$k], 1) & "  "&$hCharArray[$k]&@CR)
							If $hAction[0] == $hCharArray[$k] Then
								MsgBox (0, 0, GUICtrlRead ($hCharArray[$k], 1))
								
							EndIf
						Next
			EndSwitch
Case $hAction[1] = $hGUI And $hAction[0] = $hMenu[2][1]							; VIEW EDITOR
			_GUI_childToggle ("character")	
		
			
		Case $hAction[1] = $hGUI And $hAction[0] = $hMenu[1][9]							; EXIT
			ExitLoop
			
		#ENDREGION=== MENU CALL
		
		
		#ce
		;Case Else
		;	If $hCharArray[0] > 0 And $hAction[0] >= $hCharArray[1] And $hAction[0] <= $hCharArray[$hCharArray[0]] Then
		;		MsgBox (0,0, GUICtrlRead ($hAction[0], 1))
		;	EndIf
		EndSelect
WEnd


Так же есть
Код:
GUIRegisterMsg 		($WM_ACTIVATE, "WM_ACTIVATE")
Func WM_ACTIVATE 	($hWnd, $Msg, $wParam, $lParam)
    If Not BitAND ($wParam, 0xFFFF) Then ToolTip("")
EndFunc

GUIRegisterMsg  	($WM_NOTIFY, "WM_NOTIFY")
Func WM_NOTIFY 		($hWnd, $iMsg, $wParam, $lParam)
    Local $hData = DllStructCreate ($tagNMHDR, $lParam)
    Local $hInputFrom = HWnd (DllStructGetData ($hData, "hWndFrom"))
    Local $hInputID = DllStructGetData ($hData, "IDFrom")
    Local $hCode = DllStructGetData ($hData, "Code")

    Select
		Case $hWnd = $hGUI_child							; нужный хэндл окна
			Select
				Case $hInputFrom = $hCharList[3]			; хэндл на который отслеживаем
					Select
						Case $hCode = $EN_CHANGE			; действие
							_charList_inputDone ()
					EndSelect	
			EndSelect
		EndSelect
		
	Return $GUI_RUNDEFMSG	 
EndFunc

Но он закомменчены поэтому мешать не могут. Вроде всё просто но почему то не пашет.

PS: На комменты не обращайте внимания там много чуши. :whistle:



Добавлено:
Сообщение автоматически объединено:

Смысл такой, есть главное GUI и через меню создаются дочерние (одновременно может быть только одно дочернее). И вот окно чаров как раз дочернее.

Напомню что цикл рабочий, если не считать проблемы описанной выше.


Добавлено:
Сообщение автоматически объединено:

CreatoR [?]
Мне кажется она неверная.
Просто я хотел привязать изначально к именам (строкам). Т.е. секции в ini = менюшки в подменю. И парится с "последовательностью" нехочу. Плюс вот это вот "обновление - удаление - обновление" на уровне багов. А вдруг юзверь похерил или заменил ini файл? Поэтому подумал что это будет лучший вариант. :-[


Добавлено:
Сообщение автоматически объединено:

Код:
action is -7 @1 N21A  71
action is -7 @2 333  72
action is -8 @1 N21A  71
action is -8 @2 333  72
action is -9 @1 N21A  71
action is -9 @2 333  72
action is -10 @1 N21A  71
action is -10 @2 333  72
action is -8 @1 N21A  71
action is -8 @2 333  72
action is -9 @1 N21A  71
action is -9 @2 333  72
action is -10 @1 N21A  71
action is -10 @2 333  72
action is -8 @1 N21A  71
action is -8 @2 333  72
action is -9 @1 N21A  71
action is -9 @2 333  72
action is -10 @1 N21A  71
action is -10 @2 333  72
action is -8 @1 N21A  71
action is -8 @2 333  72
action is -9 @1 N21A  71
action is -9 @2 333  72
action is -10 @1 N21A  71
action is -10 @2 333  72
action is -8 @1 N21A  71
action is -8 @2 333  72
action is -9 @1 N21A  71
action is -9 @2 333  72
action is -10 @1 N21A  71
action is -10 @2 333  72
action is 17 @1 N21A  71
action is 17 @2 333  72
action is 17 @3 new char  73
action is -8 @1 N21A  71
action is -8 @2 333  72
action is -8 @3 new char  73
action is -9 @1 N21A  71
action is -9 @2 333  72
action is -9 @3 new char  73
action is -10 @1 N21A  71
action is -10 @2 333  72
action is -10 @3 new char  73
action is -8 @1 N21A  71
action is -8 @2 333  72
action is -8 @3 new char  73
action is -9 @1 N21A  71
action is -9 @2 333  72
action is -9 @3 new char  73
action is -10 @1 N21A  71
action is -10 @2 333  72
action is -10 @3 new char  73
action is -8 @1 N21A  71
action is -8 @2 333  72
action is -8 @3 new char  73
action is -9 @1 N21A  71
action is -9 @2 333  72
action is -9 @3 new char  73
action is -10 @1 N21A  71
action is -10 @2 333  72
action is -10 @3 new char  73
action is 73 @1 N21A  71
action is 73 @2 333  72
action is 73 @3 new char  73
action is -8 @1 N21A  71
action is -8 @2 333  72
action is -8 @3 new char  73
action is -7 @1 N21A  71
action is -7 @2 333  72
action is -7 @3 new char  73
action is -8 @1 N21A  71
action is -8 @2 333  72
action is -8 @3 new char  73
action is -9 @1 N21A  71
action is -9 @2 333  72
action is -9 @3 new char  73
action is -10 @1 N21A  71
action is -10 @2 333  72
action is -10 @3 new char  73
action is 18 @1 N21A  71
action is 18 @2 new char  72
action is -9 @1 N21A  71
action is -9 @2 new char  72
action is -10 @1 N21A  71
action is -10 @2 new char  72
action is 71 @1 N21A  71
action is 71 @2 new char  72
action is -8 @1 N21A  71
action is -8 @2 new char  72

Та самая проверка в цикле где крутится строка
Код:
For $k = 1 To $hCharArray[0]
							ConsoleWrite ("action is "& $hAction[0]& " @"& $k & " " &GUICtrlRead ($hCharArray[$k], 1) & "  "&$hCharArray[$k]&@CR)
							If $hAction[0] == $hCharArray[$k] Then
								MsgBox (0, 0, GUICtrlRead ($hCharArray[$k], 1))
								
							EndIf
						Next


Первый положительный "action is 17" это добавление нового.
Второй положительный это мы тыкнули на него "action is 73".
Третий это "action is 18" удаление одного.

И после уже все начинают работать нормально.


Добавлено:
Сообщение автоматически объединено:

нашёл часть которая бочинит, в лс кину

upd:
Косяк в обьявлении второй табы (GUICtrlCreateTabItem). С одной работает. Если их уже две, перестаёт работать.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,670
Репутация
2,463
running-frag
Слишком усложняешь всё, выложи полный рабочий код, иначе помочь тебе вряд ли кто то сможет.
 

AZJIO

Меценат
Меценат
Сообщения
2,768
Репутация
1,156
running-frag
Ибо не очень нравится что крутится постоянно в цикле
Сделал тест проверки событий, оказалось запас на кручение в цикле очень большой.

Код:
$Trg=2
$timer = TimerInit()
For $i = 1 To 10000
	If $Trg=3 Then $Trg=4  ; задержка проверки 10000 элементов составляет 5 мсек (меньше чем GUIGetMsg в 2 раза)
Next
MsgBox(0, "Время выполнения", 'Время : ' & Round(TimerDiff($timer) / 1000, 3) & ' сек')

$timer = TimerInit()
Sleep(10) ; задержка GUIGetMsg() составляет 10 мсек
MsgBox(0, "Время выполнения", 'Время : ' & Round(TimerDiff($timer) / 1000, 3) & ' сек')

; Задержка вызывающая торможение фейса 50 мс


Ну и вариант всё же для избавление от проверки событий от десятков тысяч элементов меню.
Код:
#include <WindowsConstants.au3>
; #include <MenuConstants.au3>
#include <GUIConstantsEx.au3>
Global $k = 0

Global $k = 0, $store[2] = [1000000, 0], $Item[6] = [5] ; здесь 1000000 не даёт сработать событию и в тоже время ID практически не может совпасть с этим числом на практике.
$Gui = GUICreate("WM_MENUSELECT", 590, 270)
GUICtrlCreateLabel('Функция WM_MENUSELECT срабатывает в момент выбора главного или контекстного меню и его пунктов.', 5, 5, 380, 34)
$FileMenu = GUICtrlCreateMenu('&File')
$Item[1] = GUICtrlCreateMenuItem('Открыть', $FileMenu)
; GUICtrlSetState(-1, $GUI_CHECKED)
$Item[2] = GUICtrlCreateMenuItem('Сохранить', $FileMenu)
; GUICtrlSetState(-1, $GUI_DISABLE)
$Item[3] = GUICtrlCreateMenuItem('Выход', $FileMenu)
$HelpMenu = GUICtrlCreateMenu('Справка')
$Item[4] = GUICtrlCreateMenuItem('Web', $HelpMenu)
$Item[5] = GUICtrlCreateMenuItem('Поддержка', $HelpMenu)

$statist = GUICtrlCreateLabel('', 425, 40, 165, 234)

$ContMenu = GUICtrlCreateContextMenu()
GUICtrlCreateMenuItem('Удалить', $ContMenu)
GUICtrlCreateMenuItem('Выход', $ContMenu)

GUISetState()
GUIRegisterMsg($WM_MENUSELECT, "WM_MENUSELECT")


While 1
	$msg = GUIGetMsg()
	Switch $msg
		Case -3
			Exit
	EndSwitch
	If Not $store[0] Then ; событие проверяется только при закрытии меню
		If $msg = $store[1] Then ; и только для пункта, который был выделен при закрытии меню
			$k += 1
			If Not $store[1] Then ; при отказе выбора в меню переходим к концу цикла
				$store[0] = 1000000 ; защита от генерации при неиспользованнии меню более 2-х раз
				ContinueLoop
			EndIf
			WinSetTitle($Gui, '', 'Вызов, '&$k&' - ID = '&$store[1])
			MsgBox(0, 'Событие', 'ID = '&$store[1])
		EndIf
	EndIf
WEnd

Func WM_MENUSELECT($hWnd, $Msg, $wParam, $lParam)
	Local $ID = BitAND($wParam, 0xFFFF) ; _WinAPI_LoWord
	$store[1] = $store[0] ; кешируется предыдущий ID
	$store[0] = $ID
EndFunc
 
Верх