Что нового

помогите с реализацией привязки к полям word таблицы

koks0017

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

вкладываю программу и word файл помогите их привязать что бы на кнопке предварительный просмотр загружался word файл и были заполнены ячейки а нижняя имя фамилия (фамилия и инициалы).
и помогите сделать чтобы на календаре дата нельзя было переставить на меньшую чем день который программа берет по дате из системы



Код:
[code]#include <GUIConstants.au3> 
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>



	
	
GUICreate ("БЛАГОВЕСТ", 350, 290)

$filemenu = GUICtrlCreateMenu("Файл")
$fileitem = GUICtrlCreateMenuItem("Open", $filemenu)
$fileitem = GUICtrlCreateMenuItem("сохронить", $filemenu)
$helpmenu = GUICtrlCreateMenu("?")
$infoitem = GUICtrlCreateMenuItem("О программе", $helpmenu)
GUICtrlSetState(-1, $GUI_DEFBUTTON)

GUICtrlCreateLabel ("Дата выдачи полиса", 10,10)
GUICtrlCreateDate  ("Календарь", 10, 30)
GUICtrlCreateLabel ("Фамилия", 10,60)
GUICtrlCreateInput  ("", 10, 80,100)
GUICtrlCreateLabel ("Имя", 120,60,100)
GUICtrlCreateInput  ("", 120, 80)
GUICtrlCreateLabel ("Очество", 240,60)
GUICtrlCreateInput  ("", 240, 80 ,100)
GUICtrlCreateLabel ("Город", 10,110 ,100)
GUICtrlCreateCombo ("Москва", 10, 130)
GUICtrlSetData     (-1,"Зеленоград")
GUICtrlCreateLabel ("Улица", 10,160,100)
GUICtrlCreateInput  ("", 10, 180)
GUICtrlCreateLabel ("Дом", 120,160,50)
GUICtrlCreateInput  ("", 120, 180)
GUICtrlCreateLabel ("Корпус", 190,160, 50)
GUICtrlCreateInput  ("", 190, 180)
GUICtrlCreateLabel ("Квартира", 260,160, 50)
GUICtrlCreateInput  ("", 260, 180)
GUICtrlCreateButton("Предварительный просмотр", 10,220)
GUICtrlCreateButton("Печать", 170,220)
GUISetState ()
While 1
    $msg = GUIGetMsg()
    If $msg = $infoitem Then MsgBox(0, "О программе", "Жестовский Андрей Алексеевичь &")
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
Wend[/code]

кто может пожалуйста
 

madmasles

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


С уважением, ваш Модератор.





И оформите, пожалуйста, тему в соответствии с Правилами обязательного оформления тем.
 
Автор
K

koks0017

Новичок
Сообщения
53
Репутация
0
я новичок в autoit пожалуйста кто может помогите очень нужна эта прога
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Вот что-то получилось.
Код:
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <Word.au3>
$File_Input = ""

