Что нового

Написание скрипта, для работы с combobox в другом приложении

Danbury

Новичок
Сообщения
10
Репутация
0
Версия AutoIt: v3.3.8.1.
Доброго времени суток, формучане. Хотелось бы узнать, справится ли с моей задачей autoit. Мне нужен скрипт, который будет подставлять значение в элемент combo box в таком окне:
9186ba790ea3.png


Т.е нужно чтобы:

1) Была GUI оболочка, в которой задается «маршрут» таким же combo box, а в данном окне параметр маршрут «держался» до того момента, как я его не поменяю в оболочке GUI.
2) «Номер графика» при каждом вызове скрипта возрастал на 1.

Объясню для чего это нужно: есть программа для планирования выпуска троллейбусов, выбирать маршрут каждый раз из списка, занимает время, хотелось бы значение этого поля как то закрепить. И чтобы номер графика выбирался автоматически, они всегда идут по порядку. Весьма сумбурно объяснил, но по-другому, увы, не получается. Надеюсь на помощь, заранее спасибо.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Вопрос новичка, справится ли с этим Autoit

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"Вопрос новичка, справится ли с этим Autoit" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

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

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Danbury

Скорее всего это возможно.
Если Au3Info.exe из папки Autoit видит эти элементы и читает текст из них, то автоматизация такого окна не представляет трудностей.

Для работы с комбобоксами есть встроенные функции и специальная UDF-библиотека GuiComboBox.au3
 
Автор
D

Danbury

Новичок
Сообщения
10
Репутация
0
Не могли бы вы накидать примерный код скрипта ? С меня любая информация, которая нужна для этого.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Запускай Aotoit v3 Window Info
Запускай свою программу
Тяни за "прицел" Finder Tool на combo маршрут
Копируй со вкладки summary всю информацию сюда (под спойлер)
Повторить для нужных контролов.
 
Автор
D

Danbury

Новичок
Сообщения
10
Репутация
0
Маршрут:
>>>> Window <<<<
Title: Выбор графика и смены
Class: TFormSelMGS
Position: 813, 383
Size: 293, 270
Style: 0x96C80000
ExStyle: 0x00010101
Handle: 0x00BE0468

>>>> Control <<<<
Class: TComboBox
Instance: 3
ClassnameNN: TComboBox3
Name:
Advanced (Class): [CLASS:TComboBox; INSTANCE:3]
ID: 7668886
Text:
Position: 9, 20
Size: 273, 22
ControlClick Coords: 39, 13
Style: 0x54010253
ExStyle: 0x00000000
Handle: 0x00750496

>>>> Mouse <<<<
Position: 864, 438
Cursor ID: 0
Color: 0xFFFFFF

>>>> StatusBar <<<<

>>>> ToolsBar <<<<

>>>> Visible Text <<<<
1
1
Отмена
Принять
11.05.2012 13:45:00
11.05.2012 05:42:00
11.05.2012 05:42:00
А-1


>>>> Hidden Text <<<<

График:
>>>> Window <<<<
Title: Выбор графика и смены
Class: TFormSelMGS
Position: 813, 383
Size: 293, 270
Style: 0x96C80000
ExStyle: 0x00010101
Handle: 0x01320326

>>>> Control <<<<
Class: TComboBox
Instance: 2
ClassnameNN: TComboBox2
Name:
Advanced (Class): [CLASS:TComboBox; INSTANCE:2]
ID: 7472426
Text:
Position: 9, 64
Size: 273, 22
ControlClick Coords: 36, 14
Style: 0x54010253
ExStyle: 0x00000000
Handle: 0x0072052A

>>>> Mouse <<<<
Position: 861, 483
Cursor ID: 0
Color: 0xFFFFFF

>>>> StatusBar <<<<

>>>> ToolsBar <<<<

>>>> Visible Text <<<<
1
1
Отмена
Принять
08.05.2012 14:50:00
08.05.2012 05:42:00
08.05.2012 05:42:00
А-1


>>>> Hidden Text <<<<
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Попробуй для начала это:

Код:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Проверка", 615, 236, 416, 270)
$Label1 = GUICtrlCreateLabel("Маршруты", 16, 16, 65, 17)
$Combo1 = GUICtrlCreateCombo("", 16, 40, 273, 25, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL))
$Label2 = GUICtrlCreateLabel("Запустите программу с маршрутами и нажимте кнопку `Получить список`." & @CR & "Окно `Выбор графика и смены` должно быть видимо", 312, 16, 300, 68)
$Button1 = GUICtrlCreateButton("Получить список", 104, 8, 187, 25)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###

