Что нового

Простой телефонный справочник

Автор
C

chaos-13

Новичок
Сообщения
34
Репутация
0
По тому, что функция StringRegExp имеет жёсткий формат чтения данных, это я уже понял. Т.к. абонента у которого несколько номеров, она не ищет. Эту проблему надо подумать, как решить, хотя таких абонентов в моём справочнике только один.
 

AZJIO

Меценат
Меценат
Сообщения
2,878
Репутация
1,194
chaos-13 [?]
а ещё и по клавише ENTER
http://www.autoitscript.com/forum/topic/139260-autoit-snippets/page-3#entry1022183
и кстати это есть в справке, там поиск работает, раздел ссылок, там горячие примеры.

ra4o
Глобальную горячую клавишу точно назначать не стоит, особенно Enter.

[?]
Т.к. абонента у которого несколько номеров, она не ищет
А могла бы искать, если автор бы это указал. На счёт чего не ищет я уже говорил, сделай тест, вместо импорта в массив этой же рег. выр. сделай удаление (замена на ничего), оставшееся от списка будет неформат.

На счёт жёсткости, удали 3 класса захвата имён, оставь один класс, добавь в него пробел, как в третьей группы которая захватывает отдел, вот и будет не жёсткий, хоть целыми абзацами туда пиши, всё захватит. Я то изначально делал под шаблон "тел фио отдел", а в таком шаблоне без жёсткости не получится, так как не понятно где заканчивается фио и начинается отдел.
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
AZJIO сказал(а):
... так как не понятно где заканчивается фио и начинается отдел.
Автор в первом сообщении написал
chaos-13 сказал(а):
... Есть файл xls с номерами телефонов компании.
Не понимаю, зачем нужно было переходить на txt файл. Когда считывать с xls было бы намного удобней.
Уже не важно в каком формате записаны ФИО и номера телефонов. Всё прекрасно ищется.
 

AZJIO

Меценат
Меценат
Сообщения
2,878
Репутация
1,194
edyapd [?]
Автор в первом сообщении написал
Я это видел после, но на момент написания скрипта эта инфа ускользнула (хотя и она не полноценна для начинания помощи). Я не любитель читать много букв на несколько абзацев, расшифровывая не нужные смыслы и историю развития проблемы. Пишешь формат файла списка, выкладываешь GUI как оно должно выглядеть, всё.


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

edyapd [?]
Не понимаю, зачем нужно было переходить на txt файл
Автор же написал что ради изучения в том числе? Эх, сам не читаешь, а других учишь



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

chaos-13
Ладно, на с Enter, с поправкой рег.выр. и с исправлением что иванов не попадает в список, цикл начат с 0, а не с 1. Лучше сразу самому учить, а то потом ето будет неподъёмно воспринимать готовое-сложное.
Код:
#include <Array.au3>
#include <GUIConstantsEx.au3>

; _________________________________
$sText = FileRead(@ScriptDir & '\phones.txt')
; $aRes=StringRegExp($sText, '(?m)^((?:8|\+7)\d{10})\h([А-яЁё]+?\h[А-яЁё]+?\h[А-яЁё]+?)\h([А-яЁё]+?)\r?$', 3)
; $aRes=StringRegExp($sText, '(?m)^([А-яЁё]+?\h+[А-яЁё]+?\h+[А-яЁё]+?)\h+(\d\d-\d\d-\d\d)\h+([А-яЁё\h]+?)\r?$', 3)
$aRes=StringRegExp($sText, '(?m)^([А-яЁё\h]+?)\h+(\d\d-\d\d-\d\d)\h+([А-яЁё\h]+?)\r?$', 3)
If @error Then ; Проверка ошибки ОБЯЗАТЕЛЬНА. Данная проверка для StringRegExp
	MsgBox(0, 'Пусто', 'Проблема с файлом')
Else
	$u = UBound($aRes)
	$u2 = $u / 3
	Local $aRes2D[$u2][3]
	$d = 0
	For $i = 0 To $u - 1 Step 3
		$aRes2D[$d][0] = $aRes[$i]
		$aRes2D[$d][1] = $aRes[$i + 1]
		$aRes2D[$d][2] = $aRes[$i + 2]
		$d += 1
	Next
EndIf
$sOut = ''
; _ArrayDisplay($aRes2D) ; функция для просмотра массива
; _________________________________

$hGui = GUICreate('Кто звонил???', 500, 250)

