Что нового

[Элементы GUI] Как отловить появление текста в эл-т Edit

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
При использовании при внесении текста ф-ии:
Код:
GUICtrlSetData($hEdit," Текст", 1)


изменение отлавливается.
Однако при этом ограничен размер вносимого текста

При использовании же ф-ии:
Код:
GUICtrlSetData($hEdit," Текст")

ограничения нет или скорее где-то очень далеко,
но отловить внесение текста мне не удается.

Вот пример:
Код:
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiEdit.au3>

$hForm = GUICreate('Test',250, 350)
GUISetBkColor(0xECE9D8)

$hEdit=GUICtrlCreateEdit ( "", 5, 10, 240, 300)

$ButTest1=GUICtrlCreateButton("Test1",10,320, 40, 25)
$ButTest2=GUICtrlCreateButton("Test2",50, 320, 40, 25)
$Label=GUICtrlCreateLabel("",100, 320, 140, 25,0x1000)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $ButTest1
			GUICtrlSetData($hEdit,"  Set Text")
		Case $ButTest2
			GUICtrlSetData($hEdit," Append Text", 1)
	EndSwitch
WEnd

Func WM_COMMAND($hWnd, $imsg, $iwParam, $ilParam) 
	Local $hWndFrom = $ilParam
	Local $iIDFrom = BitAND($iwParam, 0xFFFF)
	Local $iCode = BitShift($iwParam, 16)
	GUICtrlSetData($label,"")
	Switch $hWnd
		Case $hForm
			Switch $iIDFrom
				Case $hEdit
					Switch $iCode
						Case $EN_CHANGE
							GUICtrlSetData($label," $hEdit Changed")
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG 
EndFunc  ;==>WM_COMMAND


Возможно вариантом будет высылка какого то сообщения эл-ту Edit
одновременно с GUICtrlSetData($hEdit," Текст") ?
Как это выполнить?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Элементы GUI] Как отловить внесение текста в эл-т Edit

gregaz,
Не знаю, правильно ли так, но работает:
Код:
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiEdit.au3>
$j = 0
$hForm = GUICreate('Test', 250, 350)
GUISetBkColor(0xECE9D8)

$hEdit = GUICtrlCreateEdit('', 5, 10, 240, 300)

$ButTest1 = GUICtrlCreateButton('Test1', 10, 320, 40, 25)
$ButTest2 = GUICtrlCreateButton('Test2', 50, 320, 40, 25)
$Label = GUICtrlCreateLabel('', 100, 320, 140, 25, 0x1000)
GUICtrlSetState(-1, $GUI_FOCUS)
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $ButTest1
			GUICtrlSetState($hEdit, $GUI_FOCUS)
			GUICtrlSetData($hEdit, '  Set Text')
			GUICtrlSetState($Label, $GUI_FOCUS)
		Case $ButTest2
			GUICtrlSetState($hEdit, $GUI_FOCUS)
			GUICtrlSetData($hEdit, ' Append Text', 1)
			GUICtrlSetState($Label, $GUI_FOCUS)
	EndSwitch
WEnd

Func WM_COMMAND($hWnd, $imsg, $iwParam, $ilParam)
	Local $hWndFrom = $ilParam
	Local $iIDFrom = BitAND($iwParam, 0xFFFF)
	Local $iCode = BitShift($iwParam, 16)
	;GUICtrlSetData($Label, '')
	Switch $hWnd
		Case $hForm
			Switch $iIDFrom
				Case $hEdit
					Switch $iCode
						Case $EN_KILLFOCUS, $EN_CHANGE
							$j += 1
							GUICtrlSetData($Label, $j & '-' & GUICtrlRead($hEdit))
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND


А так совсем просто: :smile:
Код:
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiEdit.au3>
$j = 0
$hForm = GUICreate('Test', 250, 350)
GUISetBkColor(0xECE9D8)

$hEdit = GUICtrlCreateEdit('', 5, 10, 240, 300)

$ButTest1 = GUICtrlCreateButton('Test1', 10, 320, 40, 25)
$ButTest2 = GUICtrlCreateButton('Test2', 50, 320, 40, 25)
$Label = GUICtrlCreateLabel('', 100, 320, 140, 25, 0x1000)
GUICtrlSetState(-1, $GUI_FOCUS)
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $ButTest1
			GUICtrlSetData($hEdit, '  Set Text')
			$j += 1
			GUICtrlSetData($Label, $j & '-' & GUICtrlRead($hEdit))
		Case $ButTest2
			GUICtrlSetData($hEdit, ' Append Text', 1)
			$j += 1
			GUICtrlSetData($Label, $j & '-' & GUICtrlRead($hEdit))
	EndSwitch
WEnd