#include <GuiComboBox.au3>
$Hcomboid = GUICtrlGetHandle($Combo1)
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
Global $aList, $hCntl

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			$hWnd = WinGetHandle("Выбор графика и смены")
			If Not $hWnd Then
				GUICtrlSetData($Label2, 'Окно `Выбор графика и смены` не найдено')
				ContinueLoop
			EndIf
;~ 			$hCntl=ControlGetHandle($hWnd,"","[CLASS:ComboBox; INSTANCE:1]")
			$hCntl = ControlGetHandle($hWnd, "", "[CLASS:TComboBox; INSTANCE:3]")
			If Not $hCntl Then
				GUICtrlSetData($Label2, 'ComboBox не найден')
				ContinueLoop
			EndIf
			GUICtrlSetData($Label2, "Измените маршрут здесь и наблюдайте изменение маршрута в основной прогрмме")
			$aList = _GUICtrlComboBox_GetListArray($hCntl)
			_GUICtrlComboBox_BeginUpdate($hCntl)
			_GUICtrlComboBox_ResetContent($Combo1)
			For $i = 1 To $aList[0]
				_GUICtrlComboBox_AddString($Combo1, $aList[$i])
			Next
			$iSelIndex = _GUICtrlComboBox_GetCurSel($hCntl)
			_GUICtrlComboBox_SetCurSel($Combo1, $iSelIndex)
			_GUICtrlComboBox_EndUpdate($hCntl)
	EndSwitch
WEnd

Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
	Local $nNotifyCode = BitShift($wParam, 16)
	Local $nID = BitAND($wParam, 0x0000FFFF)
	Local $hCtrl = $lParam
	Switch $nNotifyCode
		Case 9
			Switch $hCtrl
				Case $Hcomboid
					$iSelect = _GUICtrlComboBox_GetCurSel($Combo1)
					_GUICtrlComboBox_SetCurSel($hCntl, $iSelect)
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
 
Автор
D

Danbury

Новичок
Сообщения
10
Репутация
0
inververs, список маршрутов в скрипте отображается нормально, но если второй раз вызвать окно "Выбор графика и смены", оно игнорирует значение combobox в скрипте, т.е оно начинается с самого начала списка, тобишь А-1.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Danbury
Ну пока это просто пример.
Я правда не совсем понимаю что должен делать скрипт. И что значит закрепить и как автоматически выбираются номера графика... и зачем перезапускать скрипт что бы менять номер графика.. Если разжуешь подробнее что нибудь решим.. Но уже не сегодня ;)

И как я понял, скрипт еще должен отслеживать, закрываешь ли ты основное окно, и если оно заново запускается - то скрипт должен перечитывать все комбобоксы?

И еще вопрос: когда меняешь в моем скрипте маршруты - они меняются в программе?
 
Автор
D

Danbury

Новичок
Сообщения
10
Репутация
0
inververs,
И что значит закрепить и как автоматически выбираются номера графика
"Закрепить" - это сделать так, чтобы выбрав в скрипте например Т-3, при вызове окошка с маршрутами, в комбобоксе окошка сразу же было Т-3 и оно не менялось при следующем его вызове. Просто по ходу планирования, приходится это окно вызывать десятки раз, и выбирать там каждый раз Т-3 довольно времязатратное занятие, оно в центре списка.

И как я понял, скрипт еще должен отслеживать, закрываешь ли ты основное окно, и если оно заново запускается - то скрипт должен перечитывать все комбобоксы
Если мы друг друга правильно поняли, то да. Что вы имеете ввиду под "пересчитывать" ?
И еще вопрос: когда меняешь в моем скрипте маршруты - они меняются в программе?
Да.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Держи, надеюсь поможет