GUICtrlCreateLabel("Ном.тел.:",5, 24, 130, 17)
GUICtrlCreateLabel("Ф.И.О:", 140, 24, 210, 17)
GUICtrlCreateLabel("Отдел / Должность",360, 24, 130, 17)
$iTel = GUICtrlCreateInput('', 5, 44, 130, 22)
$iFIO = GUICtrlCreateInput('', 140, 44, 210, 22)
$iData = GUICtrlCreateInput('', 360, 44, 130, 22)

GUICtrlCreateLabel("Результат", 5, 74, 490, 107)
$iOut = GUICtrlCreateEdit('', 5, 94, 490, 90)

$iBtn = GUICtrlCreateButton('Поиск', 390, 200, 90, 28)

$iStatusBar = GUICtrlCreateLabel('В базе ' & $u2 & ' телефонов', 5, 250 - 20, 495, 17)

$iDummy = GUICtrlCreateDummy()
Local $aAccelKeys[1][2] = [["{ENTER}", $iDummy]]
GUISetAccelerators($aAccelKeys)

GUISetState()

While 1
	Switch GUIGetMsg()
		Case $iBtn
			_Search()
		Case $iDummy
			Switch ControlGetFocus($hGui)
				Case 'Edit1', 'Edit2', 'Edit3'
					_Search()
			EndSwitch
		Case -3
			Exit
	EndSwitch
WEnd

Func _Search()
	$sTel = GUICtrlRead($iTel)
	$sFIO = GUICtrlRead($iFIO)
	$sData = GUICtrlRead($iData)
	GUICtrlSetData($iStatusBar, 'Этап 1')
	Switch True
		Case $sTel
			$col = 1
			$sSearch = $sTel
		Case $sFIO
			$col = 0
			$sSearch = $sFIO
		Case $sData
			$col = 2
			$sSearch = $sData
		Case Else
			MsgBox(0, 'Пусто', 'Пусто')
			Return
	EndSwitch
	$iCount = 0
	For $i = 0 To $u2 - 1
		If StringInStr($aRes2D[$i][$col], $sSearch) Then
			$sOut &= $aRes2D[$i][0] & ' ' & $aRes2D[$i][1] & ' ' & $aRes2D[$i][2] & @CRLF
			$iCount += 1
		EndIf
	Next
	If $sOut Then
		GUICtrlSetData($iOut, $sOut)
		GUICtrlSetData($iStatusBar, 'Найдено ' & $iCount)
		$sOut = ''
	Else
		GUICtrlSetData($iOut, '')
		GUICtrlSetData($iStatusBar, 'Не найдено')
	EndIf
EndFunc   ;==>_Example
 
Автор
C

chaos-13

Новичок
Сообщения
34
Репутация
0
А чем плох такой вариант с использованием клавиши Enter? Привожу фрагмент кода.
Код:
................................................................................................. 
While 1
    Switch GUIGetMsg()
	    Case HotKeySet('{ENTER}', 'button')
        Case $iBtn
            $sTel = GUICtrlRead($iTel)
            $sFIO = GUICtrlRead($iFIO)
            $sData = GUICtrlRead($iData)
......................................................................
......................................................................
Func button()
   ControlClick("Кто звонил???", '', $iBtn)
   EndFunc



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

edyapd, с xls я также попробую сделать, для сравнения.
 

AZJIO

Меценат
Меценат
Сообщения
2,878
Репутация
1,194
chaos-13 [?]
А чем плох такой вариант с использованием клавиши Enter?
GUIGetMsg() возвращает события и проверяет соответствует ли оно одному из указанных элементов GUI. То есть после Case должно быть указано событие с которым оно сравнивается (читаем справку). HotKeySet возвращает не события, а результат работы функции, успех или не успех выполнения. То есть у тебя 10 раз в секунду попытка зарегистрировать горячую клавиши Enter. Я бы сказал код из серии всё смешалось в куче.
2. Что такое глобальная горячая клавиша? Представь ты запустил программу и потом начал печатать на форуме сообщения, и при каждом нажатии Enter какая то скрытая программа выполняет там какие то свои дела. Это в лучшем случае, а в худшем, у тебя на форуме при нажатии Enter клавиша вообще не далает перенос, потому что нажатие на Enter ловит какая-то свёрнутая программа.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Если вариант с поиском в текстовом файле , возможно проще использовать функцию StringInStr ?
В этом случае можно оставить один InputBox для ввода любой информации для поиска (Фамилия, телефон, должность), так-же будет искать по не полной фамилии , телефону итп
 
