Что нового

[Элементы GUI] “Живой поиск” по содержимому папки

Tauhid

Новичок
Сообщения
3
Репутация
0
Версия AutoIt: 3.3.14.2

Описание: Здравствуйте. По большей части интересует "Живой поиск". Все необходимые функции программы реализованы, но вырваны кусками из просторов интернета/форума/справки. Но так как к программированию отношение имею, поскольку постольку, код требует оптимизации и упрощения, возможно альтернативное решение.
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
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 

Dima1337

Осваивающий
Сообщения
186
Репутация
24
Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <ComboConstants.au3>
#include <File.au3>
#include <Array.au3>

$FolderOsmotr = @ScriptDir & "\Осмотры\"
$FolderShablon = @ScriptDir & "\Шаблоны\"
$program = "notepad.exe" ;Через что открыть. Полный путь до word.exe

if Not FileExists ($FolderOsmotr) Then
	DirCreate ($FolderOsmotr)
EndIf
if Not FileExists ($FolderShablon) Then
	DirCreate ($FolderShablon)
EndIf

$MainForm = GUICreate("Хрономикон 1.0.3", 310, 110)
$InputName = GUICtrlCreateInput ("Фамилия Имя Отчество", 10, 10, 290, 20)
$ComboboxShablon = GUICtrlCreateCombo ("Создать новый документ", 10, 40, 290, 150, $CBS_DROPDOWNLIST)
$ButtonOpen = GUICtrlCreateButton("Открыть", 105, 70, 100, 30)
GUISetState(@SW_SHOW)

$input = "Фамилия Имя Отчество"

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			_exit()
		Case $ButtonOpen
			If GUICtrlRead($ComboboxShablon) = "Создать новый документ" Then
				RunWait($program & ' ' & $FolderShablon & GUICtrlRead($InputName) & '.docx', '', @SW_SHOW)
				;MsgBox(0,'',$FolderShablon & GUICtrlRead($InputName) & '.txt')
			Else
				RunWait($program & ' ' & $FolderShablon & GUICtrlRead($ComboboxShablon))
			EndIf

	EndSwitch
	ComboBox()
WEnd

Func ComboBox()
    If GUICtrlRead($InputName) <> $input Then
		$find = 0
        $FileList=_FileListToArray($FolderShablon)
        For $i = 1 To $FileList[0]
            If StringRight($FileList[$i], 4) = 'docx' Then
                If StringInStr($FileList[$i],GUICtrlRead($InputName),2) Then
                    GUICtrlSetData($ComboboxShablon,$FileList[$i])
					$find = 1
                Else
					If $find = 0 Then
						GUICtrlDelete($ComboboxShablon)
						$ComboboxShablon = GUICtrlCreateCombo ("Создать новый документ", 10, 40, 290, 150, $CBS_DROPDOWNLIST)
					EndIf
                EndIf
            EndIf
        Next
        $input = GUICtrlRead($InputName)
    EndIf
EndFunc

Func _exit()
	Exit
EndFunc

Не понял, зачем две папки? По умолчанию скрипт проводит поиск в Шаблоны, туда же создает новые.
 
A

Alofa

Гость
Код:
#include <GUIConstantsEx.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <File.au3>

Global $FolderOsmotr, $FolderShablon, $ShablonList, $MainForm, $InputName, $ComboboxShablon, $ButtonOpen
Global $sFileExtension = '.txt' ; Расширение файлов в папках

$FolderOsmotr = @ScriptDir & '\Осмотры\'
$FolderShablon = @ScriptDir & '\Шаблоны\'

If Not FileExists($FolderOsmotr) Then DirCreate($FolderOsmotr)
If Not FileExists($FolderShablon) Then DirCreate($FolderShablon)

$MainForm = GUICreate('Хрономикон 1.0.3', 310, 110)
$InputName = GUICtrlCreateInput('', 10, 10, 290, 20)
GUICtrlSendMsg(-1, $EM_SETCUEBANNER, 0, 'Фамилия Имя Отчество') ; Надпись будет исчезать при клике на элементе
$ComboboxShablon = GUICtrlCreateCombo('Открыть без шаблона', 10, 40, 290, 150, $CBS_DROPDOWNLIST)
GUICtrlSetState(-1, $GUI_FOCUS)
$ButtonOpen = GUICtrlCreateButton('Открыть', 105, 70, 100, 30)

$ShablonList = _FileListToArray($FolderShablon, '*' & $sFileExtension, 1)
If Not @error Then
	For $s = 1 To UBound($ShablonList) - 1
		GUICtrlSetData($ComboboxShablon, StringRegExpReplace($ShablonList[$s], '\.\w+', ''))
	Next
EndIf

GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $ButtonOpen
			Local $NameOne = GUICtrlRead($InputName)
			; Проверка на введения значения в InputName
			If Not StringRegExpReplace($NameOne, '\s+', '') Then
				MsgBox(262144 + 64, 'Ошибка!', 'Введите Фамилию Имя Отчество пациента!')
				GUICtrlSetData($InputName, '')
				ContinueLoop
			EndIf
			_FilesExecute($NameOne)
;			Exit
	EndSwitch
WEnd

Func _FilesExecute($sPatient)
	Local $hFile, $sTemplate = GUICtrlRead($ComboboxShablon)
	Local $sFileTemplate = $FolderShablon & $sTemplate & $sFileExtension
	Local $sFilePatient = $FolderOsmotr & $sPatient & $sFileExtension
	
	$sTemplate = ($sTemplate == 'Открыть без шаблона') ? False : ShellExecute($sFileTemplate)
	
	If Not FileExists($sFilePatient) Then
		If $sTemplate Then
			If Not FileCopy($sFileTemplate, $sFilePatient) Then $sFilePatient = False
		Else
			If Not FileClose(FileOpen($sFilePatient, 2)) Then $sFilePatient = False
		EndIf
	EndIf
	
	If $sFilePatient Then ShellExecute($sFilePatient)