Код:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#region ### START Koda GUI section
$Form1 = GUICreate("Имя формы", 216, 176, 496, 203)
$Label1 = GUICtrlCreateLabel("Маршруты:", 8, 8, 69, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Combo1 = GUICtrlCreateCombo("", 8, 32, 193, 25, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL))
$Label2 = GUICtrlCreateLabel("", 8, 56, 193, 34)
$Label3 = GUICtrlCreateLabel("Графики:", 8, 104, 59, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Checkbox1 = GUICtrlCreateCheckbox("Следующий", 72, 104, 137, 17)
$Label4 = GUICtrlCreateLabel("", 8, 128, 196, 34)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###




#include <GuiComboBox.au3>
Global $sTitleWait = "Выбор графика и смены"
;~ Global $sControlCheck = "[CLASS:ComboBox; INSTANCE:1]"
;~ Global $sControlCheck2 = "[CLASS:ComboBox; INSTANCE:2]"
Global $sControlCheck = "[CLASS:TComboBox; INSTANCE:3]"
Global $sControlCheck2 = "[CLASS:TComboBox; INSTANCE:2]"
Global $hWnd, $hLW, $hTCombo, $hTcombo2, $hCombo1 = GUICtrlGetHandle($Combo1)

Global $sFileConfig = "Config.ini"
Global $iLastRouteIndex
Global $bSetCombo1 = False, $bNewData = False, $bSet = False, $bReRead = False

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
;~ GUIRegisterMsg(0x0006 , "WM_ACTIVATE")

OnAutoItExitRegister("_SaveConfig") ;Закоментируй, если при старте скрипта он принимал текущее значение комбобокса
_ReadConfig() ;Закоментируй, если при старте скрипта он принимал текущее значение комбобокса

;~ GUICtrlSetData($Label2,"Ждем окно "&$sTitleWait)

Local $nMsg, $aList, $bLabel = False

Global $iNextSchedule, $bCheck = False, $bNext = False

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Checkbox1
;~ 			ConsoleWrite(GUICtrlRead($Checkbox1) & @LF) ;1 Установлен, 4 снят
			If GUICtrlRead($Checkbox1) = 1 Then
				$bCheck = True
				GUICtrlSetData($Label4, "Грaфик отслеживается")
				_NextShedule()
			Else
				$bCheck = False
				$bNext = False
				GUICtrlSetData($Label4, "Грфик не отслеживается")
				$iNexSchedule = 0
			EndIf
	EndSwitch

	If Not WinExists($sTitleWait) Then
		;Окна нет, ждем
		If Not $bLabel Then ;Костыль на немерцание
			$bLabel = True
			GUICtrlSetData($Label2, "Нет окна" & @CR & "Ждем окно " & $sTitleWait)
		EndIf
		$hWnd = 0
		ContinueLoop
	ElseIf Not $hWnd Then
		;Окно есть, но требуется опознание
		$hWnd = WinGetHandle($sTitleWait)
		If _IsNewWin($hWnd) Then $bSet = True ;Новое окно
	EndIf

	If Not $bSetCombo1 Then
		WinWait($hWnd)
		$hTCombo = ControlGetHandle($hWnd, '', $sControlCheck)
		$aList = _GUICtrlComboBox_GetListArray($hTCombo)
		_GUICtrlComboBox_BeginUpdate($hTCombo)
		_GUICtrlComboBox_ResetContent($hCombo1)
		For $i = 1 To $aList[0]
			_GUICtrlComboBox_AddString($hCombo1, $aList[$i])
		Next
		_GUICtrlComboBox_EndUpdate($hTCombo)
		$bSetCombo1 = True

		If $iLastRouteIndex Then ;$iLastRouteIndex нашли в конфиге
			_SetCombo1()
			_SetCombo2()
			ContinueLoop
		Else
			_SetCombo3()
			ContinueLoop
		EndIf

	EndIf

	If $bSet Then ;Новое окно - "заморозка"
		$bSet = False
		_SetCombo2()
		_NextShedule()
		ContinueLoop
	EndIf

	If $bNewData Then ;Изменили свое комбо
		$bNewData = False
		_SetCombo1()
		_SetCombo2()
		ContinueLoop
	EndIf

	If $bReRead Then ;Активировали свое окно, проверяем изменились ли кобмо
		Local $iIndex = _GUICtrlComboBox_GetCurSel($hTCombo)
		If $iIndex <> $iLastRouteIndex Then
			$iLastRouteIndex = $iIndex
			$bNewData = True
		EndIf
		$bReRead = False
	EndIf
WEnd

Func _NextShedule()
	If $bCheck Then
		If $bNext Then
			_GUICtrlComboBox_SetCurSel($hTcombo2, $iNextSchedule)
		EndIf
		$iNextSchedule = _GUICtrlComboBox_GetCurSel($hTcombo2)
		$iNextSchedule += 1
		$bNext = True
		$sText = ""
		_GUICtrlComboBox_GetLBText($hTcombo2, $iNextSchedule, $sText)
		If $sText Then
			GUICtrlSetData($Label4, "Следующий график: " & $sText)
		Else
			GUICtrlSetData($Label4, "Следующий график: 1-ый в списке")
			$iNextSchedule = 0
		EndIf

	EndIf
EndFunc   ;==>_NextShedule

Func _IsNewWin($hW)
	If $hW = $hLW Then Return 0
	$hLW = $hW
	WinWait($hW)
	$hTCombo = ControlGetHandle($hWnd, '', $sControlCheck)
	$hTcombo2 = ControlGetHandle($hWnd, '', $sControlCheck2)
	$bLabel = False
	GUICtrlSetData($Label2, "Новое окно")
	Return 1
EndFunc   ;==>_IsNewWin

Func _SetCombo1() ;Устанавливаем себе
	_GUICtrlComboBox_SetCurSel($hCombo1, $iLastRouteIndex)
EndFunc   ;==>_SetCombo1

Func _SetCombo2() ;Устанавливаем окну
	_GUICtrlComboBox_SetCurSel($hTCombo, $iLastRouteIndex)
EndFunc   ;==>_SetCombo2

Func _SetCombo3() ;Устанавливаем себе такой же как и у окна
	$iLastRouteIndex = _GUICtrlComboBox_GetCurSel($hTCombo)
	_SetCombo1()
EndFunc   ;==>_SetCombo3

Func WM_ACTIVATE($hWnd, $Msg, $wParam, $lParam) ;Сообщение об активации окна
	Local $nNotifyCode = BitShift($wParam, 16)
	Local $nID = BitAND($wParam, 0x0000FFFF)
	If $nID Then $bReRead = True
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_ACTIVATE

Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam) ;Сообщение об изменении комбо
	Local $nNotifyCode = BitShift($wParam, 16)
	Local $nID = BitAND($wParam, 0x0000FFFF)
	Local $hCtrl = $lParam
	Switch $nNotifyCode
		Case 9
			Switch $hCtrl
				Case $hCombo1
					$iLastRouteIndex = _GUICtrlComboBox_GetCurSel($hCombo1)
					$bNewData = True
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