Автор
C

chaos-13

Новичок
Сообщения
34
Репутация
0
AZJIO, спасибо, уловил суть.


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

ra4o, изучу и этот вопрос. Возможно проще.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
мой вариант . смотри http://autoit-script.ru/index.php?topic=19225.msg115667#msg115667
1.Живой поиск по базе - вводим в строку поиска значение (буквы, символы или цифры) в List получаем результат
2.Добавлять в базу новые записи - для этого три поля ввода внизу окна
3. Удалять из базы-выделяем мышкой строку, жмем нужную кнопку
4.Редактировать записи в окне после поиска - в базе тоже будут изменения.
Это не окончательная программа. Просто пример.
 

Вложения

  • BT.jpg
    BT.jpg
    59.1 КБ · Просмотры: 27
Автор
C

chaos-13

Новичок
Сообщения
34
Репутация
0
joiner, спасибо, посмотрю ваш вариант интересный)
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
AZJIO,
красиво и вовремя, как раз понадобилось сделать обработку нажатия ENTER в поле типа Input.
Но непонятно.
Почему объявляются поля как
Код:
$iTel = GUICtrlCreateInput('', 5, 44, 130, 22)
$iFIO = GUICtrlCreateInput('', 140, 44, 210, 22)
$iData = GUICtrlCreateInput('', 360, 44, 130, 22)


а их проверка идёт как
Код:
Switch ControlGetFocus($hGui)
                Case 'Edit1', 'Edit2', 'Edit3'

:scratch:


