Что нового

Где определять хоткеи, чтобы они не вызывали ошибок? Код внутри

Suppir

Продвинутый
Сообщения
967
Репутация
62
Если убрать комментарии с группы хоткеев, то постоянно выпадают ошибки о неопределенных переменных. Куда переставить HotKeySet'ы, чтобы избежать ошибок?

Код:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#Include <GUIEdit.au3>
#include <Date.au3>
#include <File.au3>
#include <Array.au3>

;~ Глобальные настройки
Opt("ExpandVarStrings", 1)

;~ глобальные переменные
Global $GuiName = "NSR-авто, версия 1.0 beta"
Global $Filelist[1], $Message
Global $tTime = _Date_Time_GetSystemTime()
Global $aTime = _Date_Time_SystemTimeToArray($tTime)
Global $Today = $aTime[1] & "/" & $aTime[0] & "/" & $aTime[2]
Global $Br = "[ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ]"
Global $Lr = "[йцукенгшщзхъфывапролджэячсмитьбю]"
Global $MyDocsFolder = "::{450D8FBA-AD25-11D0-98A8-0800361B1103}"
;~ регулярное выражения для поиска фамилий
Global $Fam = $Br & "\.\s*" & $Br & "\.\s*" & $Br & $Lr & "+" & "|" & $Br & $Lr & "+\s+" & $Br & "\.\s*" & $Br & "\."
Global $Month = "[Яя]нваря|[Фф]евраля|[Мм]арта|[Аа]преля|[Мм]ая|[Ии]юня|[Ии]юля|[Аа]вгуста|[Сс]ентября|[Оо]ктября|[Нн]оября|[Дд]екабря"


;~ Ищем врапперы
;~ $Filelist = _FileListToArray(@ScriptDir, "*.txt")
;~ Global $WrapperList
;~ For $x = 1 to $FileList[0] 
;~ 	
;~ 	$WrapperList = $WrapperList & "|" & StringTrimRight($FileList[$x], 4)
;~ Next

;~ _ArrayDisplay($Filelist)

;~ Основная форма
Global $MainForm = GUICreate($GuiName, 911, 701, 233, 151)
GUISetFont(10, 400, 0, "Arial")


;~ Акселераторы
$SelectAll = GUICtrlCreateDummy()
$SaveDoc = GUICtrlCreateDummy()
Global $AccelKeys[2][2] = [["^a", $SelectAll], ["^s", $SaveDoc]]
GUISetAccelerators($AccelKeys)


;~ КУДА ПЕРЕСТАВИТЬ ЭТИ ХОТКЕИ, ЧТОБЫ ОНИ НЕ СОЗДАВАЛИ ОШИБОК?
;~ HotKeySet("!1", CopyDate())
;~ HotKeySet("!2", CopyNum())
;~ HotKeySet("!3", CopyName())
;~ HotKeySet("!4", CopyText())
;~ HotKeySet("!5", CopyLeftSign())
;~ HotKeySet("!6", CopyRightSign())
;~ HotKeySet("{F5}", Wrap())
;~ HotKeySet("{F6}", SaveDefault())

;~ Группа 1
$Group1 = GUICtrlCreateGroup("1.", 10, 5, 325, 75)
$Combo = GUICtrlCreateCombo("", 20, 45, 270, 25, $CBS_DROPDOWNLIST)
;~ GUICtrlSetData(-1, $WrapperList)


$Label1 = GUICtrlCreateLabel("Выбрать враппер для работы", 80, 20, 240, 20)
GUICtrlSetFont(-1, 10, 400, 0, "Label1")
$Button1 = GUICtrlCreateButton("Изм", 295, 45, 30, 25, 0)
GUICtrlSetState(-1, $GUI_DISABLE)

;~ Группа 2
$Group2 = GUICtrlCreateGroup("2.", 340, 5, 175, 75)
$Input1 = GUICtrlCreateInput("", 350, 45, 101, 24, BitOR($ES_AUTOHSCROLL, $ES_NUMBER))
$Label2 = GUICtrlCreateLabel("Начать с топика", 380, 20, 110, 20)
$Button2 = GUICtrlCreateButton("<", 455, 45, 25, 25, 0)
$Button3 = GUICtrlCreateButton(">", 481, 45, 25, 25, 0)

;~ Группа 3
$Group3 = GUICtrlCreateGroup("3.", 520, 5, 175, 75)
$Button4 = GUICtrlCreateButton("Создать NSR", 530, 30, 75, 40, $BS_MULTILINE)
$Button5 = GUICtrlCreateButton("Cохранить NSR", 610, 30, 75, 40, $BS_MULTILINE)