Func WM_COMMAND($hWnd, $imsg, $iwParam, $ilParam)
	Local $hWndFrom = $ilParam
	Local $iIDFrom = BitAND($iwParam, 0xFFFF)
	Local $iCode = BitShift($iwParam, 16)
	;GUICtrlSetData($Label, '')
	Switch $hWnd
		Case $hForm
			Switch $iIDFrom
				Case $hEdit
					Switch $iCode
						Case $EN_CHANGE
							$j += 1
							GUICtrlSetData($Label, $j & '-' & GUICtrlRead($hEdit))
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
madmasles [?]
А так совсем просто:
Спасибо, но.
Это что-то вроде камуфляжа
Я сейчас именно так и делаю.
Параллельно с WM_COMMAND выполняю то,что она должна делать.
Именно от этого хотелось бы избавиться для упрощения кода.


Не знаю, правильно ли так, но работает:
Для одного элемента вроде работает,но стоит поставить 2-й Edit.
Он при просто перенесении курсора срабатывае на потерю фокуса
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Поскольку других решений нет, остановился на варианте
с использованием скрытого элемента-дублера.
Код:
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiEdit.au3>

$hForm = GUICreate('Test',250, 350)
GUISetBkColor(0xECE9D8)

$hEdit=GUICtrlCreateEdit ( "", 5, 10, 240, 300)
$hDoubler=GUICtrlCreateInput ( "", 5, 5, 5, 5)
GUICtrlSetState(-1, $GUI_HIDE)

$ButSet=GUICtrlCreateButton("Set",10,320, 40, 25)
$ButInsert=GUICtrlCreateButton("Insert",50, 320, 40, 25)
$Label=GUICtrlCreateLabel("",100, 320, 140, 25,0x1000)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUISetState()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $ButSet
            GUICtrlSetData($hEdit,"  Set Text")
			GUICtrlSetData($hDoubler,"*")
		Case $ButInsert
            GUICtrlSetData($hEdit," Append Text", 1)
    EndSwitch
WEnd

Func WM_COMMAND($hWnd, $imsg, $iwParam, $ilParam) 
    Local $hWndFrom = $ilParam
    Local $iIDFrom = BitAND($iwParam, 0xFFFF)
    Local $iCode = BitShift($iwParam, 16)
    GUICtrlSetData($label,"")
    Switch $hWnd
        Case $hForm
            Switch $iIDFrom
                Case $hEdit, $hDoubler
                    Switch $iCode
                        Case $EN_CHANGE
                            $sText=GUICtrlRead($hEdit)
							GUICtrlSetData($Label, $sText)
                    EndSwitch
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG 
EndFunc  ;==>WM_COMMAND
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
:shok:

Зачем нужно мутить такую жуть? Да, EN_CHANGE приходит только, когда текст изменяется пользователем (с клавиатуры), но это же ваш собственный код. Сам вызов GUICtrlSetData() уже свидетельствует об изменении текста. Зачем дополнительно создавать еще один элемент?

Код:
...

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $ButTest1
			GUICtrlSetData($hEdit, "  Set Text")
			_Change()
	EndSwitch
WEnd

Func _Change()
	GUICtrlSetData($Label, " $hEdit Changed")
EndFunc   ;==>_Change

Func WM_COMMAND($hWnd, $imsg, $iwParam, $ilParam)
	Local $hWndFrom = $ilParam
	Local $iIDFrom = BitAND($iwParam, 0xFFFF)
	Local $iCode = BitShift($iwParam, 16)
	GUICtrlSetData($Label, "")
	Switch $hWnd
		Case $hForm
			Switch $iIDFrom
				Case $hEdit
					Switch $iCode
						Case $EN_CHANGE
							_Change()
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND


В крайнем случае, если сообщение не приходит, то его всегда можно послать. :smile:

Код:
...

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $ButTest1
			GUICtrlSetData($hEdit, "  Set Text")
			_SendMessage($hForm, $WM_COMMAND, _WinAPI_MakeLong($hEdit, $EN_CHANGE), 0)
	EndSwitch
WEnd

Func WM_COMMAND($hWnd, $imsg, $iwParam, $ilParam)
	Local $hWndFrom = $ilParam
	Local $iIDFrom = BitAND($iwParam, 0xFFFF)
	Local $iCode = BitShift($iwParam, 16)
	GUICtrlSetData($Label, "")
	Switch $hWnd
		Case $hForm
			Switch $iIDFrom
				Case $hEdit
					Switch $iCode
						Case $EN_CHANGE
							GUICtrlSetData($Label, " $hEdit Changed")
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Yashied [?]
В крайнем случае, если сообщение не приходит, то его всегда можно послать.
Огромное спасибо.
Именно это я и имел в виду (см. 1 пост)
gregaz [?]
Возможно вариантом будет высылка какого то сообщения эл-ту Edit
, но не получалось выполнение.
 

running-frag

why me?
Сообщения
441
Репутация
60
круто! :scratch:

только не понятно одно а именно WM_COMMAND ()

у меня два вопроса
первое что за отвечают входящие параметры? ($hWnd, $iMsg, $iwParam, $ilParam)? где можно найти описание этого?

второе зачем эти все свитчи? а нельзя сразу обратится к желаемому хэндлу?

ps: как работает функция я понял и нашёл хороший пример в хэлпе (на функции _GUICtrlEdit_Create() ), но вот два вопроса выше пока не понял
 
Верх