Что нового

Получение INSTANCE контролла

r35p3ct

Продвинутый
Сообщения
226
Репутация
60
В программе есть 2 INSTANCE контролла, вобщем они между собой иногда меняются, у контроллов нет текста, каким способом можно выявить номер. Может как нибудь по вышестоящему контролу к которому принадлежит искомый?
Просто [CLASS:TDBGridInplaceEdit] не работает, даже если фокус на нем....
Добавлено:
Сообщение автоматически объединено:

Спасибо за внимание, решение было найдено.

ControlCommand("Ы",'','[CLASS:TdfDBGrid; INSTANCE:1]',"IsVisible")
 

beaver

Чайник
Сообщения
58
Репутация
2
и в чем решение заключается? указав INSTANCE:1 будет производиться обращение к контролу с инстансом 1. А когда контролы поменяются инстансами, то получается, что мы будем уже обращаться не к тому инстансу к котрому хотели.

Или же я ошибаюсь? Просто у меня сейчас такая же проблема.
 

beaver

Чайник
Сообщения
58
Репутация
2
Естественно если программа скомпилированна один раз и более не изменяется, то и инстансы менятся не будут. У программы которую автоматизирую я постоянно происходят выпуски новых версий, а мне надо их тестировать. На форме присутствуют, например 3 поля EditBox одного класса с инстансами 1,2,3 соответственно. В новой сборке появляется четвертый EditBox у которого значение инстанса не 4, а к примеру 2. И получается что мои ранее автоматизированные EditBox'ы с инстансами 2,3 теперь имеют инстансы 3,4 и скрипт надо переделывать. :(
 

beaver

Чайник
Сообщения
58
Репутация
2
Ну а как же в таком случае идентифицировать контрол, если классы одинаковые, а инстансы меняются? Есть ли какой-то способ? Например засчет других параметров класса контрола характерных для данного экземпляра?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
356
beaver сказал(а):
Ну а как же в таком случае идентифицировать контрол, если классы одинаковые, а инстансы меняются? Есть ли какой-то способ? Например засчет других параметров класса контрола характерных для данного экземпляра?
Текст, размер, координаты
Перебор контролов с условиями
 

beaver

Чайник
Сообщения
58
Репутация
2
мне разработчики советовали обратиться к определенному свойству класса ктонрола, но как это делается я не знаю. нигде на форуме я не видел примеров как получить значение property класса конретного контрола, при условии что я знаю название класса контрола и название property.


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

WSWR сказал(а):
beaver сказал(а):
Ну а как же в таком случае идентифицировать контрол, если классы одинаковые, а инстансы меняются? Есть ли какой-то способ? Например засчет других параметров класса контрола характерных для данного экземпляра?
Текст, размер, координаты
Перебор контролов с условиями
Текст контролов в утилите AutoIt Info всегда пустые - я бы с радостью использовал. Положение меняется, если меняются инстансы.
А вот про перебор контролов с условиями - что имеется ввиду? можно подробнее пояснить?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
356
beaver сказал(а):
Текст контролов в утилите AutoIt Info всегда пустые - я бы с радостью использовал. Положение меняется, если меняются инстансы.
А вот про перебор контролов с условиями - что имеется ввиду? можно подробнее пояснить?
Ну, с пустыми edit-ми, конечно, плохо, если текста нет. Возможно, надо смотреть на соседние элементы окна - надписи и т.д., как-то соотнести их и т.п.

Здесь пример от Yashied http://autoit-script.ru/index.php?topic=3241.0
Можно получить в массив все контролы окна с хэндлами, а потом отобрать нужные. Зная хэндл, можно управлять контролом.

Кроме AutoIt Info, для получения данных об контролах можно пользоваться InqSoft Window Scanner http://kickme.to/inqsoft
В некоторых случаях лучше AutoIt Info
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
beaver
Вот пример получения различной информации об окне и его элементах на основе калькулятора:
Код:
#include <Array.au3>
#include <WinAPIEx.au3>