EndFunc   ;==>_FilesExecute


OffTopic:
Ха... Только сегодня медкомиссию проходил :rofl:
 
Автор
T

Tauhid

Новичок
Сообщения
3
Репутация
0
Не понял, зачем две папки? По умолчанию скрипт проводит поиск в Шаблоны, туда же создает новые.

В папке "Осмотры" хранятся именные документы граждан, например "Иванов Иван Иванович.docx", а в папке "Шаблоны" документы вида Шаблон 1 Шаблон 2 Шаблон 3 и т д.
Весь смысл в поиске граждан по папке "Осмотры" и открытие соответствующих документов (документов всего в папке около 3 тысяч), но если гражданина нет в папке, то он создается на основе шаблона и сохраняется же в папку "Осмотры".

Alofa, а как на счет "Живого поиска"? :-[
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Tauhid [?]
для живого поиска лучше использовать два элемента
строка ввода имени
комбобокс или лист для выведения результата.
иначе в поле ввода будет попадать только первая фамилия, которая совпала. хотя можно и тут заморочиться и чего то добиться, но лучше использовать два элемента
Код:
#include <GUIConstantsEx.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <File.au3>
#include <WindowsConstants.au3>
Global $FolderOsmotr, $FolderShablon, $ShablonList, $MainForm, $InputName, $ComboboxShablon, $ButtonOpen, $fl,$tst
Global $sFileExtension = '.txt' ; Расширение файлов в папках

$FolderOsmotr = @ScriptDir & '\Осмотры\'
$FolderShablon = @ScriptDir & '\Шаблоны\'

If Not FileExists($FolderOsmotr) Then DirCreate($FolderOsmotr)
If Not FileExists($FolderShablon) Then DirCreate($FolderShablon)

$MainForm = GUICreate('Хрономикон 1.0.3', 310, 110)
$InputName = GUICtrlCreateInput('', 10, 10, 290, 20)
GUICtrlSendMsg(-1, $EM_SETCUEBANNER, 0, 'Фамилия Имя Отчество') ; Надпись будет исчезать при клике на элементе
$ComboboxShablon = GUICtrlCreateCombo('Открыть без шаблона', 10, 40, 290, 150, $CBS_DROPDOWNLIST)
GUICtrlSetState(-1, $GUI_FOCUS)
$ButtonOpen = GUICtrlCreateButton('Открыть', 105, 70, 100, 30)

$ShablonList = _FileListToArray($FolderShablon, '*' & $sFileExtension, 1)
If Not @error Then
    For $s = 1 To UBound($ShablonList) - 1
        GUICtrlSetData($ComboboxShablon, StringRegExpReplace($ShablonList[$s], '\.\w+', ''))
    Next
EndIf

GUISetState()
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
Local $selectfind
While 1
	    If $fl = 1 Then
        If IsArray($ShablonList) Then
            $selectfind = StringStripWS(GUICtrlRead($InputName), 3)
            If StringLen($selectfind) >= 1 Then
                _find($selectfind)
            ElseIf $selectfind = '' Then
                GUICtrlSetData($InputName, '')
            EndIf
        EndIf
        $fl = 0
    EndIf
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $ButtonOpen
            Local $NameOne = GUICtrlRead($InputName)
            ; Проверка на введения значения в InputName
            If Not StringRegExpReplace($NameOne, '\s+', '') Then
                MsgBox(262144 + 64, 'Ошибка!', 'Введите Фамилию Имя Отчество пациента!')
                GUICtrlSetData($InputName, '')
                ContinueLoop
            EndIf
            _FilesExecute($NameOne)
;           Exit
    EndSwitch
WEnd

Func _find($ST)
    $fl = 0
	Local $tms
    For $i = 0 To UBound($ShablonList) - 1
		$tms =  StringRegExpReplace($ShablonList[$i], '\.\w+', '')
        If $fl = 1 Then ExitLoop
        If StringInStr($ShablonList[$i], $ST) Then
            GUICtrlSetData($InputName, '')
			GUICtrlSetData($InputName, $tms)
			$tst = $tms
        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 $MainForm
            Switch $nNotifyCode
                Case $EN_CHANGE
                    Switch $nID
                        Case $InputName
                            $fl = 1
                    EndSwitch
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

Func _FilesExecute($sPatient)
    Local $hFile, $sTemplate = GUICtrlRead($ComboboxShablon)
    Local $sFileTemplate = $FolderShablon & $sTemplate & $sFileExtension
    Local $sFilePatient = $FolderOsmotr & $sPatient & $sFileExtension

    $sTemplate = ($sTemplate == 'Открыть без шаблона') ? False : ShellExecute($sFileTemplate)

    If Not FileExists($sFilePatient) Then
        If $sTemplate Then
            If Not FileCopy($sFileTemplate, $sFilePatient) Then $sFilePatient = False
        Else
            If Not FileClose(FileOpen($sFilePatient, 2)) Then $sFilePatient = False
        EndIf
    EndIf

    If $sFilePatient Then ShellExecute($sFilePatient)
EndFunc   ;==>_FilesExecute




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

Короче, что я имел ввиду. Во вложении пример поиска по базе.
 

Вложения

  • 123.zip
    2.4 КБ · Просмотры: 8
Верх