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

Фотография

Ошибка при проверке существования окна


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

#1 mskffo

mskffo

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

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

Отправлено 16 марта 2012 - 11:57

Здравствуйте.
Никак не могу сообразить, как быть дальше, помогите...
Функции выполняются по очереди:
function OsnPost()
{
...
BK(Sotrudnik);
stat(param);
NewSpecOP();
...
}
В конце функции stat должны закрываться все окна определенного типа (это проще сделать, поскольку в зависимости от значения param этих окон может быть либо 3, либо 4):
function stat (param)
{
....
Log.Message("Закрываем открытые ранее окна");
do
{Sys.Process("ProcV8").Form("FormApp*").MDIWindow("*").Close();}
while (Sys.Process("ProcV8").Form("FormApp*").MDIWindow("*").Exists);
}

После того как закрылись все нужные окна скрипт на строке while... прерывается ошибкой: "Unable to find the object MDIWindow("*")."
Как избавиться от ошибки и продолжить выполнение основной функции?
  • 0

#2 XXX

XXX

    Опытный участник

  • Members
  • PipPipPipPip
  • 284 сообщений
  • ФИО:Денис Викторович
  • Город:Санкт-Петербург


Отправлено 16 марта 2012 - 12:06

Потому что у объекта которого не существует не может быть свойства Exists .
нужно использовать Wait

while (Sys.Process("ProcV8").Form("FormApp*").WaitMDIWindow("*",1000).Exists);

http://tctutorial.ru/synch/
  • 2

#3 NightSpirit

NightSpirit

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

  • Members
  • Pip
  • 29 сообщений


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

Кроме Wait, мне кажется, ещё предусловие вместо постусловия будет лучше, тоесть while в начало, а то получается что Вы сначала закрываете окно, потом проверяете есть ли оно. В случае, если в начале выполнения окошек не будет, получите ошибку.
  • 0

#4 anagramma

anagramma

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

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

Отправлено 16 марта 2012 - 14:18

а не проще проверять объект на Nothing

на vbs это было бы так



Do While Not Sys.Process("ProcV8").Form("FormApp*").MDIWindow("*")  Is Nothing
 	Sys.Process("ProcV8").Form("FormApp*").MDIWindow("*").Close()
Loop

  • 0

#5 mskffo

mskffo

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

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

Отправлено 19 марта 2012 - 05:24

а не проще проверять объект на Nothing

на vbs это было бы так



Do While Not Sys.Process("ProcV8").Form("FormApp*").MDIWindow("*")  Is Nothing
 	Sys.Process("ProcV8").Form("FormApp*").MDIWindow("*").Close()
Loop

Разве это не то же самое, что и Exists?
  • 0

#6 modbear

modbear

    Специалист

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

Отправлено 19 марта 2012 - 06:54

а не проще проверять объект на Nothing

на vbs это было бы так

Do While Not Sys.Process("ProcV8").Form("FormApp*").MDIWindow("*")  Is Nothing
 	Sys.Process("ProcV8").Form("FormApp*").MDIWindow("*").Close()
Loop

Разве это не то же самое, что и Exists?

Нет. Если объект MDIWindow не существует, то получим не Nothing, а ошибку в логе. Поэтому надо использовать связку WaitMDIWindow + Exists, как в ответе XXX.
  • 0

#7 mskffo

mskffo

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

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

Отправлено 19 марта 2012 - 07:38

Кроме Wait, мне кажется, ещё предусловие вместо постусловия будет лучше, тоесть while в начало, а то получается что Вы сначала закрываете окно, потом проверяете есть ли оно. В случае, если в начале выполнения окошек не будет, получите ошибку.

Если While поставить в начало (такой вариант пробовала одним из первых), то неизбежно происходит зацикливание
  • 0

#8 mskffo

mskffo

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

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

Отправлено 19 марта 2012 - 07:39

а не проще проверять объект на Nothing

на vbs это было бы так

Do While Not Sys.Process("ProcV8").Form("FormApp*").MDIWindow("*")  Is Nothing
 	Sys.Process("ProcV8").Form("FormApp*").MDIWindow("*").Close()
Loop

Разве это не то же самое, что и Exists?

Нет. Если объект MDIWindow не существует, то получим не Nothing, а ошибку в логе. Поэтому надо использовать связку WaitMDIWindow + Exists, как в ответе XXX.

Я так и сделала - работает замечательно!:)
  • 0


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

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