Func _ReadConfig()
	If Not FileExists($sFileConfig) Then Return 0
	$iLastRouteIndex = IniRead($sFileConfig, "config", "lastrouteindex", 0)
EndFunc   ;==>_ReadConfig

Func _SaveConfig()
	If Not FileExists($sFileConfig) Then FileClose(FileOpen($sFileConfig, 8))
	IniWrite($sFileConfig, "config", "lastrouteindex", $iLastRouteIndex)
EndFunc   ;==>_SaveConfig


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

Если будет глючит закоментируй эту строчку
Код:
GUIRegisterMsg(0x0006 , "WM_ACTIVATE")
 
Автор
D

Danbury

Новичок
Сообщения
10
Репутация
0
inververs,
d1f70733f406.png

Я что то не правильно делаю ?
 
Автор
D

Danbury

Новичок
Сообщения
10
Репутация
0
inververs, благодарствую, милый человек. Есть еще добрые люди на свете.
А можно еще ко всему этому прикрутить такую штуку: "номер графика" возрастает на 1 при каждом вызове окошка, но по чекбоксу это прибавка отключается ? Было бы просто отлично. Но и то что есть - отлично! Спасибо :beer:
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Давай уточним. Каждый раз когда открывается окно Выбор графика и смены то номер графику по умолчанию в нем 1. Ты хочешь что бы он возрастал на единицу только если установлен checkbox.
 
Автор
D

Danbury

Новичок
Сообщения
10
Репутация
0
Ты хочешь что бы он возрастал на единицу только если установлен checkbox.
Да, именно так. Просто они в основном все по порядку идут, но не всегда, для этого чекбокс и нужен.
 
Автор
D

Danbury

Новичок
Сообщения
10
Репутация
0
inververs, потестил скрипт, работает как то странно. Бывает иногда без запущенного окна "выбор графика и смены", он от куда то берет информацию в комбобоксе и желаемой "заморозки" не происходит. Если не обременительно, хотелось бы разобраться в этом вопросе. Спасибо.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Замени
Код:
Global $sTitleWait = "Выбор графика и смены"

На
Код:
Global $sTitleWait = "[Title:Выбор графика и смены;Class:TFormSelMGS]"
 
Автор
D

Danbury

Новичок
Сообщения
10
Репутация
0
Ок, спасибо. Завтра попробую, отпишу. Еще с чем сегодня столкнулся, когда скрипт работает, в комбобоксе окошка "выпадает" только три графика почему то.
 
Верх