joiner,
тоже интересно, тоже актуально, тоже есть вопрос.
Как закрепить вертикальный размер нижней области GUI, чтобы при расширении всего GUI происходил не пропорциональный сдвиг всех-всех элементов, а поля Input и кнопки оставались бы так же сгруппированы, а расширение по вертикали происходило бы за счет увеличения размера списка?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
а это я не знаю :smile:
я собрал этот пример из своего кода по работе с базой принтеров (уже писал где-то). и мне так вспоминается, что стили окна были добавлены для эксперимента, а может для слабовидящих ремонтников нашей конторы..в общем, прогу делал для узкого использования и в визуальные тонкости не вникал. насколько я знаю, никто из "моих" пользователей изменением размеров окна не пользовался :smile:
возможно, стоит использовать WM_SIZING
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
C2H5OH [?]
расширение по вертикали происходило бы за счет увеличения размера списка
Для внутренних элементов есть функция GUICtrlSetResizing(), определяющая привязку элементов при изменении размеров окна
Код:
...
Global $Form1 = GUICreate("Form1", 578, 377, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP))
Global $find = GUICtrlCreateInput("", 16, 8, 545, 21)
GUICtrlSetResizing(-1, 2 + 4 + 32 + 512)
__GUICtrlEdit_SetCueBanner($find, 'Поиск')
Global $ListView1 = GUICtrlCreateListView("", 16, 32, 546, 238, BitOR($LVS_EDITLABELS, $LVS_SINGLESEL, $LVS_SHOWSELALWAYS), BitOR($LVS_EX_INFOTIP, $LVS_EX_GRIDLINES, $LVS_EX_DOUBLEBUFFER, $LVS_EX_FULLROWSELECT))
GUICtrlSetResizing(-1, 2 + 4 + 32 + 64)
_GUICtrlListView_InsertColumn($ListView1, 0, 'Результаты поиска', 546)
$Input2 = GUICtrlCreateInput("", 16, 280, 265, 21)
GUICtrlSetResizing(-1, 2 + 64 + 512)
__GUICtrlEdit_SetCueBanner($Input2, 'Телефон')
$Input3 = GUICtrlCreateInput("", 16, 312, 545, 21)
GUICtrlSetResizing(-1, 2 + 4 + 64 + 512)
__GUICtrlEdit_SetCueBanner($Input3, 'ФИО')
$Input4 = GUICtrlCreateInput("", 16, 344, 457, 21)
__GUICtrlEdit_SetCueBanner($Input4, 'Отдел')
GUICtrlSetResizing(-1, 2 + 64 + 512)
Local $write = GUICtrlCreateButton("Записать", 488, 343, 75, 21)
GUICtrlSetResizing(-1, 4 + 64 + 768)
Local $dell = GUICtrlCreateButton("Удалить", 488, 275, 75, 21)
GUICtrlSetResizing(-1, 4 + 64 + 768)
ControlFocus($Form1, '', $ListView1)
GUISetState(@SW_SHOW)
...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
joiner,
ИМХО, лучше использовать
Код:
;~ ...
GUICtrlSetState($ListView1, $GUI_FOCUS)
;~ ControlFocus($Form1, '', $ListView1)
;~ ...
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
madmasles
точно!
почему тогда не заметил? писал на работе, в короткие перерывы. очевидного не заметил :smile:
ну в свете двух последних поправок(и одной моей) получилось так
Код:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <File.au3>
Global $BaseArray, $selectdell = -1, $selectedit = -1, $point = 0, $flagfind = 0, $list, $selectfind = '', $dellstring = '', $textedit = ''
Global $DB = @ScriptDir & '\Base.txt'
Global $Form1 = GUICreate("Form1", 578, 377, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP))
Global $find = GUICtrlCreateInput("", 16, 8, 545, 21)
GUICtrlSetResizing(-1, 2 + 4 + 32 + 512)
__GUICtrlEdit_SetCueBanner($find, 'Поиск')
Global $ListView1 = GUICtrlCreateListView("", 16, 32, 546, 238, BitOR($LVS_EDITLABELS, $LVS_SINGLESEL, $LVS_SHOWSELALWAYS), BitOR($LVS_EX_INFOTIP, $LVS_EX_GRIDLINES, $LVS_EX_DOUBLEBUFFER, $LVS_EX_FULLROWSELECT))
GUICtrlSetResizing(-1, 2 + 4 + 32 + 64)
_GUICtrlListView_InsertColumn($ListView1, 0, 'Результаты поиска', 546)
$Input2 = GUICtrlCreateInput("", 16, 280, 265, 21)
GUICtrlSetResizing(-1, 2 + 64 + 512)
__GUICtrlEdit_SetCueBanner($Input2, 'Телефон')
$Input3 = GUICtrlCreateInput("", 16, 312, 545, 21)
GUICtrlSetResizing(-1, 2 + 4 + 64 + 512)
__GUICtrlEdit_SetCueBanner($Input3, 'ФИО')
$Input4 = GUICtrlCreateInput("", 16, 344, 457, 21)
__GUICtrlEdit_SetCueBanner($Input4, 'Отдел')
GUICtrlSetResizing(-1, 2 + 64 + 512)
Local $write = GUICtrlCreateButton("Записать", 488, 343, 75, 21)
GUICtrlSetResizing(-1, 4 + 64 + 768)
Local $dell = GUICtrlCreateButton("Удалить", 488, 275, 75, 21)
GUICtrlSetResizing(-1, 4 + 64 + 768)
GUICtrlSetState($ListView1, $GUI_FOCUS)
GUISetState(@SW_SHOW)
$BaseArray = FileReadToArray($DB)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')

While 1
	If $point = 1 Then
		$point = 0
		Local $edit = StringStripWS(_GUICtrlListView_GetItemText($ListView1, $selectedit), 3)
		If $edit <> $textedit Then
			For $i = 0 To UBound($BaseArray) - 1
				If $BaseArray[$i] = $textedit Then
					$BaseArray[$i] = $edit
					_FileWriteToLine($DB, $i + 1, $edit, 1)
					_GUICtrlListView_SetItemText($ListView1, $selectedit, StringStripWS($edit, 3))
					ExitLoop
				EndIf
			Next
		Else
			_GUICtrlListView_SetItemText($ListView1, $selectedit, StringStripWS($textedit, 3))
		EndIf
	EndIf
	If $flagfind = 1 Then
		If IsArray($BaseArray) Then
			$selectfind = StringStripWS(GUICtrlRead($find), 3)
			If StringLen($selectfind) >= 1 Then
				_find()
			ElseIf $selectfind = '' Then
				GUICtrlSetData($find, '')
			EndIf
		EndIf
		$flagfind = 0
	EndIf
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $dell
			_GUICtrlListView_DeleteItem($ListView1, $selectdell)
			For $i = 0 To UBound($BaseArray) - 1
				If $dellstring = $BaseArray[$i] Then
					_FileWriteToLine($DB, $i + 1, '', 1)
					_ArrayDelete($BaseArray, $i)
					ExitLoop
				EndIf
			Next
		Case $write
			Local $tel = StringStripWS(GUICtrlRead($Input2), 3)
			Local $name = StringStripWS(GUICtrlRead($Input3), 3)
			Local $dep = StringStripWS(GUICtrlRead($Input4), 3)
			If $tel <> '' Or $name <> '' Or $dep <> '' Then
				FileWriteLine($DB, $name & ' ' & $tel & ' ' & $dep)
				_ArrayAdd($BaseArray, $name & ' ' & $tel & ' ' & $dep)
			EndIf
	EndSwitch
