Что нового

[Элементы GUI] Выбор строки из элемента GRID

TheAnswer

Новичок
Сообщения
9
Репутация
0
Всем доброго времени суток!
Проблема заключается в следующем: необходимо выбрать строку по некоторым условиям из такого элемента, как Grid. Условия - исходные данные, изначально задаваемые пользователем на стартовой форме, которые затем формируются в эталонную строку. Вручную позволяет так сделать - программно нет :(
Сам Grid определяется и Control Viewer'ом, и AutoIt v3 Window Info, но внутренние элементы (я думаю, что это строки таблицы и собственно саму таблицу) они не обнаруживают. Содержимое этого Grid'а можно скроллить и вверх/вниз, и вправо/влево. Через MsgBox и проверку равенства строк получил положительный ответ(Grid позволил скопировать нужную строку).
Пробовал осуществить выбор нужной строки командами ControlClick(...) и ControlCommand(...), опционально выбирая 'SelectString' и подсовывая эталонную строку, но всё безрезультатно. Класс Grid'а: [OBWA600Grid]. Его ID: [CLASS:2; ID:152].

Очень нужна помощь с решением этого вопроса.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
+1 заинтересованный наблюдатель.
Не то чтобы мне нужно было для чего-то. Но вопрос "А как можно работать с Grid?" в голове возникал. :scratch:
И Au3Info, и wInformer "видят" только сам Grid целиком и ту строку Grid, которая сейчас выбрана.
Вопрос, как и у ТС, в выборе(активации) нужной строки Grid.
Так что, если у кого-то есть опыт работы с Grid, поделитесь, пожалуйста.
 

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
Grid'ы бывают разные - у каждого разработчика свой. Некоторые откликаются на сообщения для listview, некоторые - для listbox. Бывают такие, которые поддерживают UIAutomation. Но большинство ни на что не реагируют, кроме мыши и клавиатуры. С такими обычно работа сводится к клику/контролклику в первую ячейку, затем расчёт нажатий вправо-вниз. Либо можно найти пиксель выделения и рассчитать по высоте строк выделенную (тут проблема с прокруткой). Если ячейки известного размера, то можно кликать то координатам ячеек. Как правило нажатие enter или двойной клик позволяет редактировать ячейку (или появляется список). В этом случае можно считать данные стандартными средствами для Edit или Combo.

Как получить доступ к ячейкам элемента Grid языка Visual Basic
 
Автор
T

TheAnswer

Новичок
Сообщения
9
Репутация
0
Спасибо за оперативные ответы. Я читал тему по прикрепленной ссылке. В моем случае положение эталонной строки в Grid'е динамично, т.к. в этот элемент информация попадает из базы данных(информация в которой частенько обновляется), соответственно привязаться к координатам не вариант. Если бы можно было как-то получить двумерный массив из этого Grid'а, то во внутреннем цикле проверял бы выполнение условия и кликал бы на эту строку. Беда в том, что ни с listview, ни с listbox текущий grid не ассоциируется. Могу ли Я что-то сделать, зная handle этого Grid'а?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
А мне вариант с расчетом нажатий на стрелку вниз кажется подходящим.
Только в том гриде, с которым я сталкивался, нельзя было уйти с поля обязательного к заполнению.
Когда снова столкнусь с каким-нибудь гридом надо будет поэкспериментировать.
 

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
TheAnswer
получить двумерный массив
Копировать содержимое ячейки в буфер обмена получается? Может там несколько строк можно выделить и скопировать?
Редактирование ячеек поддерживается? Какие-либо ещё трансформации ячеек, кроме отображения текста, имеются?
Взглянуть на этот Grid можно?
 
Автор
T

TheAnswer

Новичок
Сообщения
9
Репутация
0
C2H5OH
Все эти тулы для идентификации элементов GUI видят только Grid и ту строку, которую выделяешь. Сейчас потыкался ещё и CV(ControlViewer) показывает ID элементов выделенной строки. Выделяя другие строки, ID элементов строки остаются прежними, а значения меняются. А какую функцию использовать для перемещения элементам вниз по grid'у? Возможно, что я мало искал, т.к. не нашел перемещения с использованием handle'а элемента. Спасибо за возможный вариант решения.

InnI
1. Получается.
2. Да, можно.
3. Не поддерживается.
4. Если кликать по элементам шапки грида(столбцы), то происходит сортировка. Больше никаких трансформаций.
5. Можно
 

Вложения

  • Ученики.jpg
    Ученики.jpg
    19.6 КБ · Просмотры: 22

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
TheAnswer
только Grid и по строку, которую выделяешь
Они видят текст строки? Попробуйте
Код:
ControlGetText()


ID элементов строки остаются прежними, а значения меняются
Вот тут не понял, какие значения меняются?

какую функцию использовать для перемещения элементам вниз
Код:
ControlSend("Title", "", "ControlID", "{down}")


Если можно выделить все строки и скопировать в буфер обмена, то посмотрите какими клавишами это можно сделать. Обычно выделяется первая строка, нажимается Shift+End или Shift+PgDn или Shift+Ctrl+End или Ctrl+A (выделяются все строки) и копируется всё это в буфер. Затем забираем из буфера и обрабатываем.

Утилиту Inspect из темы UIAutomate пробовали? Различает она отдельные ячейки таблицы?
 
Автор
T

TheAnswer

Новичок
Сообщения
9
Репутация
0
Спасибо за совет по командам, буду пробовать. Отпишу об этом.
Если выделять разные строки, то ID элементов этой строки остаются прежними. Например, берем 1-ую строку, элемент Static имеет ID = 20, а значение "18". Выделяем третью строку, значение Static будет равно "17", а его ID по-прежнему равен 20.
Утилиту Inspect пробовал, отдельные ячейки не различает.
 

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
TheAnswer
У вас там строки из статиков, что ли, состоят? Или столбцы? :stars:

Выделяем третью строку, значение Static будет равно "17"
Обратите внимание, в какую ячейку вы кликаете для выделения строки. Возможно, таблица возвращает текст выделенной ячейки, т.е. той, которая в фокусе (в которую кликнули). Тогда можно их по порядку все прокликать и собрать массив.
 
Автор
T

TheAnswer

Новичок
Сообщения
9
Репутация
0
Я понятия не имею на чем написана эта программа. Целые кучи разгребал пока писал отдельные шаги скрипта. Порой приходилось на горячие клавиши назначать, т.к. CV и прочие тулы не всегда находили элементы управления.

Да, это решение мне в голову пришло после того, как Я Вам написал про постоянный ID. Тем не менее, спасибо.
Возможно, это не все вопросы - в скоро времени напишу Вам.


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

И снова доброго времени суток!
Я решил проблему по Вашим советам, спасибо большое!
Решение было таковым:
1. Выделенная строка состояла из нескольких элементов, у которых можно было посмотреть текстовые значения. Получал их с помощью команды ControlGetText() и сравнивал с исходными данными.
2. Если элементы не удовлетворяли исходным значениям, то спускался на строку ниже и также сравнивал значения её элементов и исходными.
3. Если сравнения удовлетворяли условиям, то нажимал на клавишу и переходил по следующим шагам.

Для решения была написана рекурсивная функция, проверяющая условия.

На случай, если кто-то столкнется с похожей задачей:
Код:
Func checkCondition()
   $curFIO = ControlGetText("Ученики", "", 214)
   $curCl = ControlGetText("Ученики", "", 215)
   $curLit = ControlGetText("Ученики", "", 216)
   $curAge = ControlGetText("Ученики", "", 217)
   $curSB = ControlGetText("Ученики", "", 218)
   
   If $curFIO == $fio And $curCl == $cl And $curLit == $lit And $curAge = $age And $curSB == $sb Then
	     ControlClick("Ученики", "Согласен", "Button8")
	     WinWaitActive("Подтверждение")
	     ControlClick("Подтверждение", "OK", "Button1")
	     WinActivate("Ученики")
	     ControlClick("Ученики", "Далее", "Button26")
   Else
	     ControlSend("Ученики", "", "[CLASS:OBWA600Grid; INSTANCE:2]", "{down}")
             checkCondition()
   EndIf
EndFunc


Соглашусь с критикой от опытного человека по поводу написания кода :smile: Возможно, что он подлежит рефакторингу и оптимизации :smile:
 
Верх