Версия AutoIt: 3.3.14.2
Описание: Здравствуйте. По большей части интересует "Живой поиск". Все необходимые функции программы реализованы, но вырваны кусками из просторов интернета/форума/справки. Но так как к программированию отношение имею, поскольку постольку, код требует оптимизации и упрощения, возможно альтернативное решение.
1. Вводим в поле Фамилию Имя Отчество (тут нам помогает «живой поиск»)
2. Выбираем документ из Комбобокса если необходимо
3. Если гражданин по указанным ФИО присутствует, то его документ открывается, также открывается и документ из комбобоксе, если выбран
4. Если гражданин отсутствует, то выбранный документ из комбобокса копируется в папку с гражданами и переименовывается согласно ФИО, с последующим открытием
Программа самостоятельно создает директории: Осмотры (для искомых граждан) Шаблоны (для исходных документов)
Большая часть кода это реализация «Живого поиска»
Примечания: Собственно сам код
Описание: Здравствуйте. По большей части интересует "Живой поиск". Все необходимые функции программы реализованы, но вырваны кусками из просторов интернета/форума/справки. Но так как к программированию отношение имею, поскольку постольку, код требует оптимизации и упрощения, возможно альтернативное решение.
1. Вводим в поле Фамилию Имя Отчество (тут нам помогает «живой поиск»)
2. Выбираем документ из Комбобокса если необходимо
3. Если гражданин по указанным ФИО присутствует, то его документ открывается, также открывается и документ из комбобоксе, если выбран
4. Если гражданин отсутствует, то выбранный документ из комбобокса копируется в папку с гражданами и переименовывается согласно ФИО, с последующим открытием
Программа самостоятельно создает директории: Осмотры (для искомых граждан) Шаблоны (для исходных документов)
Большая часть кода это реализация «Живого поиска»
Примечания: Собственно сам код
Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <ComboConstants.au3>
#Include <GuiListBox.au3>
#include <WinAPI.au3>
#include <File.au3>
#include <Word.au3>
$FolderOsmotr = @ScriptDir & "\Осмотры\"
$FolderShablon = @ScriptDir & "\Шаблоны\"
if Not FileExists ($FolderOsmotr) Then
DirCreate ($FolderOsmotr)
EndIf
if Not FileExists ($FolderShablon) Then
DirCreate ($FolderShablon)
EndIf
Local $MainForm, $hList, $InputName, $aSelected, $sChosen, $hUP, $hDOWN, $hENTER, $hESC
Local $sCurrInput = "", $aCurrSelected[2] = [-1, -1], $iCurrIndex = -1, $hListGUI = -1
$MainForm = GUICreate("Хрономикон 1.0.3", 310, 110)
$InputName = GUICtrlCreateInput ("Фамилия Имя Отчество", 10, 10, 290, 20) ; Создание $hList находится на 195 строке
$ComboboxShablon = GUICtrlCreateCombo ("Открыть без шаблона", 10, 40, 290, 150, $CBS_DROPDOWNLIST)
$ShablonList = _FileListToArray($FolderShablon, "*", 1)
For $s = 1 To UBound($ShablonList)-1
GUICtrlSetData($ComboboxShablon, $ShablonList[$s])
Next
$ButtonOpen = GUICtrlCreateButton("Открыть", 105, 70, 100, 30)
GUISetState(@SW_SHOW, $MainForm)
$hUP = GUICtrlCreateDummy()
$hDOWN = GUICtrlCreateDummy()
$hENTER = GUICtrlCreateDummy()
$hESC = GUICtrlCreateDummy()
Dim $AccelKeys[4][2] = [["{UP}", $hUP], ["{DOWN}", $hDOWN], ["{ENTER}", $hENTER], ["{ESC}", $hESC]]
GUISetAccelerators($AccelKeys)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $hESC
If $hListGUI <> -1 Then
GUIDelete($hListGUI)
$hListGUI = -1
Else
;ExitLoop
EndIf
Case $hUP
If $hListGUI <> -1 Then
$iCurrIndex -= 1
If $iCurrIndex < 0 Then
$iCurrIndex = 0
EndIf
_GUICtrlListBox_SetCurSel($hList, $iCurrIndex)
EndIf
Case $hDOWN
If $hListGUI <> -1 Then
$iCurrIndex += 1
If $iCurrIndex > _GUICtrlListBox_GetCount($hList) - 1 Then
$iCurrIndex = _GUICtrlListBox_GetCount($hList) - 1
EndIf
_GUICtrlListBox_SetCurSel($hList, $iCurrIndex)
EndIf
Case $hENTER
GUICtrlSetData($InputName, "")
If $hListGUI <> -1 And $iCurrIndex <> -1 Then
$sChosen = _GUICtrlListBox_GetText($hList, $iCurrIndex)
EndIf
Case $hList
$sChosen = GUICtrlRead($hList)
Case $ButtonOpen
$NameOne = GUICtrlRead($InputName)
$Name = StringReplace($NameOne, ".docx", "")
$ShablonOne = GUICtrlRead($ComboboxShablon)
$Shablon = StringReplace($ShablonOne, ".docx", "")
$NameTo = $FolderOsmotr & $Name & ".docx"
$ShablonTo = $FolderShablon & $ShablonOne
; Проверка на введения значения в InputName
If $Name = "" Then
MsgBox (0, "Ошибка!", "Введите Фамилию Имя Отчество пациента!")
Else
If FileExists ($NameTo) Then
; Проверка значения ComboboxShablon
if $ShablonOne = "Открыть без шаблона" Then
If Not WinExists($Name) Then
$Word = ObjCreate("Word.Application")
$Word.Visible = True
$Word.Documents.Open($NameTo)
Else
WinActivate($Name)
EndIf
Else
If Not WinExists($Name) Then
$Word = ObjCreate("Word.Application")
$Word.Visible = True
$Word.Documents.Open($NameTo)
EndIf
Sleep(5000)
If Not WinExists($Shablon) Then
$Word = ObjCreate("Word.Application")
$Word.Visible = True
$Word.Documents.Open($ShablonTo)
Else
WinActivate($Shablon)
EndIf
EndIf
Else
If $ShablonOne = "Открыть без шаблона" Then
MsgBox (0, "Ошибка!", "Пациент не найден! Выберите документа шаблона!")
Else
FileCopy ($ShablonTo, $FolderOsmotr)
FileMove ($FolderOsmotr & $ShablonOne, $NameTo)
$Word = ObjCreate("Word.Application")
$Word.Visible = True
$Word.Documents.Open($NameTo)
EndIf
EndIf
EndIf
EndSwitch
Sleep(10)
$aSelected = _GetSelectionPointers($InputName)
If GUICtrlRead($InputName) <> $sCurrInput Or $aSelected[1] <> $aCurrSelected[1] Then ; Input content or pointer are changed.
$sCurrInput = GUICtrlRead($InputName)
$aCurrSelected = $aSelected ; Get pointers of the string to replace.
$iCurrIndex = -1
If $hListGUI <> -1 Then ; List is visible.
GUIDelete($hListGUI)
$hListGUI = -1
EndIf
$hList = _PopupSelector($MainForm, $hListGUI, _CheckInputText($sCurrInput, $aCurrSelected)) ; ByRef $hListGUI, $aCurrSelected.
EndIf
If $sChosen <> "" Then
GUICtrlSendMsg($InputName, 0x00B1, $aCurrSelected[0], $aCurrSelected[1]) ; $EM_SETSEL.
_InsertText($InputName, $sChosen)
$sCurrInput = GUICtrlRead($InputName)
GUIDelete($hListGUI)
$hListGUI = -1
$sChosen = ""
EndIf
WEnd
Func _CheckInputText($sCurrInput, ByRef $aSelected)
Local $sPartialData = ""
$asKeyWords = _FileListToArray($FolderOsmotr, "*docx", 1)
If (IsArray($aSelected)) And ($aSelected[0] <= $aSelected[1]) Then
Local $aSplit = StringSplit(StringLeft($sCurrInput, $aSelected[0]), "0")
$aSelected[0] -= StringLen($aSplit[$aSplit[0]])
If $aSplit[$aSplit[0]] <> "" Then
For $A = 1 To $asKeyWords[0]
If StringLeft($asKeyWords[$A], StringLen($aSplit[$aSplit[0]])) = $aSplit[$aSplit[0]] And $asKeyWords[$A] <> $aSplit[$aSplit[0]] Then
$sPartialData &= $asKeyWords[$A] & "|"
EndIf
Next
EndIf
EndIf
Return $sPartialData
EndFunc
Func _PopupSelector($hMainGUI, ByRef $hListGUI, $sCurr_List)
Local $hList = -1
If $sCurr_List = "" Then
Return $hList
EndIf
$hListGUI = GUICreate("", 290, 80, 10, 30, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST, $WS_EX_MDICHILD), $hMainGUI)
$hList = GUICtrlCreateList("", 0, 0, 290, 80, BitOR(0x00100000, 0x00200000))
GUICtrlSetData($hList, $sCurr_List)
GUISetControlsVisible($hListGUI)
GUISetState(@SW_SHOWNOACTIVATE, $hListGUI)
Return $hList
EndFunc
Func _InsertText(ByRef $hEdit, $sString)
#cs
Description: Insert A Text In A Control.
Returns: Nothing
#ce
Local $aSelected = _GetSelectionPointers($hEdit)
GUICtrlSetData($hEdit, StringLeft(GUICtrlRead($hEdit), $aSelected[0]) & $sString & StringTrimLeft(GUICtrlRead($hEdit), $aSelected[1]))
Local $iCursorPlace = StringLen(StringLeft(GUICtrlRead($hEdit), $aSelected[0]) & $sString)
GUICtrlSendMsg($hEdit, 0x00B1, $iCursorPlace, $iCursorPlace) ; $EM_SETSEL.
EndFunc ;==>_InsertText
Func _GetSelectionPointers($hEdit)
Local $aReturn[2] = [0, 0]
Local $aSelected = GUICtrlRecvMsg($hEdit, 0x00B0) ; $EM_GETSEL.
If IsArray($aSelected) Then
$aReturn[0] = $aSelected[0]
$aReturn[1] = $aSelected[1]
EndIf
Return $aReturn
EndFunc ;==>_GetSelectionPointers
Func GUISetControlsVisible($hWnd) ; By Melba23.
Local $aControlGetPos = 0, $hCreateRect = 0, $hRectRgn = _WinAPI_CreateRectRgn(0, 0, 0, 0)
Local $iLastControlID = _WinAPI_GetDlgCtrlID(GUICtrlGetHandle(-1))
For $i = 3 To $iLastControlID
$aControlGetPos = ControlGetPos($hWnd, '', $i)
If IsArray($aControlGetPos) = 0 Then ContinueLoop
$hCreateRect = _WinAPI_CreateRectRgn($aControlGetPos[0], $aControlGetPos[1], $aControlGetPos[0] + $aControlGetPos[2], $aControlGetPos[1] + $aControlGetPos[3])
_WinAPI_CombineRgn($hRectRgn, $hCreateRect, $hRectRgn, 2)
_WinAPI_DeleteObject($hCreateRect)
Next
_WinAPI_SetWindowRgn($hWnd, $hRectRgn, True)
_WinAPI_DeleteObject($hRectRgn)
EndFunc ;==>GUISetControlsVisible