WEnd

Func _find()
	_GUICtrlListView_DeleteAllItems($ListView1)
	_GUICtrlListView_DeleteColumn($ListView1, 0)
	_GUICtrlListView_InsertColumn($ListView1, 0, 'Результаты поиска', 546)
	$flagfind = 0
	For $i = 0 To UBound($BaseArray) - 1
		If $flagfind = 1 Then ExitLoop
		If StringInStr($BaseArray[$i], $selectfind) Then
			If _GUICtrlListView_FindText($ListView1, $BaseArray[$i], -1, False) = -1 Then GUICtrlCreateListViewItem($BaseArray[$i], $ListView1)
		EndIf
	Next
EndFunc   ;==>_find

Func WM_COMMAND($hWnd, $imsg, $iwParam, $ilParam)
	Local $nNotifyCode, $nID
	$nNotifyCode = BitShift($iwParam, 16)
	$nID = BitAND($iwParam, 0xFFFF)
	Switch $hWnd
		Case $Form1
			Switch $nNotifyCode
				Case $EN_CHANGE
					Switch $nID
						Case $find
							$flagfind = 1
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

Func WM_NOTIFY($hWnd, $imsg, $wParam, $lParam)
	#forceref $hWnd, $iMsg, $wParam
	Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo
	$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
	$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
	$iCode = DllStructGetData($tNMHDR, "Code")
	Switch $iIDFrom
		Case $ListView1
			Switch $iCode
				Case $LVN_BEGINLABELEDITA, $LVN_BEGINLABELEDITW
					$tInfo = DllStructCreate($tagNMLVDISPINFO, $lParam)
					Return False
				Case $LVN_ENDLABELEDITA, $LVN_ENDLABELEDITW
					$tInfo = DllStructCreate($tagNMLVDISPINFO, $lParam)
					Local $tBuffer = DllStructCreate("char Text[" & DllStructGetData($tInfo, "TextMax") & "]", DllStructGetData($tInfo, "Text"))
					If StringLen(DllStructGetData($tBuffer, "Text")) Then
						$point = 1
						Return True
					EndIf
				Case $NM_RCLICK
					$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
					$selectedit = DllStructGetData($tInfo, "Index")
					$textedit = StringStripWS(_GUICtrlListView_GetItemText($ListView1, $selectedit), 3)
					_GUICtrlListView_EditLabel($ListView1, $selectedit)
				Case $NM_CLICK
					$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
					$selectdell = DllStructGetData($tInfo, "Index")
					$dellstring = _GUICtrlListView_GetItemText($ListView1, $selectdell)
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func __GUICtrlEdit_GetCueBanner($i_ID)
	Local Const $__EM_GETCUEBANNER = 0x1502
	Local $t_Text = DllStructCreate('wchar[4096]')
	If GUICtrlSendMsg($i_ID, $__EM_GETCUEBANNER, DllStructGetPtr($t_Text), 4096) <> 1 Then Return SetError(-1, 0, '')
	Return DllStructGetData($t_Text, 1)
EndFunc   ;==>__GUICtrlEdit_GetCueBanner

Func __GUICtrlEdit_SetCueBanner($i_ID, $s_Text)
	Local Const $__EM_SETCUEBANNER = 0x1501
	Return GUICtrlSendMsg($i_ID, $__EM_SETCUEBANNER, 0, String($s_Text))
EndFunc   ;==>__GUICtrlEdit_SetCueBanner
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
joiner,
Тогда еще несколько поправок, ИМХО :smile:

Лишние #include
Код:
;~ #include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
;~ #include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <File.au3>
;~ #include <Array.au3>

Можно убрать
Код:
$list = GUICtrlGetHandle($ListView1)
А в функции WM_NOTIFY убрать $hWndFrom и использовать $iIDFrom и $ListView1.

