http://www.autoitscript.com/forum/topic/139260-autoit-snippets/page-3#entry1022183а ещё и по клавише ENTER
А могла бы искать, если автор бы это указал. На счёт чего не ищет я уже говорил, сделай тест, вместо импорта в массив этой же рег. выр. сделай удаление (замена на ничего), оставшееся от списка будет неформат.Т.к. абонента у которого несколько номеров, она не ищет
Автор в первом сообщении написалAZJIO сказал(а):... так как не понятно где заканчивается фио и начинается отдел.
Не понимаю, зачем нужно было переходить на txt файл. Когда считывать с xls было бы намного удобней.chaos-13 сказал(а):... Есть файл xls с номерами телефонов компании.
Я это видел после, но на момент написания скрипта эта инфа ускользнула (хотя и она не полноценна для начинания помощи). Я не любитель читать много букв на несколько абзацев, расшифровывая не нужные смыслы и историю развития проблемы. Пишешь формат файла списка, выкладываешь GUI как оно должно выглядеть, всё.Автор в первом сообщении написал
Автор же написал что ради изучения в том числе? Эх, сам не читаешь, а других учишьНе понимаю, зачем нужно было переходить на txt файл
#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
.................................................................................................
While 1
Switch GUIGetMsg()
Case HotKeySet('{ENTER}', 'button')
Case $iBtn
$sTel = GUICtrlRead($iTel)
$sFIO = GUICtrlRead($iFIO)
$sData = GUICtrlRead($iData)
......................................................................
......................................................................
Func button()
ControlClick("Кто звонил???", '', $iBtn)
EndFunc
GUIGetMsg() возвращает события и проверяет соответствует ли оно одному из указанных элементов GUI. То есть после Case должно быть указано событие с которым оно сравнивается (читаем справку). HotKeySet возвращает не события, а результат работы функции, успех или не успех выполнения. То есть у тебя 10 раз в секунду попытка зарегистрировать горячую клавиши Enter. Я бы сказал код из серии всё смешалось в куче.А чем плох такой вариант с использованием клавиши Enter?
$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'
Для внутренних элементов есть функция 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)
...
#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
;~ #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)
Вроде бы funkey на официальном сайте выкладывал скрипт, где используется id. Он просто из id получает класс, а в остальном всё тоже самое. Мне показалось если у тебя 1-3 поля ввода, то как-то не экономично прицеплять к скрипту UDF-WinAPI и вставлять функции усложняя. Но полезно если эти элементы генерируются в случайном порядке. У меня этого случая не предвиделось в моём понимании и я даже не сохранил ссылку, а найти не смог.Но непонятно.Почему объявляются поля как .... а их проверка идёт как ....
#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
GUICtrlSetState(-1, $GUI_DEFBUTTON)
$SendBtn1 = GUICtrlCreateButton("Отправить", 20, 160, 70, 30)
Local $aKey[1][2] = [["{enter}", $SendBtn1]]
GUISetAccelerators($aKey)