$Form1 = GUICreate("БЛАГОВЕСТ", 577, 307, 192, 114)
$Filemenu = GUICtrlCreateMenu("Файл")
$Fileitem1 = GUICtrlCreateMenuItem("Выбрать шаблон", $Filemenu)
$Helpmenu = GUICtrlCreateMenu("?")
$Infoitem = GUICtrlCreateMenuItem("О программе", $Helpmenu)
$Label1 = GUICtrlCreateLabel("Дата выдачи полиса", 8, 8, 109, 17)
$Date1 = GUICtrlCreateDate("Календарь", 8, 32, 113, 25)
$Input1 = GUICtrlCreateInput("", 8, 88, 217, 21)
$Input2 = GUICtrlCreateInput("", 240, 88, 121, 21)
$Input3 = GUICtrlCreateInput("", 376, 88, 193, 21)
$Label2 = GUICtrlCreateLabel("Фамилия", 8, 64, 53, 17)
$Label3 = GUICtrlCreateLabel("Имя", 240, 64, 26, 17)
$Label4 = GUICtrlCreateLabel("Отчество", 376, 64, 51, 17)
$Label5 = GUICtrlCreateLabel("Город", 8, 120, 34, 17)
$Combo1 = GUICtrlCreateCombo("Москва", 8, 144, 137, 25)
GUICtrlSetData(-1,"Зеленоград")
$Label6 = GUICtrlCreateLabel("Улица", 8, 176, 36, 17)
$Label7 = GUICtrlCreateLabel("Дом", 344, 176, 27, 17)
$Label8 = GUICtrlCreateLabel("Корпус", 424, 176, 40, 17)
$Label9 = GUICtrlCreateLabel("Квартира", 504, 176, 52, 17)
$Input4 = GUICtrlCreateInput("", 8, 200, 321, 21)
$Input5 = GUICtrlCreateInput("", 344, 200, 65, 21)
$Input6 = GUICtrlCreateInput("", 424, 200, 65, 21)
$Input7 = GUICtrlCreateInput("", 504, 200, 65, 21)
$Button1 = GUICtrlCreateButton("Предварительный просмотр", 8, 240, 201, 33)
$Button2 = GUICtrlCreateButton("Печать", 368, 240, 201, 33)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit		
		Case $Infoitem
			MsgBox(0, "О программе", "Жестовский Андрей Алексеевич")
		Case $Button1			
			$Data = GUICtrlRead ($Date1) ;дата			
			$Fio_1 = GUICtrlRead ($Input1);фамилия
			$Fio_2 = GUICtrlRead ($Input2);имя
			$Fio_3 = GUICtrlRead ($Input3);отчество
			$Adres1 = GUICtrlRead ($Combo1) ;город
			$Adres2 = GUICtrlRead ($Input4);улица
			$Adres3 = GUICtrlRead ($Input5);дом
			$Adres4 = GUICtrlRead ($Input6);корпус
			$Adres5 = GUICtrlRead ($Input7);квартира			
			WriteWord()
		Case $Fileitem1			
			$File_Input = FileOpenDialog("Выбрать шаблон для заполнения", @ScriptDir&"\", "Документ Word (*.doc)", 1)			
	EndSwitch
WEnd

Func WriteWord()
	If $File_Input = "" Then
		MsgBox(48, "Инфо", "Файл-шаблон не выбран")
	Return
	EndIf
	$FIO1 = $Fio_1&" "&$Fio_2&" "&$Fio_3 ;фамилия имя отчество
	$FIO2 = $Fio_1&" "&StringLeft($Fio_2, 1)&". "&StringLeft($Fio_3, 1)&"." ;фамилия инициалы
	$Adres = "г."&$Adres1&", ул."&$Adres2&", д."&$Adres3&", корп."&$Adres4&", кв."&$Adres5 ;адрес
	$File_XML = @ScriptDir & "\Благовест.xml" ;текстовый файл XML для редактирования
	$File_Output = @ScriptDir & "\Благовест.doc" ;отредактированный файл	
	
	$oWordApp = _WordCreate ("",1, 0)
	If @Error <> 0 Then
		MsgBox(48, "Инфо", "Не удалось создать объект Word")
		Return
	EndIf
	$oDoc = _WordDocOpen ($oWordApp, $File_Input);открываем шаблон
	_WordDocSaveAs ($oDoc, $File_XML, 11) ;и сохраняем в текстовый файл XML
	_WordDocClose ($oDoc)
	_WordQuit ($oWordApp)

	$file = FileOpen($File_XML, 128) ;открываем для чтения текстовый файл XML
	$text = FileRead($file) ;читаем текст в переменную $text
	FileClose($file) ;закрываем файл

	$file = FileOpen($File_XML, 130) ;открываем для записи текстовый файл XML
	$text = StringReplace($text, "«___»_____________201__г.", $Data) ;заменяем дату
	$text = StringReplace($text, "город, улица, дом, корпус, № квартиры", $Adres, 1) ;заменяем адрес
	$text = StringReplace($text, "Ф.И.О.", $FIO1, 1) ;заменяем 1-е Ф.И.О.
	$text = StringReplace($text, "Ф.И.О.", $FIO2, 1) ;заменяем 2-е Ф.И.О.
	FileWrite($file, $text) ;записываем в файл измененный текст
	FileClose($file)

	$oWordApp = _WordCreate ("", 1, 0)
	$oDoc = _WordDocOpen ($oWordApp, $File_XML) ;открываем текстовый файл XML
	_WordDocSaveAs ($oDoc, $File_Output) ;и сохраняем в формате DOC
	_WordDocClose ($oDoc)
	_WordQuit ($oWordApp)
	MsgBox(64, "Инфо", "Готово")
	ShellExecute($File_Output)
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
koks0017,
Мой вариант.
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <EditConstants.au3>
#include <ComboConstants.au3>
#include <Word.au3>

Opt('MustDeclareVars', 1)
Opt('TrayMenuMode', 1)

Global $sIni = @ScriptDir & '\polic\' & @MON & '_' & @YEAR & '.ini', $hGui, $nDate, $nNumber, $nFam, _
		$nName, $nSecName, $nHouse, $nNum, $nFlat, $nCity, $nStreet, $nStreetName, $nOK, $nPreview, _
		$nPrint, $nSave, $aInfo, $fNotSave

If Not FileExists(@ScriptDir & '\polic') Or Not StringInStr(FileGetAttrib(@ScriptDir & '\polic'), 'd') Then
	DirCreate(@ScriptDir & '\polic')
EndIf
$hGui = GUICreate('БЛАГОВЕСТ', 360, 250)
GUICtrlCreateLabel('Дата выдачи полиса', 100, 10, 160, 15, $SS_CENTER)
$nDate = GUICtrlCreateInput(_ToDayFormatRu(), 100, 25, 160, 20, BitOR($ES_CENTER, $ES_READONLY))
GUICtrlCreateLabel('Фамилия', 10, 55, 110, 15, $SS_CENTER)
GUICtrlCreateLabel('Имя', 125, 55, 110, 15, $SS_CENTER)
GUICtrlCreateLabel('Отчество', 240, 55, 110, 15, $SS_CENTER)
$nFam = GUICtrlCreateInput('', 10, 70, 110, 20)
$nName = GUICtrlCreateInput('', 125, 70, 110, 20)
$nSecName = GUICtrlCreateInput('', 240, 70, 110, 20)
$nStreetName = GUICtrlCreateInput('', 240, 115, 110, 20)
$nHouse = GUICtrlCreateInput('', 10, 160, 110, 20, $ES_CENTER)
$nNum = GUICtrlCreateInput('', 125, 160, 110, 20, $ES_CENTER)
$nFlat = GUICtrlCreateInput('', 240, 160, 110, 20, $ES_CENTER)
GUICtrlCreateLabel('А д р е с    р е г и с т р а ц и и', 10, 100, 340, 15, $SS_CENTER)
GUICtrlCreateLabel('Дом', 10, 145, 110, 15, $SS_CENTER)
GUICtrlCreateLabel('Корпус', 125, 145, 110, 15, $SS_CENTER)
GUICtrlCreateLabel('Квартира', 240, 145, 110, 15, $SS_CENTER)
$nCity = GUICtrlCreateCombo('', 10, 115, 110, 21, $CBS_DROPDOWNLIST)
GUICtrlSetData(-1, 'Москва|Зеленоград', 'Москва')
$nStreet = GUICtrlCreateCombo('', 125, 115, 110, 20)
GUICtrlSetData(-1, 'Проспект|Улица|Переулок|Проезд|Шоссе', 'Улица')
$nOK = GUICtrlCreateButton('Принять', 8, 200, 80, 30)
$nPreview = GUICtrlCreateButton('Просмотр', 96, 200, 80, 30)
$nPrint = GUICtrlCreateButton('Печать', 184, 200, 80, 30)
$nSave = GUICtrlCreateButton('Сохранить', 272, 200, 80, 30)
For $i = $nPreview To $nSave
	GUICtrlSetState($i, $GUI_DISABLE)
Next
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			If $fNotSave Then
				If MsgBox(36, 'БЛАГОВЕСТ', 'Имеются несохраненные данные.' & @LF & @LF & _
						@TAB & 'Сохранить их?') = 6 Then _Save($aInfo)
			EndIf
			DirRemove(@ScriptDir & '\template\_temp', 1)
			Exit
		Case $nOK
			$aInfo = _GetInfo()
			If @error Then
				MsgBox(16, 'Info', $aInfo, 0, $hGui)
				ContinueLoop
			EndIf
			GUISetState(@SW_DISABLE)
			_ReplaceWord($aInfo)
			GUISetState(@SW_ENABLE)
			For $i = $nPreview To $nSave
				GUICtrlSetState($i, $GUI_ENABLE)
			Next
			$fNotSave = True
		Case $nPreview
			_Preview()
		Case $nPrint
			GUISetState(@SW_DISABLE)
			_Print()
			GUISetState(@SW_ENABLE)
		Case $nSave
			_Save($aInfo)
			If Not @error Then
				$fNotSave = False
				GUICtrlSetState($nSave, $GUI_DISABLE)
			EndIf
	EndSwitch
WEnd

Func _Save($a_Array)
	Local $s_Value, $sDate = StringFormat(' %02d.%02d.%02d %02d:%02d:%02d', @MDAY, @MON, _
			StringRight(@YEAR, 2), @HOUR, @MIN, @SEC), $i_Res
	For $i = 1 To $a_Array[0] - 1
		$s_Value &= $a_Array[$i] & '|'
	Next
	$s_Value = StringTrimRight($s_Value, 1)
	$i_Res = IniWrite($sIni, 'Polis', $a_Array[4] & $sDate, $s_Value)
	If $i_Res Then
		$a_Array = 0
	EndIf
	Return SetError($i_Res - 1)
EndFunc   ;==>_Save

Func _Preview()
	Local $s_File = @ScriptDir & '\template\_temp\_temp.doc'
	If Not FileExists($s_File) Then Return
	ShellExecute($s_File)
EndFunc   ;==>_Preview

Func _Print($i_Copies = 2)
	Local $s_File = @ScriptDir & '\template\_temp\_temp.doc', $o_Word, $o_Doc, $i_Error
	If Not FileExists($s_File) Then Return
	$o_Word = _WordCreate($s_File, 0, 0)
	If @error Then Return SetError(1, 0, 0)
	$o_Doc = _WordDocGetCollection($o_Word, 0)
	If @error Then Return SetError(1, 0, 0)
	_WordDocPrint($o_Doc, 0, $i_Copies)
	$i_Error = @error
	_WordQuit($o_Word)
	Return SetError($i_Error)
EndFunc   ;==>_Print

Func _ReplaceWord($a_Replace)
	Local $a_Find[5] = [4, 'date_long', 'fio_long', 'address', 'fio_short'], _
			$s_Template = @ScriptDir & '\template\template.doc', _
			$s_File = @ScriptDir & '\template\_temp\_temp.doc', $o_Word, $o_Doc

	If Not FileCopy($s_Template, $s_File, 9) Then Return SetError(1)
	$o_Word = _WordCreate($s_File, 0, 0)
	If @error Then Return SetError(1, 0, 0)
	For $j = 1 To 1
		$o_Doc = _WordDocGetCollection($o_Word, 0)
		If @error Then ExitLoop
		For $i = 1 To $a_Find[0]
			_WordDocFindReplace($o_Doc, $a_Find[$i], $a_Replace[$i])
			If @error Then ExitLoop 2
		Next
	Next
	If @error Then
		_WordDocClose($o_Doc, 0)
		_WordQuit($o_Word)
		FileDelete($s_File)
		Return SetError(1)
	EndIf
	_WordDocSave($o_Doc)
	_WordQuit($o_Word)
	Return
EndFunc   ;==>_ReplaceWord

Func _GetInfo()
	Local $a_Replace[5] = [4], $s_FIO_Long, $s_Address, $s_FIO_Short, $s_Temp

	$s_FIO_Long = GUICtrlRead($nFam)
	If Not $s_FIO_Long Then Return SetError(1, 0, 'Не введена фамилия')
	$s_FIO_Long = StringStripWS($s_FIO_Long, 8)
	$s_FIO_Long = StringUpper(StringLeft($s_FIO_Long, 1)) & StringLower(StringTrimLeft($s_FIO_Long, 1))
	$s_FIO_Short = $s_FIO_Long
	For $i = $nName To $nSecName
		$s_Temp = GUICtrlRead($i)
		If Not $s_Temp Then Return SetError(1, 0, 'Не введены имя или отчество')
		$s_Temp = StringStripWS($s_Temp, 8)
		$s_FIO_Long &= ' ' & StringUpper(StringLeft($s_Temp, 1)) & StringLower(StringTrimLeft($s_Temp, 1))
		$s_FIO_Short &= ' ' & StringUpper(StringLeft($s_Temp, 1)) & '.'
	Next
	$s_Address = GUICtrlRead($nCity) & ', '
	$s_Temp = GUICtrlRead($nStreet)
	If Not $s_Temp Then Return SetError(1, 0, 'Не выбран тип улицы')
	$s_Temp = StringStripWS($s_Temp, 8)
	$s_Address &= StringLower($s_Temp) & ' '
	$s_Temp = GUICtrlRead($nStreetName)
	If Not $s_Temp Then Return SetError(1, 0, 'Не введено название улицы')
	$s_Temp = StringStripWS($s_Temp, 7)
	$s_Address &= StringUpper(StringLeft($s_Temp, 1)) & StringLower(StringTrimLeft($s_Temp, 1)) & ', '
	$s_Temp = GUICtrlRead($nHouse)
	If Not $s_Temp Then Return SetError(1, 0, 'Не введен номер дома')
	$s_Temp = StringStripWS($s_Temp, 8)
	$s_Address &= 'дом ' & $s_Temp & ', '
	$s_Temp = GUICtrlRead($nNum)
	If $s_Temp Then
		$s_Temp = StringStripWS($s_Temp, 8)
		$s_Address &= 'корпус ' & $s_Temp & ', '
	EndIf
	$s_Temp = GUICtrlRead($nFlat)
	If Not $s_Temp Then Return SetError(1, 0, 'Не введен номер квартиры')
	$s_Temp = StringStripWS($s_Temp, 8)
	$s_Address &= 'квартира ' & $s_Temp & '.'
	$a_Replace[1] = _ToDayFormatRu()
	$a_Replace[2] = $s_FIO_Long
	$a_Replace[3] = $s_Address
	$a_Replace[4] = StringReplace($s_FIO_Short, ' ', '', -1)
	Return SetError(0, 0, $a_Replace)
EndFunc   ;==>_GetInfo

Func _ToDayFormatRu()
	Local $a_Mon[13] = [12, 'января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', _
			'сентября', 'октября', 'ноября''декабря']

	Return StringFormat(Chr(171) & '%02d' & Chr(187) & ' %s %04d года', @MDAY, $a_Mon[@MON], @YEAR)
EndFunc   ;==>_ToDayFormatRu
 
Автор
K

koks0017

Новичок
Сообщения
53
Репутация
0
madmasles и Yuriy спасибо большое

madmasles а можно сделать чтобы в конце даты не было только фамилия и инициалы а в начале не показывался номер полиса только дата?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
koks0017 [?]
а можно сделать чтобы в конце даты не было только фамилия и инициалы а в начале не показывался номер полиса только дата?
Я поменял код и прикрепленный архив.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
koks0017,
Я немного поменял код.
ИМХО, еще можно сделать две вкладки. На одной заполнять новые полисы, на другой загружать из архива готовые.
 
Автор
K

koks0017

Новичок
Сообщения
53
Репутация
0
А где можно его посмотреть? В первом коде то же самое.
 
Автор
K

koks0017

Новичок
Сообщения
53
Репутация
0
про две вкладки идея очень хорошая. можешь реализовать?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
koks0017,
Тестируйте.
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <EditConstants.au3>
#include <ComboConstants.au3>
#include <Word.au3>
#include <TabConstants.au3>
#include <File.au3>
#include <WinAPIEx.au3>;Yashied, http://autoit-script.ru/index.php/topic,47.0.html

Opt('MustDeclareVars', 1)
Opt('TrayMenuMode', 1)

Global $sIniDir = @ScriptDir & '\polic', $sIni = $sIniDir & '\' & @YEAR & '\' & @MON & '.ini', _
		$hGui, $nCity, $nStreet, $aInfo, $fNotSave, $nTab, $iX, $vY = 95, $vStyle = -1, _
		$aInput[8] = [7, 'Фамилия', 'Имя', 'Отчество', 'Дом', 'Корпус', 'Квартира'], _
		$aButton[6] = [5, 'Принять', 'Просмотр', 'Печать', 'Сохранить', 'Сброс'], _
		$aCombo[4] = [3, 'Год', 'Месяц', 'Страхователь'], _
		$aInput_1[4] = [3, 'Дата полиса', 'ФИО страхователя', 'Адрес страхователя'], _
		$aButton_1[3] = [2, 'Просмотр', 'Печать'], $fYear, $sTitle = 'ООО СК «Благовест»', $sWordExt

If WinExists('{[/@$@\]}' & $sTitle) Then Exit
AutoItWinSetTitle('{[/@$@\]}' & $sTitle)

If Not FileExists($sIniDir & '\' & @YEAR) _
		Or Not StringInStr(FileGetAttrib($sIniDir & '\' & @YEAR), 'd') Then
	DirCreate($sIniDir & '\' & @YEAR)
EndIf

$hGui = GUICreate($sTitle, 360, 290)
$nTab = GUICtrlCreateTab(2, 15, 356, 273)
GUICtrlSetCursor(-1, 0)
GUICtrlCreateTabItem('Новый полис')
GUICtrlCreateInput(_ToDayFormatRu(), 100, 65, 160, 20, BitOR($ES_CENTER, $ES_READONLY))
GUICtrlCreateLabel('Дата выдачи полиса', 100, 50, 160, 15, $SS_CENTER)
GUICtrlCreateLabel('А д р е с    р е г и с т р а ц и и', 10, 140, 340, 15, $SS_CENTER)
For $i = $nTab + 2 To $nTab + 4
	GUICtrlSetBkColor($i, 0xFFFFFF)
Next
For $i = 1 To $aInput[0] - 1
	GUICtrlCreateLabel($aInput[$i], 10 + $iX * 115, $vY, 110, 15, $SS_CENTER)
	GUICtrlSetBkColor(-1, 0xFFFFFF)
	$aInput[$i] = GUICtrlCreateInput('', 10 + $iX * 115, $vY + 15, 110, 20, $vStyle)
	$iX += 1
	If $iX = 3 Then
		$iX = 0
		$vY += 90
		$vStyle = $ES_CENTER
		If Not $aInput[$aInput[0]] Then
			$aInput[$aInput[0]] = GUICtrlCreateInput('', 240, 155, 110, 20)
		EndIf
	EndIf
Next
$iX = 0
$vY = ''
$vStyle = ''
$nCity = GUICtrlCreateCombo('', 10, 155, 110, 21, $CBS_DROPDOWNLIST)
GUICtrlSetData(-1, 'Москва|Зеленоград', 'Москва')
$nStreet = GUICtrlCreateCombo('', 125, 155, 110, 20)
GUICtrlSetData(-1, 'Проспект|Улица|Переулок|Проезд|Шоссе', 'Улица')

For $i = 1 To $aButton[0]
	$aButton[$i] = GUICtrlCreateButton($aButton[$i], 10 + ($i - 1) * 70, 240, 60, 30)
	GUICtrlSetCursor(-1, 0)
Next
For $i = 2 To $aButton[0] - 1
	GUICtrlSetState($aButton[$i], $GUI_DISABLE)
Next
GUICtrlCreateTabItem('Архив полисов')
$iX = 75
$vY = 70
For $i = 1 To $aCombo[0]
	If $i > 2 Then
		$vY = 190
	EndIf
	GUICtrlCreateLabel($aCombo[$i], 10 + ($i - 1) * $iX, 50, $vY, 15, $SS_CENTER)
	GUICtrlSetBkColor(-1, 0xFFFFFF)
	$aCombo[$i] = GUICtrlCreateCombo('', 10 + ($i - 1) * $iX, 65, $vY, 20, $CBS_DROPDOWNLIST)
	GUICtrlSetState(-1, $GUI_DISABLE)
Next
GUICtrlSendMsg($aCombo[$aCombo[0]], $CB_SETDROPPEDWIDTH, 250, 0)
$iX = 0
$vY = ''
For $i = 1 To $aInput_1[0]
	GUICtrlCreateLabel($aInput_1[$i], 20, 100 + ($i - 1) * 40, 320, 15, $SS_CENTER)
	GUICtrlSetBkColor(-1, 0xFFFFFF)
	$aInput_1[$i] = GUICtrlCreateInput('', 20, 115 + ($i - 1) * 40, 320, 20, _
			BitOR($ES_CENTER, $ES_MULTILINE))
	GUICtrlSetFont($aInput_1[$i], 10)
	GUICtrlSetBkColor(-1, 0xFFFFFF)
Next
GUICtrlSetPos($aInput_1[$aInput_1[0]], -1, -1, -1, 40)

For $i = 1 To $aButton_1[0]
	$aButton_1[$i] = GUICtrlCreateButton($aButton_1[$i], 60 + ($i - 1) * 140, 246, 100, 30)
	GUICtrlSetState(-1, $GUI_DISABLE)
	GUICtrlSetCursor(-1, 0)
Next
GUICtrlCreateTabItem('')
GUISetState()

_WinAPI_EmptyWorkingSet()
While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			If $fNotSave Then
				If MsgBox(36, $sTitle, 'Имеются несохраненные данные.' & @LF & @LF & _
						@TAB & 'Сохранить их?', 0, $hGui) = 6 Then _Save($aInfo)
			EndIf
			DirRemove(@ScriptDir & '\template\_temp', 1)
			Exit
		Case $nTab
			$iX = GUICtrlSendMsg($nTab, $TCM_GETCURSEL, 0, 0)
			If $iX Then
				If Not $fYear Then
					$vY = _GetYearToCombo()
					If @error Then ContinueLoop
					GUICtrlSetData($aCombo[1], $vY)
					GUICtrlSetState($aCombo[1], $GUI_ENABLE)
					$fYear = True
					$vY = ''
				EndIf
			EndIf
			$iX = 0
		Case $aButton_1[1]
			Dim $vStyle[5] = [4]
			For $i = 1 To $aInput_1[0]
				$vY = 1
				$vStyle[$i] = GUICtrlRead($aInput_1[$i])
				If Not $vStyle[$i] Then ExitLoop
				$vY = 0
			Next
			If $vY Then
				$vStyle = 0
				ContinueLoop
			EndIf
			$vY = GUICtrlRead($aCombo[3])
			$vY = StringRegExpReplace($vY, '^(.*?)\h\d.*', '$1')
			If @extended <> 1 Then
				$vStyle = 0
				ContinueLoop
			EndIf
			$vStyle[3] = StringReplace($vStyle[3], @CRLF, ' ')
			$vStyle[4] = $vY
			$vY = ''
			If Not $sWordExt Then
				_GetWordExt($sWordExt)
				If @error Then
					$vStyle = 0
					MsgBox(16, $sTitle, 'Ошибка определения версии Word', 0, $hGui)
					ContinueLoop
				EndIf
			EndIf
			_ReplaceWord($vStyle)
			$vStyle = 0
			If @error Then
				MsgBox(16, $sTitle, 'Ошибка экспорта в Word', 0, $hGui)
			Else
				_Preview()
				GUICtrlSetState($aButton_1[2], $GUI_ENABLE)
			EndIf
			_WinAPI_EmptyWorkingSet()
		Case $aCombo[1]
			$vY = GUICtrlRead($aCombo[1])
			If Not $vY Then ContinueLoop
			$vStyle = _GetMonthToCombo($vY)
			If @error Then ContinueLoop
			For $i = 2 To $aCombo[0]
				GUICtrlSetData($aCombo[$i], '')
			Next
			GUICtrlSetData($aCombo[2], $vStyle)
			GUICtrlSetState($aCombo[2], $GUI_ENABLE)
			GUICtrlSetState($aCombo[3], $GUI_DISABLE)
			For $i = 1 To $aInput_1[0]
				GUICtrlSetData($aInput_1[$i], '')
			Next
			For $i = 1 To $aButton_1[0]
				GUICtrlSetState($aButton_1[$i], $GUI_DISABLE)
			Next
			$vY = ''
			$vStyle = ''
		Case $aCombo[2]
			$vY = GUICtrlRead($aCombo[2])
			If Not $vY Then ContinueLoop
			$vStyle = _GetInfoToCombo($vY)
			If @error Then ContinueLoop
			GUICtrlSetData($aCombo[3], '')
			GUICtrlSetData($aCombo[3], $vStyle)
			GUICtrlSetState($aCombo[3], $GUI_ENABLE)
			For $i = 1 To $aInput_1[0]
				GUICtrlSetData($aInput_1[$i], '')
			Next
			For $i = 1 To $aButton_1[0]
				GUICtrlSetState($aButton_1[$i], $GUI_DISABLE)
			Next
			$vY = ''
			$vStyle = ''
		Case $aCombo[3]
			$vY = GUICtrlRead($aCombo[3])
			If Not $vY Then ContinueLoop
			$vStyle = _GetInfoToInput($vY)
			If @error Then ContinueLoop
			For $i = 1 To $aInput_1[0]
				GUICtrlSetStyle($aInput_1[$i], BitOR($ES_CENTER, $ES_MULTILINE, $ES_READONLY))
				GUICtrlSetData($aInput_1[$i], $vStyle[$i])
			Next
			GUICtrlSetState($aButton_1[1], $GUI_ENABLE)
			$vY = ''
			$vStyle = ''
		Case $aButton[1]
			$aInfo = _GetInfo()
			If @error Then
				MsgBox(16, $sTitle, $aInfo, 0, $hGui)
				ContinueLoop
			EndIf
			If Not $sWordExt Then
				_GetWordExt($sWordExt)
				If @error Then
					MsgBox(16, $sTitle, 'Ошибка определения версии Word', 0, $hGui)
					ContinueLoop
				EndIf
			EndIf
			_ReplaceWord($aInfo)
			If @error Then
				MsgBox(16, $sTitle, 'Ошибка экспорта в Word', 0, $hGui)
			Else
				For $i = 2 To $aButton[0] - 1
					GUICtrlSetState($aButton[$i], $GUI_ENABLE)
				Next
				$fNotSave = True
			EndIf
			_WinAPI_EmptyWorkingSet()
		Case $aButton[2]
			If Not $sWordExt Then
				_GetWordExt($sWordExt)
				If @error Then
					MsgBox(16, $sTitle, 'Ошибка определения версии Word', 0, $hGui)
					ContinueLoop
				EndIf
			EndIf
			_Preview()
		Case $aButton[3], $aButton_1[2]
			If Not $sWordExt Then
				_GetWordExt($sWordExt)
				If @error Then
					MsgBox(16, $sTitle, 'Ошибка определения версии Word', 0, $hGui)
					ContinueLoop
				EndIf
			EndIf
			_Print()
			If @error Then
				MsgBox(16, $sTitle, 'Ошибка печати полиса', 0, $hGui)
			EndIf
			_WinAPI_EmptyWorkingSet()
		Case $aButton[4]
			_Save($aInfo)
			If Not @error Then
				$fNotSave = False
				GUICtrlSetState($aButton[4], $GUI_DISABLE)
			EndIf
		Case $aButton[5]
			For $i = 1 To $aInput[0]
				GUICtrlSetData($aInput[$i], '')
			Next
			For $i = 2 To $aButton[0] - 1
				GUICtrlSetState($aButton[$i], $GUI_DISABLE)
			Next
			$aInfo = 0
			$fNotSave = False
	EndSwitch
WEnd

Func _GetInfoToInput($s_Key)
	Local $s_String, $s_Temp, $s_Value, $a_Result

	$s_String = GUICtrlRead($aCombo[1])
	If Not $s_String Then Return SetError(1, 0, '')
	$s_Temp = GUICtrlRead($aCombo[2])
	If Not $s_Temp Then Return SetError(1, 0, '')
	$s_Temp = _DateToMonthRu($s_Temp, 1)
	If @error Then Return SetError(1, 0, '')
	$s_Value = IniRead($sIniDir & '\' & $s_String & '\' & $s_Temp & '.ini', 'Polis', $s_Key, 'Error')
	If $s_Value == 'Error' Then SetError(1, 0, '')
	$a_Result = StringSplit($s_Value, '|')
	If $a_Result[0] <> 3 Then SetError(1, 0, '')
	$a_Result[$a_Result[0]] = StringReplace($a_Result[$a_Result[0]], ' дом', @CRLF & 'дом')
	Return $a_Result
EndFunc   ;==>_GetInfoToInput

Func _GetInfoToCombo($s_Mon)
	Local $a_Section, $s_String

	$s_Mon = _DateToMonthRu($s_Mon, 1)
	If @error Then Return SetError(1, 0, '')
	$s_String = GUICtrlRead($aCombo[1])
	If Not $s_String Then Return SetError(1, 0, '')
	$a_Section = IniReadSection($sIniDir & '\' & $s_String & '\' & $s_Mon & '.ini', 'Polis')
	If @error Then Return SetError(1, 0, '')
	$s_String = ''
	For $i = 1 To $a_Section[0][0]
		$s_String &= $a_Section[$i][0] & '|'
	Next
	If $s_String Then
		Return StringTrimRight($s_String, 1)
	EndIf
	Return SetError(1, 0, '')
EndFunc   ;==>_GetInfoToCombo

Func _GetMonthToCombo($s_DirYear)
	Local $a_File, $s_String, $v_Temp

	$a_File = _FileListToArray($sIniDir & '\' & $s_DirYear, '*.ini', 1)
	If @error Then Return SetError(1, 0, '')
	For $i = 1 To $a_File[0]
		$v_Temp = StringRegExpReplace($a_File[$i], '\..*$', '')
		$v_Temp = Int($v_Temp)
		If $v_Temp > 0 And $v_Temp < 13 Then
			$s_String &= _DateToMonthRu($v_Temp) & '|'
		EndIf
	Next
	If $s_String Then
		Return StringTrimRight($s_String, 1)
	EndIf
	Return SetError(1, 0, '')
EndFunc   ;==>_GetMonthToCombo

Func _GetYearToCombo()
	Local $a_Dir, $s_String

	$a_Dir = _FileListToArray($sIniDir, '*', 2)
	If @error Then Return SetError(1, 0, '')
	For $i = 1 To $a_Dir[0]
		If StringRegExp($a_Dir[$i], '^\d{4}$') Then
			$s_String &= $a_Dir[$i] & '|'
		EndIf
	Next
	If $s_String Then
		Return StringTrimRight($s_String, 1)
	EndIf
	Return SetError(1, 0, '')
EndFunc   ;==>_GetYearToCombo

Func _GetInfo()
	Local $a_Replace[5] = [4], $s_FIO_Long, $s_Address, $s_FIO_Short, $s_Temp, $a_Temp, $s_Delim

	For $i = 1 To 3
		$s_Temp = GUICtrlRead($aInput[$i])
		If Not $s_Temp Then Return SetError(1, 0, 'Не введены фамилия, имя или отчество')
		If $i < 2 Then
			$s_Temp = StringStripWS($s_Temp, 7)
			If StringInStr($s_Temp, '-') Then
				$s_Delim = '-'
			ElseIf StringInStr($s_Temp, ' ') Then
				$s_Delim = ' '
			Else
				$s_Delim = ''
			EndIf
			If $s_Delim Then
				$a_Temp = StringSplit($s_Temp, $s_Delim)
				$s_Temp = ''
				For $j = 1 To $a_Temp[0]
					$a_Temp[$j] = StringStripWS($a_Temp[$j], 8)
					$s_Temp &= StringUpper(StringLeft($a_Temp[$j], 1)) & _
							StringLower(StringTrimLeft($a_Temp[$j], 1)) & $s_Delim
				Next
				$s_FIO_Long = StringTrimRight($s_Temp, 1)
			Else
				$s_FIO_Long = StringUpper(StringLeft($s_Temp, 1)) & StringLower(StringTrimLeft($s_Temp, 1))
			EndIf
			$s_FIO_Short = $s_FIO_Long & ' '
		Else
			$s_Temp = StringStripWS($s_Temp, 8)
			$s_FIO_Long &= ' ' & StringUpper(StringLeft($s_Temp, 1)) & StringLower(StringTrimLeft($s_Temp, 1))
			$s_FIO_Short &= StringUpper(StringLeft($s_Temp, 1)) & '.'
		EndIf
	Next
	$s_Address = GUICtrlRead($nCity) & ', '
	$s_Temp = GUICtrlRead($nStreet)
	If Not $s_Temp Then Return SetError(1, 0, 'Не выбран тип улицы')
	$s_Temp = StringStripWS($s_Temp, 8)
	$s_Address &= StringLower($s_Temp) & ' '
	$s_Temp = GUICtrlRead($aInput[$aInput[0]])
	If Not $s_Temp Then Return SetError(1, 0, 'Не введено название улицы')
	$s_Temp = StringStripWS($s_Temp, 7)
	If StringInStr($s_Temp, '-') Then
		$s_Delim = '-'
	ElseIf StringInStr($s_Temp, ' ') Then
		$s_Delim = ' '
	Else
		$s_Delim = ''
	EndIf
	If $s_Delim Then
		$a_Temp = StringSplit($s_Temp, $s_Delim)
		$s_Temp = ''
		For $i = 1 To $a_Temp[0]
			$a_Temp[$i] = StringStripWS($a_Temp[$i], 8)
			$s_Temp &= StringUpper(StringLeft($a_Temp[$i], 1)) & _
					StringLower(StringTrimLeft($a_Temp[$i], 1)) & $s_Delim
		Next
		$s_Address &= StringTrimRight($s_Temp, 1) & ', '
	Else
		$s_Address &= StringUpper(StringLeft($s_Temp, 1)) & StringLower(StringTrimLeft($s_Temp, 1)) & ', '
	EndIf
	For $i = 4 To $aInput[0] - 1
		$s_Temp = StringStripWS(GUICtrlRead($aInput[$i]), 8)
		If Not Mod($i, 2) Then
			If Not $s_Temp Then Return SetError(1, 0, 'Не введены номер дома или квартиры')
			$s_Address &= StringLower(GUICtrlRead($aInput[$i] - 1)) & ' ' & $s_Temp & ', '
		Else
			If $s_Temp Then $s_Address &= StringLower(GUICtrlRead($aInput[$i] - 1)) & ' ' & $s_Temp & ', '
		EndIf
	Next
	$a_Replace[1] = _ToDayFormatRu()
	$a_Replace[2] = $s_FIO_Long
	$a_Replace[3] = StringTrimRight($s_Address, 2) & '.'
	$a_Replace[4] = $s_FIO_Short
	Return SetError(0, 0, $a_Replace)
EndFunc   ;==>_GetInfo

Func _Save($a_Array)
	Local $s_Value, $sDate = StringFormat(' %02d.%02d.%02d %02d:%02d:%02d', @MDAY, @MON, _
			StringRight(@YEAR, 2), @HOUR, @MIN, @SEC), $i_Res

	For $i = 1 To $a_Array[0] - 1
		$s_Value &= $a_Array[$i] & '|'
	Next
	$s_Value = StringTrimRight($s_Value, 1)
	$i_Res = IniWrite($sIni, 'Polis', $a_Array[4] & $sDate, $s_Value)
	If $i_Res Then
		$a_Array = 0
	EndIf
	Return SetError($i_Res - 1)
EndFunc   ;==>_Save

Func _Preview()
	Local $s_File = @ScriptDir & '\template\_temp\_temp' & $sWordExt

	If Not FileExists($s_File) Then Return
	ShellExecute($s_File)
EndFunc   ;==>_Preview

Func _Print($i_Copies = 2)
	Local $s_File = @ScriptDir & '\template\_temp\_temp' & $sWordExt, $o_Word, $o_Doc, $i_Error

	If Not FileExists($s_File) Then Return SetError(1)
	$o_Word = _WordCreate($s_File, 0, 0)
	If @error Then Return SetError(1)
	$o_Doc = _WordDocGetCollection($o_Word, 0)
	If @error Then Return SetError(1)
	_WordDocPrint($o_Doc, 0, $i_Copies)
	$i_Error = @error
	_WordQuit($o_Word)
	Return SetError($i_Error)
EndFunc   ;==>_Print

Func _ReplaceWord($a_Replace)
	Local $a_Find[5] = [4, 'date_long', 'fio_long', 'address', 'fio_short'], _
			$s_Template = @ScriptDir & '\template\template' & $sWordExt, _
			$s_File = @ScriptDir & '\template\_temp\_temp' & $sWordExt, $o_Word, $o_Doc, $i_Error

	If Not FileCopy($s_Template, $s_File, 9) Then Return SetError(1)
	$o_Word = _WordCreate($s_File, 0, 0)
	If @error Then Return SetError(1, 0, 0)
	For $j = 1 To 1
		$o_Doc = _WordDocGetCollection($o_Word, 0)
		If @error Then ExitLoop
		For $i = 1 To $a_Find[0]
			_WordDocFindReplace($o_Doc, $a_Find[$i], $a_Replace[$i])
			If @error Then ExitLoop 2
		Next
	Next
	If @error Then
		_WordDocClose($o_Doc, 0)
		_WordQuit($o_Word)
		FileDelete($s_File)
		Return SetError(1)
	EndIf
	_WordDocSave($o_Doc)
	$i_Error = @error
	_WordQuit($o_Word)
	Return SetError($i_Error, 0, 0)
EndFunc   ;==>_ReplaceWord

Func _ToDayFormatRu()
	Local $a_Mon[13] = [12, 'января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', _
			'сентября', 'октября', 'ноября', 'декабря']

	Return StringFormat(Chr(171) & '%02d' & Chr(187) & ' %s %04d года', @MDAY, $a_Mon[@MON], @YEAR)
EndFunc   ;==>_ToDayFormatRu

Func _DateToMonthRu($v_Mon, $i_Flag = 0)
	Local $a_Mon[13] = [12, 'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', _
			'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь']

	If $i_Flag Then
		For $i = 1 To $a_Mon[0]
			If $v_Mon == $a_Mon[$i] Then
				Return StringFormat('%02d', $i)
			EndIf
		Next
		Return SetError(1, 0, '')
	Else
		$v_Mon = Abs(Int($v_Mon))
		If $v_Mon > 0 And $v_Mon < 13 Then
			Return $a_Mon[$v_Mon]
		EndIf
		Return SetError(1, 0, '')
	EndIf
EndFunc   ;==>_DateToMonthRu

Func _GetWordExt(ByRef $s_Ext)
	Local $o_Word, $i_Ver

	$o_Word = _WordCreate('', 0, 0)
	If @error Then Return SetError(1)
	$i_Ver = _WordPropertyGet($o_Word, 'version')
	_WordQuit($o_Word, 0)
	Sleep(250)
	If Not $i_Ver Then Return SetError(1)
	If $i_Ver > 11 Then
		$s_Ext = '.docx'
	Else
		$s_Ext = '.doc'
	EndIf
EndFunc   ;==>_GetWordExt

В прикрепленном архиве папка polic - пример структуры сохранения и вывода ранее созданных полисов, выбираются по порядку год, месяц, полис. В папке template - шаблон в формате doc (Office 2003). Чтобы не было лишних проблем, лучше создать еще такой же шаблон в формате docx (Office 2007 и выше). ФИО и название улиц можно вводить с лишними пробелами, с маленькой буквы, а остальные большие, должно исправлять. Если фамилия или улица из 2-х слов или через дефис, то каждое слово после пробела(дефиса) должно экспортировать с большой буквы. И т.д.
 
Автор
K

koks0017

Новичок
Сообщения
53
Репутация
0
пишет ошибку #include <WinAPIEx.au3> вот этой библиотекив
 
Автор
K

koks0017

Новичок
Сообщения
53
Репутация
0
объясни пожалуйста чайнику не получается установить эту библиотеку
 
Автор
K

koks0017

Новичок
Сообщения
53
Репутация
0
а можно сделать еще во вкладке архив полюсов помимо года и месяца еще и день плюс поиск по страхователям.
можно ли сделать заполнение даты в стандартном варианте "1" февраля 2012 где заполняется число месяц (словом) и последняя цифра года.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
koks0017 [?]
а можно сделать еще во вкладке архив полюсов помимо года и месяца еще и день плюс поиск по страхователям.
Можно, но, ИМХО, надо изменить способ хранения готовых полисов на базу данных.
можно ли сделать заполнение даты в стандартном варианте "1" февраля 2012 где заполняется число месяц (словом) и последняя цифра года.
Первое февраля 2012 года - так, я правильно понял?
 
Верх