Если Вы используете GuiListView.au3, то лучше использовать _GUICtrlListView_AddItem($ListView1, $BaseArray[$i]), чем GUICtrlCreateListViewItem($BaseArray[$i], $ListView1).

PS
Есть еще пара, но уже лень... ;)
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
некоторые библиотеки добавлены KODA. я использую его для "накидывания" элементов. отсюда "лишнее"

насчет последнего, то да, если уж использовать библиотеку, то логично и использовать все из нее. но... не стал. где то видел такое же смешанное использование. сам так делал.
по поводу дополнительных поправок, то да. их можно делать и делать... мне тоже задумываться не хочется, так как приводил код как пример(идею), а не для того, чтобы использовать его "один в один". просто идея для автора темы... :smile:



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

сделал поправку еще раз :smile: (смотреть предыдущий пример)
madmasles , спасибо
 

AZJIO

Меценат
Меценат
Сообщения
2,878
Репутация
1,194
C2H5OH [?]
Но непонятно.Почему объявляются поля как .... а их проверка идёт как ....
Вроде бы funkey на официальном сайте выкладывал скрипт, где используется id. Он просто из id получает класс, а в остальном всё тоже самое. Мне показалось если у тебя 1-3 поля ввода, то как-то не экономично прицеплять к скрипту UDF-WinAPI и вставлять функции усложняя. Но полезно если эти элементы генерируются в случайном порядке. У меня этого случая не предвиделось в моём понимании и я даже не сохранил ссылку, а найти не смог.

На счёт изменения размера, кроме GUICtrlSetResizing для RichEdit есть ещё WinAPI перемещения, а поведение можно определить формулой. У меня в коллекции примеров есть упрощенные варианты именно для RichEdit.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
если разговор про горячую клавишу, то я делал так:
высылал флаг, что элемент получил фокус.
тогда в основном цикле опроса Gui вставил проверку значения флага фокуса
примерно такой код
Код:
#include <EditConstants.au3>
#include <Misc.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global $click = 0, $click1 = 0, $hDLL = DllOpen("user32.dll")

$Form1 = GUICreate("Form1", 282, 93, 192, 124)
Global $Input1 = GUICtrlCreateInput("", 16, 16, 121, 21)
Global $Input2 = GUICtrlCreateInput("", 16, 56, 121, 21)
$Button1 = GUICtrlCreateButton("Button1", 168, 16, 75, 25)
$Button2 = GUICtrlCreateButton("Button2", 168, 56, 75, 25)
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
GUICtrlSetState($Button1, $GUI_FOCUS)

While 1
	If $click = 1 Then
		If _IsPressed('0D', $hDLL) Then
			ControlClick($Form1, '', $Button1)
			$click = 0
		EndIf
	ElseIf $click1 = 1 Then
		If _IsPressed('0D', $hDLL) Then
			ControlClick($Form1, '', $Button2)
			$click1 = 0
		EndIf
	EndIf
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			MsgBox(0, '', 'Enter для Input1, нажата кнопка Button1')
		Case $Button2
			MsgBox(0, '', 'Enter для Input2, нажата кнопка Button2')
	EndSwitch
WEnd

Func WM_COMMAND($hWnd, $imsg, $iwParam, $ilParam)
	Local $nNotifyCode, $nID
	$nNotifyCode = BitShift($iwParam, 16)
	$nID = BitAND($iwParam, 0xFFFF)
	Switch $hWnd
		Case $Form1
			Switch $nNotifyCode
				Case $EN_SETFOCUS
					Switch $nID
						Case $Input1
							$click = 1
							$click1 = 0
						Case $Input2
							$click = 0
							$click1 = 1
					EndSwitch
				Case $EN_KILLFOCUS
					Switch $nID
						Case $Input1
							$click = 0
						Case $Input2
							$click1 = 0
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

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

alex33

Скриптер
Сообщения
1,457
Репутация
186
Ещё немного про enter :smile:
Если нужной кнопки установить состояние
Код:
GUICtrlSetState(-1, $GUI_DEFBUTTON)

То при нажатии enter сработает эта кнопка.

Ещё можно использовать функцию GUISetAccelerators, например:
Код:
$SendBtn1 = GUICtrlCreateButton("Отправить", 20, 160, 70, 30)
Local $aKey[1][2] = [["{enter}", $SendBtn1]]
GUISetAccelerators($aKey)
 
Верх