Run('calc.exe')
$hWin = WinWait('[Class:SciCalc]', '', 3)
If Not $hWin Then Exit
MsgBox(64, 'Info', 'Class Window: ' & _WinAPI_GetClassName($hWin))
$aData = _WinAPI_EnumChildWindows($hWin)
If Not IsArray($aData) Then Exit
ReDim $aData[$aData[0][0] + 1][8]
For $i = 1 To $aData[0][0]
	$aData[$i][2] = _WinAPI_GetDlgCtrlID($aData[$i][0])
	$aData[$i][3] = ControlGetText($hWin, '', $aData[$i][0])
	$aTemp = ControlGetPos($hWin, '', $aData[$i][0])
	If Not @error Then
		For $j = 0 To 3
			$aData[$i][$j + 4] = $aTemp[$j]
		Next
	EndIf
Next
$aData[0][1] = 'Class name'
$aData[0][2] = 'ID'
$aData[0][3] = 'Text'
$aData[0][4] = 'X'
$aData[0][5] = 'Y'
$aData[0][6] = 'Width'
$aData[0][7] = 'Height'
$sFileExe = _WinAPI_GetWindowFileName($hWin)
_ArrayDisplay($aData, $sFileExe)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
И что это за слово такое "инстансы"? Может будем говорить по-русски или писать по-английски - INSTANCE.

;)
 

beaver

Чайник
Сообщения
58
Репутация
2
madmasles сказал(а):
beaver
Вот пример получения различной информации об окне и его элементах на основе калькулятора:
Спасибо большое за помощь, но еще раз повторюсь, что мне не подходит идентификация стандартным образом. И я не хочу делать "примерно" или "вероятно".

Может быть у кого-то есть идея что сказать разработчикам добавить в код ПО, которое я тестирую, чтобы я мог однозначно идентифицировать контрол? Естественно за исключением номера INSTANCE (там есть свои внутренние заморочки). Может быть при помощи WinApi можно что-то спросить у контрола, а разработчики напишут мне метод, который будет отвечать за контрол свое уникальное имя? Есть у кого-нить идеи?
 

beaver

Чайник
Сообщения
58
Репутация
2
qsort сказал(а):
Код:
Было(до переделки):                  Надо:
TEditшурумбурум1                TEditшурумбурум8
TEditшурумбурум183              TEditшурумбурум216
TEditшурумбурум1986             TEditшурумбурум2890
……………………………………………………………………………………… и т.д.
Далее в любом редакторе выбираем нечто, вроде, "Найти и Заменить". Вся любовь. При большом желании автоматизировать-таки процесс переименования, можно, если так хочется, использовать и Autoit. Только, по-моему, напрямую в редакторе куда проще...
ЗЫ Что там сделали разработчики - понятно не совсем. Если имеется некоторое public property, (пусть оно даже и называется unicpath) то доступ к нему может быть только из програмы. Если я правильно понял, это просто свойство объекта, а не какой-то идентификатор, доступный из внешних программ.
Так что, скорей всего, этот самый unicpath может быть вытащен только в том случае, если тестирующая программа сама будет является модулем тестируемой программы, т.е. написана на том же Delphi.
С файлом соответствия - эта тема у меня сейчас так и работает. Только я в нем пишу соответствие человеческого названия поля и INSTANCE текущей сборки. Но проблема в том, что чем дальше я автоматизирую, тем больше этих соответствий становится. Сейчас их уже около 100 и время на выяснение где валится неправильный номер требуется все больше (скрипт полностью выполняется где-то около 3 часов).

А с property стало понятно. Спасибо, что объяснили о том, что доступ получить не получится. Теперь у меня остается 2 варианта:
1. Выяснить возможно ли при помощи стандартных средств WinApi выполнить какую-либо команду и получить ответ на нее в виде уникального идентификатора контрола (что-то на подобие wm_sendmessage) средствами AutoIt + стараниями разработчиков, которые заставят ПО отвечать мне.
2. Заставить разработчиков научить исполняемый EXE формировать при запуске текстовый файл, в котором будут прописаны название полей и соответствующие им INSTANCE. Далее анализировать их и уже потом начинать ходить скриптом по контролам.

Соответственно вопрос к форумчанам кто может мои догадки по п.1 подтвердить или опровергнуть, т.к. с п.2 уже понятно что делать.
 
Верх