GUICtrlCreateGroup("", -99, -99, 1, 1)
$Edit1 = GUICtrlCreateEdit("", 0, 85, 445, 614, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_WANTRETURN))
GUICtrlSetState(-1, $GUI_FOCUS) 
GUICtrlSetLimit($Edit1, 99999999)
$Edit2 = GUICtrlCreateEdit("", 445, 85, 465, 614, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_WANTRETURN))
GUICtrlSetLimit($Edit2, 99999999)

;~ Настройки, помощь
$Group4 = GUICtrlCreateGroup("Настройки, помощь", 700, 5, 205, 75)
$Checkbox1 = GUICtrlCreateCheckbox("  Включить автозамену", 710, 30, 157, 17)
GUICtrlSetState (-1, 1)
$Button6 = GUICtrlCreateButton("Изм", 707, 50, 30, 25, 0)
$Label3 = GUICtrlCreateLabel("Правила автозамены", 740, 55, 130, 20)
$Button7 = GUICtrlCreateButton("i", 879, 15, 21, 21, 0)

GUISetState(@SW_SHOW)

While 1
$nMsg = GUIGetMsg()
	Switch $nMsg
		
		Case $GUI_EVENT_CLOSE
			Exit
		
		Case $Combo 
			GUICtrlSetState($Button1, $GUI_ENABLE)
		Case $Button1
			If GUICtrlRead($Combo) <> "" Then
				FileCopy(@ScriptDir & "\" & GUICtrlRead($Combo) & ".txt", @ScriptDir & "\" & GUICtrlRead($Combo) & ".bak", 1) 
				Run("notepad.exe " & @ScriptDir & "\" & GUICtrlRead($Combo) & ".txt")
			EndIf

		Case $Button2 
			$iTopic = GUICtrlRead($Input1)
			if @error = 0 Then GUICtrlSetData($Input1, $iTopic-1)
				
		Case $Button3 
			$iTopic = GUICtrlRead($Input1)
			if @error = 0 Then GUICtrlSetData($Input1, $iTopic+1)		
				
		Case $Button4
			For $x = 1 To $FileList[0]
				if $FileList[$x] = GUICtrlRead($Combo) & ".txt" Then
					Global $WrapperName = $FileList[$x] & ".txt"
					Wrap()
				EndIf
			Next	

		Case $Button5
			SaveAs()
			
		Case $Button6
			FileCopy("автозамена.ini", "автозамена.bak", 1) 
			Run("notepad.exe " & "автозамена.ini")

		Case $Button7 
			
		Case $SelectAll
			SelectAll()
			
		Case $SaveDoc
			SaveAs()
			
	EndSwitch
WEnd


Func Wrap()
;~ 	Global $WrapperData
	
;~ 	_FileReadToArray($FileList[$x], $WrapperData)
	Global $Topic = GUICtrlRead($Input1)
	Global $Spravka = $Topic + 10000
	
;~ Делаем автозамену

	Global $TextFromEdit1 = GUICtrlRead($Edit1)

	If GUICtrlRead($Checkbox1) = $GUI_CHECKED Then 
		$ini = FileRead("автозамена.ini")
		$patern = '(Найти:.+?[\r\n]+Заменить на:[^\r\n]*)'
		$Search = StringRegExp($ini, $patern, 3)
		If IsArray($Search) Then
			$patern = 'Найти:(.+?)[\r\n]+Заменить на:(.*)'
			For $i = 0 To UBound($Search) - 1
				$sSearch = StringRegExpReplace($Search[$i], $patern, '\1')
				$sReplace = StringRegExpReplace($Search[$i], $patern, '\2')
				$TextFromEdit1 = StringRegExpReplace($TextFromEdit1, '(?m)' & $sSearch, $sReplace)
			Next
		EndIf
		FileClose($ini)
	EndIf
	
	
	Local $IN = FileRead($FileList[$x])
	Local $Line = StringSplit($TextFromEdit1, @CRLF)
	for $i = 1 to UBound($Line) - 1
		if @error = 0 And StringLen($Line[$i]) > 0 Then
			

;~ Распознаем название, вариант: !01.01.2010 N 2133/12 "Название документа"
			Local $Matches = StringRegExp ($Line[$i], "^!\s*0?(\d+)[\.\\\/](\d+)[\.\\\/](\d+)\s*г?о?д?а?\.?\s*[N№]\s*(\S+)\s*(.+)", 1)
				If @error = 0 Then
					
					Global $Code = $Matches[3]
					
;~ 					Global $Name = $Matches[4]
					Global $Name = StringRegExpReplace($Matches[4], """*(.+)""$", "\1")

					if StringLen ($Matches[0]) = 1 Then 
						Global $DatePoints = "0" & $Matches[0] & "." & $Matches[1] & "." & $Matches[2]
						Global $DateSlash = "0" & $Matches[0] & "/" & $Matches[1] & "/" & $Matches[2]
					Else 
						Global $DatePoints = $Matches[0] & "." & $Matches[1] & "." & $Matches[2]
						Global $DateSlash = $Matches[0] & "/" & $Matches[1] & "/" & $Matches[2]
					EndIf
					
					Global $DateLong = $Matches[0] & " " & _DigitToMonth($Matches[1]) & " " & $Matches[2] & " г."
	
					Puts($IN)
					
					$Topic = $Topic + 1
					$Spravka = $Spravka + 1 
					ContinueLoop
				EndIf

;~ Распознаем название, вариант: !01 Апреля 2010 "Название документа"
			Local $Matches = StringRegExp ($Line[$i], "^!\s*0?(\d+)\s+($Month$),?\s+(\d+)\s*г?\.?\s*(.+)", 1)
				If @error = 0 Then
					
					Global $Name = StringRegExpReplace($Matches[3], """*(.+)""*$", "\1")

					if StringLen ($Matches[0]) = 1 Then 
						Global $DatePoints = "0" & $Matches[0] & "." & _MonthToDigit($Matches[1]) & "." & $Matches[2]
						Global $DateSlash = "0" & $Matches[0] & "/" & _MonthToDigit($Matches[1]) & "/" & $Matches[2]
					Else 
						Global $DatePoints = $Matches[0] & "." & _MonthToDigit($Matches[1]) & "." & $Matches[2]
						Global $DateSlash = $Matches[0] & "/" & _MonthToDigit($Matches[1]) & "/" & $Matches[2]
					EndIf
					
					Global $DateLong = $Matches[0] & " " & StringLower($Matches[1]) & " " & $Matches[2] & " г."
	
					Puts($IN)
					$Topic = $Topic + 1
					$Spravka = $Spravka + 1 
					ContinueLoop
				EndIf


;~ Распознаем название, вариант: !01.01.2010 Название документа. НЕ ОПРЕДЕЛЯЕТСЯ DATELONG
			Local $Matches = StringRegExp ($Line[$i], "^!\s*0?(\d+)[\./](\d+)[\./](\d+)\s*(.+)", 1)
				If @error = 0 Then
				
					Global $Name = $Matches[3]

					if StringLen ($Matches[0]) = 1 Then 
						Global $DatePoints = "0" & $Matches[0] & "." & $Matches[1] & "." & $Matches[2]
						Global $DateSlash = "0" & $Matches[0] & "/" & $Matches[1] & "/" & $Matches[2]
					Else 
						Global $DatePoints = $Matches[0] & "." & $Matches[1] & "." & $Matches[2]
						Global $DateSlash = $Matches[0] & "/" & $Matches[1] & "/" & $Matches[2]
					EndIf
					
					Global $DateLong = $Matches[0] & " " & StringLower($Matches[1]) & " " & $Matches[2] & " г."

					Puts($IN)
					$Topic = $Topic + 1
					$Spravka = $Spravka + 1 
					ContinueLoop
				EndIf
			
			
			
			
;~ Поиск заголовков
			Local $Matches = StringRegExp($Line[$i], "^\^(.+)", 1) 
			If @error = 0 Then 
				Puts ("")
				Puts ("!STYLE C 0 73 0")
				Puts ("" & $Matches[0] & "")
				Puts ("")
				ContinueLoop
			EndIf

			
;~ Поиск обычного текста
			if StringRegExp($Line[$i], "^([^!].+)", 0) Then
				Puts ("!STYLE J 0 73 5")
				Puts ($Line[$i])
				ContinueLoop
			EndIf


;~ Поиск подписи
;~ 			вариант подписи:  !А.А. Петров
			$Matches = StringRegExp($Line[$i], "^!($Fam$)", 1)
			If @error = 0 Then
				Puts("")
				Puts("")
				Puts("STYLE L 0 73 0")
				Puts($Matches[0])
				Puts("")
				Puts(";")
				ContinueLoop
			EndIf

;~ 			вариант подписи:  !Руководитель А.А. Петров
			$Matches = StringRegExp($Line[$i], "^!(.+)\s*($Fam$)", 1)
			If @error = 0 Then
				Puts("")
				Puts("")
				Puts("!STYLE S 0 73 0")
				Puts($Matches[0] & "  |  " & $Matches[1])
				Puts("")
				Puts(";")
				ContinueLoop
			EndIf

;~ 			вариант подписи:  !Пресс-служба департамента
			$Matches = StringRegExp($Line[$i], "^!.+(?!$Fam$)", 1)
			If @error = 0 Then
				Puts("")
				Puts("")
				Puts("!STYLE L 0 73 0")
				Puts($Matches[0])
				Puts("")
				Puts(";")
				ContinueLoop
			EndIf
		
		EndIf
	Next

	FileClose($FileList[$x])
EndFunc





Func Say ($Message)
	MsgBox(0, "", $Message)
EndFunc

Func Puts ($Message)
	_GUICtrlEdit_AppendText($Edit2, @CRLF & $Message)
EndFunc

Func _DigitToMonth($Month)
	If $Month = 1 Then Return "января"
	If $Month = 2 Then Return "февраля"
	If $Month = 3 Then Return "марта"
	If $Month = 4 Then Return "апреля"
	If $Month = 5 Then Return "мая"
	If $Month = 6 Then Return "июня"
	If $Month = 7 Then Return "июля"
	If $Month = 8 Then Return "августа"
	If $Month = 9 Then Return "сентября"
	If $Month = 10 Then Return "октября"
	If $Month = 11 Then Return "ноября"
	If $Month = 12 Then Return "декабря"
EndFunc   ;==>_DigitToMonth

Func _MonthToDigit($Month)
	if $Month = "января" Then Return "01"
	if $Month = "февраля" Then Return "02"
	if $Month = "марта" Then Return "03"
	if $Month = "апреля" Then Return "04"
	if $Month = "мая" Then Return "05"
	if $Month = "июня" Then Return "06"
	if $Month = "июля" Then Return "07"
	if $Month = "августа" Then Return "08"
	if $Month = "сентября" Then Return "09"
	if $Month = "октября" Then Return "10"
	if $Month = "ноября" Then Return "11"
	if $Month = "декабря" Then Return "12"
	EndFunc   ;==>_MonthToDigit
	
	
Func SaveAs()
	
	local $TextToSave, $SaveAs, $SaveAsNSR, $hFile
	
	$TextToSave = _StringANSI2OEM(GuiCtrlRead($Edit2))
	if StringLen($TextToSave) < 1 Then
		MsgBox(64, "", "Сохранять пока нечего")
	Else
		$SaveAs = FileSaveDialog("Сохранить как", @DesktopCommonDir, "(*.nsr)", 2)
		if @error =0 Then
			$SaveAsNSR = $SaveAs & ".nsr"
			$hFile = FileOpen($SaveAsNSR, 2)
			FileWriteLine($hFile, $TextToSave)
			FileClose($hFile)
			if @error<>0 Then MsgBox(1, "", "Ошибка сохранения")
		EndIf
	EndIf
	
EndFunc

Func _StringANSI2OEM($strText)
	Local $sBuffer = DllStructCreate("char[" & StringLen($strText) + 1 & "]")
	Local $aRet = DllCall("User32.dll", "int", "CharToOem", "str", $strText, "ptr", DllStructGetPtr($sBuffer))
	If Not IsArray($aRet) Then Return SetError(1, 0, '') ; ошибка DLL
	If $aRet[0] = 0 Then Return SetError(2, $aRet[0], '') ; ошибка функции

	Return DllStructGetData($sBuffer, 1)
EndFunc   ;==>_StringANSI2OEM


Func SelectAll()
	If ControlGetFocus($GuiName) <> "ComboBox1" Then 
		Send("^{HOME}")
		Send("^+{END}")
	EndIf
EndFunc

Func CopyDate()
	Send ("^c")
	_GUICtrlEdit_AppendText($Edit1, @CRLF & ClipGet() & " ")
EndFunc

Func CopyNum()
	Send ("^c")
	_GUICtrlEdit_AppendText($Edit1, ClipGet() & " ")
EndFunc

Func CopyName()
	Send ("^c")
	_GUICtrlEdit_AppendText($Edit1, ClipGet() & @CRLF)
EndFunc


Func CopyText()
	
EndFunc


Func CopyLeftSign()
	
EndFunc


Func CopyRightSign()
	
EndFunc

Func SaveDefault()
	
EndFunc



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

АААА, все, разобрался!

Нужно было писать не HotKeySet("!1", CopyDate()), а HotKeySet("!1", "CopyDate()")

Т.е. внутри HotHeySet необходимо писать названия функций в кавычках.

уже который раз делаю эту ошибку :mad:

жалко, что при запуске скрипта AutoIt не распознает, в чем именно ошибка.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Suppir
По-моему, писать надо не
Код:
HotKeySet("!1", "CopyDate()")
а
Код:
HotKeySet("!1", "CopyDate")
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Да, точно. Это место в синтаксисе постоянно вводит меня в заблуждение. Функции() упоминаются просто как строки "функция".

Не знаю, зачем так сделали. Было бы понятней так:
HotKeySet("!1", CopyDate())
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
Suppir [?]
Было бы понятней так:
Тогда пришлось бы для этого конкретного случая писать отдельный обработчик в механизме AutoIt, т.к подобная конструкция прежде всего вызовет функцию CopyDate(), а лишь потом HotKeySet. Помещение в кавычки нужно для определения параметра, который принимает и обрабатывает сама HotKeySet.
 
Верх