Перейти к содержимому

Фотография

Найти значение свойства


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 8

#1 mskffo

mskffo

    Новый участник

  • Members
  • Pip
  • 63 сообщений
  • ФИО:Мария
  • Город:Москва

Отправлено 12 марта 2012 - 07:24

Доброго дня.
Мучаюсь с проблемой.
При нажатии каких-либо кнопок в окнах приложения могут появиться информационные окна (пример приложила). Название самого окна всегда одинаковое, но в нем содержится либо информация об ошибке, либо просто какое-то сообщение, либо вопрос о подтверждении какого-либо действия.
Текст сообщения представляет собой отдельный элемент формы, в Object Browser он выглядит так:
Sys.Process("prov8").Popup("Сообщение").Window("V8FormElement", "", 4).TextObject('Значение поля "Код" не уникально') (Если в окне две и более кнопок выделенный индекс меняется).
Конкретный текст сообщения я находила примерно так:
var wnd = Sys.Process("prov8").Popup("Сообщение");
if (wnd.FindChild("Text","Удалить запись?",2).Exists)
{...}

Задача сводится к тому, чтобы получить значение свойства Text и в зависимости от результата либо просто закрывать это окошко, либо прерывать выполнение скрипта и помещать скрин окна в лог.
По идее здесь нужно использовать конструкцию switch, однако до нее я пока не дошла - не понимаю, как получить значение свойства?

Прикрепленные файлы

  • Прикрепленный файл  окно.png   1,99К   17 Количество загрузок:

  • 0

#2 anagramma

anagramma

    Активный участник

  • Members
  • PipPip
  • 87 сообщений
  • Город:Moskow

Отправлено 12 марта 2012 - 07:58

Может так?


var wnd = Sys.Process("prov8").Popup("Сообщение");
var txt="";
if wnd.Exists
{
txt = wnd.FindChild("WndClass","Static",2).Text;
//далее анализируем txt, можно и при помощи case

}


Короче вначале определяем есть ли окно, а потом ищем текстовый элемент. Вашего объекта у меня нет =) поэтому для примера WndClass - искомое свойство класса, Static - имя класса(искомой текстовой строки). И берем свойство Text (свойство содержащее искомый текст).
P.S. мог накосячить в синтаксисе.
  • 0

#3 mskffo

mskffo

    Новый участник

  • Members
  • Pip
  • 63 сообщений
  • ФИО:Мария
  • Город:Москва

Отправлено 13 марта 2012 - 04:48

Может так?


var wnd = Sys.Process("prov8").Popup("Сообщение");
var txt="";
if wnd.Exists
{
txt = wnd.FindChild("WndClass","Static",2).Text;
//далее анализируем txt, можно и при помощи case

}


Короче вначале определяем есть ли окно, а потом ищем текстовый элемент. Вашего объекта у меня нет =) поэтому для примера WndClass - искомое свойство класса, Static - имя класса(искомой текстовой строки). И берем свойство Text (свойство содержащее искомый текст).
P.S. мог накосячить в синтаксисе.

По-моему, не совсем то...при появлении окна сообщения заранее не известно, что в окне написано...
  • 0

#4 modbear

modbear

    Специалист

  • Members
  • PipPipPipPipPip
  • 548 сообщений

Отправлено 13 марта 2012 - 06:42

Попробуйте как-нибудь так:
var oText = Sys.Process("prov8").Popup("Сообщение").FindChild("Name", "TextObject*", 1);
// или
var oText = Sys.Process("prov8").Popup("Сообщение").FindChild("Text", "*", 1);

if (oText.Exists) {
  switch (oText.Text) {
    case "Значение поля \"Код\" не уникально":
      // Сделать что-нибудь
      break;
    case "Удалить запись?":
      // Сделать что-нибудь еще
      break;
    default:
      // Какой-то другой вариант
  }
}

  • 0

#5 mskffo

mskffo

    Новый участник

  • Members
  • Pip
  • 63 сообщений
  • ФИО:Мария
  • Город:Москва

Отправлено 13 марта 2012 - 09:35

Попробуйте как-нибудь так:

var oText = Sys.Process("prov8").Popup("Сообщение").FindChild("Name", "TextObject*", 1);
// или
var oText = Sys.Process("prov8").Popup("Сообщение").FindChild("Text", "*", 1);

if (oText.Exists) {
  switch (oText.Text) {
    case "Значение поля \"Код\" не уникально":
      // Сделать что-нибудь
      break;
    case "Удалить запись?":
      // Сделать что-нибудь еще
      break;
    default:
      // Какой-то другой вариант
  }
}

Такая функция возвращает текст, написанный на элементе окна с индексом 1 (почти всегда какая-то кнопка).
  • 0

#6 modbear

modbear

    Специалист

  • Members
  • PipPipPipPipPip
  • 548 сообщений

Отправлено 13 марта 2012 - 10:10

Такая функция возвращает текст, написанный на элементе окна с индексом 1 (почти всегда какая-то кнопка).

А какой индекс у TextObject'а с текстом сообщения? Если он всегда один и тот же, добавьте его в условие поиска:
var oText = Sys.Process("prov8").Popup("Сообщение").FindChild(
  ["Name", "Index"],
  ["TextObject*", 5], // <--- заменить 5 на индекс нужного TextObject'а
  1);

  • 0

#7 mskffo

mskffo

    Новый участник

  • Members
  • Pip
  • 63 сообщений
  • ФИО:Мария
  • Город:Москва

Отправлено 13 марта 2012 - 10:19

Такая функция возвращает текст, написанный на элементе окна с индексом 1 (почти всегда какая-то кнопка).

А какой индекс у TextObject'а с текстом сообщения? Если он всегда один и тот же, добавьте его в условие поиска:
var oText = Sys.Process("prov8").Popup("Сообщение").FindChild(
  ["Name", "Index"],
  ["TextObject*", 5], // <--- заменить 5 на индекс нужного TextObject'а
  1);

В том-то и дело, что индекс может быть любым...путем долгих поисков и анализа, я пришла к выводу, что TextObject с текстом сообщения - последний элемент окна, имеющий свойство Text.
  • 0

#8 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 14 марта 2012 - 10:29

Можно вместо FindChild использовать FindAllChildren для получения массива всех объектов Text в окне. Потом перебрать все полученные объекты, отфильтровывая те, текст которых есть в неком предопределённом списке стандартных строк ('ОК', 'Отмена', 'Да', 'Нет', 'Закрыть' и т.п.). Как только найдётся текст не из списка, то его и берём.
  • 0
С уважением,
Дмитрий

#9 mskffo

mskffo

    Новый участник

  • Members
  • Pip
  • 63 сообщений
  • ФИО:Мария
  • Город:Москва

Отправлено 14 марта 2012 - 13:07

Можно вместо FindChild использовать FindAllChildren для получения массива всех объектов Text в окне. Потом перебрать все полученные объекты, отфильтровывая те, текст которых есть в неком предопределённом списке стандартных строк ('ОК', 'Отмена', 'Да', 'Нет', 'Закрыть' и т.п.). Как только найдётся текст не из списка, то его и берём.

Дмитрий, мне нравится Ваша идея, буду работать в этом направлении...
  • 0


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных