Поиск дочернего окна

Обсуждение программ nnCron и nnCron LITE

Re: Поиск дочернего окна

Postby AlikasS » Fri, 11 Oct 2013, 02:20

такой задачей можно проверить слово перед его использованием.
(можно скопировать слово в буфер и запустить задачу)
Code: Select all
#( естьлислово2
NoActive
NoLog
Action:
 S" Поиск в словаре" S" введите слово которое вы хотите проверить" CLIPBOARD 0 WIN-INPUT-TEXT 0=
 IF
   SFIND ?DUP
   IF 
      1 = IF
       N>S S" слово с призаком IMMEDIATE (1), xt по адресу " 2SWAP S+ MsgBox
      ELSE
       N>S S" слово без призаком IMMEDIATE (-1), xt по адресу " 2SWAP S+ MsgBox
      THEN
   ELSE
   S" слова " 2SWAP S+ S"  нет" S+ MsgBox
   THEN
 THEN
)#

запустив такую задачу, можно перенаправить вывод крона и посмотреть все слова выдаваемые по WORDS в файле words.txt
Code: Select all
#( перенаправление_вывода
NoActive
Action:
H-STDOUT >R
H-STDERR >R
S" words.txt" 2DUP DELETE-FILE DROP R/W MAKE-FILE DROP DUP TO H-STDOUT TO H-STDERR
    WORDS
   H-STDOUT CLOSE-FILE DROP
R> TO H-STDERR
R> TO H-STDOUT
)#
User avatar
AlikasS
 
Posts: 1437
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Поиск дочернего окна

Postby VoidVolker » Fri, 11 Oct 2013, 08:57

А я использую WORDS-LIKE из tools.spf в консоли по хоткею.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Поиск дочернего окна

Postby Burunduk » Fri, 11 Oct 2013, 09:42

AlikasS wrote:такой задачей можно проверить слово перед его использованием.
(можно скопировать слово в буфер и запустить задачу)


Спасибо!
Правда я уже тоже нашёл вариант

В кроне есть плагин tools.spf , а в нём слово

WORDS-LIKE <часть_искомого_слова>

"Ищет в словаре nnCron и выводит на консоль все найденные слова, имена которых содержат в себе аргумент, с которым вызвано слово WORDS-LIKE.
Используется в консоли. Основное применение - поиск нужного слова, когда вы не уверены в его точном написании."

WORDS-LIKE МоёНовоеСлово
если ничего не найдет, значит можно использовать.
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby Burunduk » Fri, 11 Oct 2013, 18:47

VoidVolker wrote:А зачастую проще дизассемблировать слово и примерно понять что оно там делает


А как дизассемблировать слово?

Хочу понять, например, что делает слово PAD .
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby VoidVolker » Sat, 12 Oct 2013, 10:37

Http://nncron.ru/download/plugins/vv/disasm.spf
Code: Select all
SEE word-name

Code: Select all
' word-name REST

Повторюсь еще раз, дизасм показывает только скомпилированный код, описание слова он не покажет. Для этого проще найти его в исходниках СПФ или ннкрона.
PAD - системный временный буфер для текста, используется в основном при преобразовании чисел. Реже - в других целях. Размером 256 байт.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Поиск дочернего окна

Postby Burunduk » Mon, 14 Oct 2013, 05:49

Добавил плагин extwords.spf
В консоле проверил наличие слов GET-WCLASS и GET-WTEXT.

Написал задачу SYNCHR_Cockpit , которая перебирает дочерние окна.
Вроде работает, выдаёт несколько сообщений с текстами заголовка окна (или класса),
но в конце даёт ошибку:

SYNCHR_Cockpit: Ошибка стека в Action

Вот полный текст кронтаба Magnit.tab

Code: Select all
#( LOG_START_OS
Time: START-TIME
Action:
S" Запуск операционной системы!" CRON-LOG
)#

#( SYNCHR_Cockpit
RunOnce
NoDel
Time: 0 11 14 10 * 2013
Action:
WIN-EXIST: "GPSCockpit*"
IF
   MSG: "GPSCockpit* существует."
   IF
     FOR-CHILD-WINDOWS: "*"
        \ ... выполняем работу с дочерними окнами
        \ WIN-CHILD-HWND GET-WCLASS MsgBox
         WIN-CHILD-HWND GET-WTEXT MsgBox

     ;FOR-CHILD-WINDOWS
   THEN   
ELSE
   MSG: "GPSCockpit* не найден."
THEN
)#



Всего две задачи. Еще есть ПУСТОЙ файл nnCron.tab
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby AlikasS » Mon, 14 Oct 2013, 06:20

WIN-EXIST: "GPSCockpit*"
IF
MSG: "GPSCockpit* существует."

\ где условие для следующего IF, если оно здесь нужно
IF
FOR-CHILD-WINDOWS: "*"
\ ... выполняем работу с дочерними окнами
\ WIN-CHILD-HWND GET-WCLASS MsgBox
WIN-CHILD-HWND GET-WTEXT MsgBox

;FOR-CHILD-WINDOWS
THEN

ELSE
MSG: "GPSCockpit* не найден."
THEN
)#
User avatar
AlikasS
 
Posts: 1437
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Поиск дочернего окна

Postby Burunduk » Mon, 14 Oct 2013, 08:46

AlikasS wrote:\ где условие для следующего IF, если оно здесь нужно


А почему тогда ошибка в конце задачи, а не в операторе IF ?

Получается nnCron запускает задачу с произвольным начальным стеком?

А стек, который я вижу в консоли, это другой? Он при всех прогонах задач вроде не меняется.

Вернулся первоначальному варианту

Code: Select all
WIN-EXIST: "GPSCockpit*"
IF
   MSG: "GPSCockpit* существует."
   WIN-ACTIVATE: "GPSCockpit*"
   MSG: "GPSCockpit* Активировано."
   IF
     FOR-CHILD-WINDOWS: "*"
        \ ... выполняем работу с дочерними окнами
        \ WIN-CHILD-HWND GET-WCLASS MsgBox
         WIN-CHILD-HWND GET-WTEXT MsgBox

     ;FOR-CHILD-WINDOWS
   THEN   
ELSE
   MSG: "GPSCockpit* не найден."
THEN


Первый прогон вроде удачно, а последующие прогоны опять ошибка стека.
Причем примерно из 10 прогонов 2 нормально работают.

Еще у меня сомнение в этом слове WIN-ACTIVATE: "GPSCockpit*"
В принципе, я пытаюсь сделать активными окна по шаблону. Это означает, что может быть попытка активировать несколько окон.
Не приведёт ли это к ошибке?
У меня одно главное окно с началом заголовка "GPSCockpit", а хвост меняется в зависимотсти от того, какое дочернее окно было выбрано.
Но у дочерних окон нет фразы "GPSCockpit" в начале заголовка, т.е. шаблон должен выбрать единственное окно(главное).
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby Burunduk » Mon, 14 Oct 2013, 09:25

Похоже дело было в WIN-ACTIVATE

Без него работает стабильно:

Code: Select all
WIN-EXIST: "GPSCockpit*"
IF
   MSG: "GPSCockpit* существует."
   FOR-CHILD-WINDOWS: "*"
      \ ... выполняем работу с дочерними окнами
      \ WIN-CHILD-HWND GET-WCLASS MsgBox
        WIN-CHILD-HWND GET-WTEXT MsgBox

   ;FOR-CHILD-WINDOWS
ELSE
   MSG: "GPSCockpit* не найден."
THEN

MSG: "Конец задачи."



Непонятно только почему задача не сразу обновляется? Даже если 1-2 раза нажать меню "Перечитать кронтабы".
Вроде в документации написано, что кронтабы автоматически пересчитываются раз в минуту ИЛИ СРАЗУ после сохранения отредактированной задачи.
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby AlikasS » Mon, 14 Oct 2013, 09:32

Burunduk wrote: MSG: "GPSCockpit* существует."
WIN-ACTIVATE: "GPSCockpit*"
MSG: "GPSCockpit* Активировано."
IF
FOR-CHILD-WINDOWS: "*"
\ ... выполняем работу с дочерними окнами
\ WIN-CHILD-HWND GET-WCLASS MsgBox
WIN-CHILD-HWND GET-WTEXT MsgBox

;FOR-CHILD-WINDOWS
THEN

опять те же грабли, где условие для IF?
убери IF THEN или вводи условие которое надо проверить.

конструкция
Code: Select all
MSG: "GPSCockpit* существует."
WIN-ACTIVATE: "GPSCockpit*"
MSG: "GPSCockpit* Активировано."

после себя ничего не оставляет на стеке для проверки.
возможно ты хотел использовать еще и
WIN-ACTIVE: "win_pattern"?
вот это слово даст флаг для проверки
User avatar
AlikasS
 
Posts: 1437
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Поиск дочернего окна

Postby Burunduk » Mon, 14 Oct 2013, 10:13

Burunduk wrote:возможно ты хотел использовать еще и WIN-ACTIVE: "win_pattern"?вот это слово даст флаг для проверки


Спасибо! Почему то заклинило в голове, что WIN-ACTIVATE возвращает флаг.

Отладчика в Форте, как я понял, нет. А какая-нибудь трассировка стека есть?
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby VoidVolker » Mon, 14 Oct 2013, 10:24

Burunduk wrote:А почему тогда ошибка в конце задачи, а не в операторе IF ?

Потому что ннкрон только компилирует задачу, а за то, что делает код отвечает только пользователь. IF - это такое же слово как и все остальные, оно проверяет число на стеке на равенство нулю и указывает, надо ли пропускать код до/после ELSE/THEN или его надо выполнить. Соответственно, при запуске задачи IF пытается забрать число со стека - но там ничего нет, он пуст, поэтому и возникает ошибка опустошения стека.
Burunduk wrote:Получается nnCron запускает задачу с произвольным начальным стеком?
...
Он при всех прогонах задач вроде не меняется.

Нет, каждая задача запускается со своим отдельным и пустым стеком.
Burunduk wrote:А стек, который я вижу в консоли, это другой?

Да. Для консоли тоже используется отдельный поток со своей собственной памятью и стеками.
Burunduk wrote:Вроде в документации написано, что кронтабы автоматически пересчитываются раз в минуту ИЛИ СРАЗУ после сохранения отредактированной задачи.

Да, кронтабы перечитываются раз в минуту и после изменения.
Burunduk wrote:Отладчика в Форте, как я понял, нет.

Консоль отлично справляется с задачей отладки. Кроме того, всегда можно выполнить любое слово сразу после компиляции и проверить его работу и все это произойдет автоматически после сохранения кронтаба.
Burunduk wrote:А какая-нибудь трассировка стека есть?

Стандартный вектор:
Code: Select all
OK

В extwords.spf он расширен и автоматически выводит содержимое стека.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Поиск дочернего окна

Postby Burunduk » Mon, 14 Oct 2013, 18:39

VoidVolker wrote: IF - это такое же слово как и все остальные, оно проверяет число на стеке на равенство нулю и указывает, надо ли пропускать код до/после ELSE/THEN или его надо выполнить. Соответственно, при запуске задачи IF пытается забрать число со стека - но там ничего нет, он пуст, поэтому и возникает ошибка опустошения стека.


С этим трудно спорить, но почему тогда внутренний цикл перебора окон ВЫПОЛНЯЕТСЯ, появляется штук 20 сообщений об окнах, и только потом происходит ошибка?

VoidVolker wrote:Да, кронтабы перечитываются раз в минуту и после изменения.


После изменения кронтабы перечитываются как-то не сразу. Успеваю запустить один два раза старую версию задачи. Приходится ждать очередной минуты в стиле "горячего финского парня".
Может что-нибудь в ини-файле отключено?

VoidVolker wrote:Консоль отлично справляется с задачей отладки. Кроме того, всегда можно выполнить любое слово сразу после компиляции и проверить его работу и все это произойдет автоматически после сохранения кронтаба.


Вот простая задача Мой_тест
Code: Select all
NoActive
RunOnce
NoDel
Time: 4 0 15 10 * 2013
Action:
MSG: "Привет от Удава"


В консоле слово Мой_тест выполняется без синтаксических ошибок, но результат далёк от ожидания.
Сообщения нет, в стеке какое-то левое число. Задачу поиска дочернего окна с оконными процедурами вида WIN-* тоже не отладишь в консоли.

И получается у всех задач общий словарь слов и общие глобальные переменные? Модульности нет и возможны побочные эффекты из-за совместного использования переменных?
Странно, но еще в середине 80-х в форт подобной системе из МГУ(ДССП-80) был простенький строчный отладчик. Там в строке печатался текст исполняемого слова с маркером текущего положения точки выполнения. Можно было заглянуть в стек, а потом продолжить выполнение на один шаг или до конца.

VoidVolker wrote:Стандартный вектор: OK

Т.е. для полной трассировки состояния стека мне нужно после каждого слова написать ОК :rolleyes:

Хотелось что-то типа набираем в консоли TRACE ОТЛАЖИВАЕМОЕ-СЛОВО <Return> и в файле TRACE.TXT записывается состояния стека(лучше вместе с идентификаторами слов) в соответствии с ходом выполнения программы.
Last edited by VoidVolker on Mon, 14 Oct 2013, 22:39, edited 1 time in total.
Reason: Для кода следует использовать bb-тег code
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby Burunduk » Mon, 14 Oct 2013, 19:29

VoidVolker wrote:Консоль отлично справляется с задачей отладки.


Еще странное поведение консоли:

Строка в консоли

Code: Select all
S" Привет от Удава" MsgBox


приводит, как и должно быть, к поялению
окошка с текстом Привет от Удава

но вот если это разбить на две строки

Code: Select all
S" Привет от Удава"
MsgBox


то текст в окошке искажается
Boxвет от Удава
Last edited by VoidVolker on Mon, 14 Oct 2013, 22:39, edited 1 time in total.
Reason: Для кода следует использовать bb-тег code
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby VoidVolker » Mon, 14 Oct 2013, 22:39

Burunduk wrote:Вот простая задача Мой_тест
Code: Select all
NoActive
RunOnce
NoDelTime: 4 0 15 10 * 2013
Action:
MSG: "Привет от Удава" 

В консоле слово Мой_тест выполняется без синтаксических ошибок, но результат далёк от ожидания. Сообщения нет, в стеке какое-то левое число. Задачу поиска дочернего окна с оконными процедурами вида WIN-* тоже не отладишь в консоли.

Ну так все правильно - вот это "левое число" называется идентификатор задачи, его возвращает имя задачи.
Burunduk wrote:И получается у всех задач общий словарь слов и общие глобальные переменные? Модульности нет и возможны побочные эффекты из-за совместного использования переменных?

Конечно - ведь все кронтабы читаются одним потоком. А глобальные переменные на то и глобальные - чтобы быть доступными везде. Словари есть, локальные переменные тоже - никто не мешает их использовать.
Burunduk wrote:Еще странное поведение консоли:
Строка в консоли
Code: Select all
S" Привет от Удава" MsgBox <Return>

приводит, как и должно быть, к поялению окошка с текстом Привет от Удава н
о вот если это разбить на две строки
Code: Select all
S" Привет от Удава"
MsgBox

то текст в окошке искажается:
Boxвет от Удава

Правильно, ведь форт обычно читает файлы построчно и входной буфер всего один. Соответственно каждая новая строка сохраняется в один и тот же буфер.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

PreviousNext

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 1 guest