Добраться до поля ввода формы

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

Добраться до поля ввода формы

Postby Draga » Wed, 28 Sep 2016, 10:37

Приветствую.
Есть приложение с MDI интерфейсом. В одном из окон "Параметры" есть множество полей, из некоторых надо считать значения.
До окна добрался так:
FOR-WINDOWS: "Приложение*"
FOR-CHILD-WINDOWS: "Параметры*"
MSG: "%WIN-CHILD-HWND% %FOUND-CHILD-WINDOW%"
;FOR-CHILD-WINDOWS
;FOR-WINDOWS

Если верить программе "Window Scanner" это окно содержит: нечто класса "Centura:FormToolBar" и "Centura:Form"
В "Centura:Form" есть много элементов. Из одного (их многих) поля ввода класса "Edit"(нужное мне в иерархии всегда второе, первое Static) мне надо считать значение. На скриншоте это "15229". Как?
Следом (после ещё одного статика) есть ещё комбобокс. Из него тоже хотелось бы считать значение. На скриншоте это "27.09.2016".Как?

Image

ЗЫ nnCron 1.93 b15, Win XP, 7, 10
Draga
 
Posts: 8
Joined: Thu, 04 May 2006, 08:02

Re: Добраться до поля ввода формы

Postby dothen » Thu, 29 Sep 2016, 07:31

Сначала задача должна найти дочерние окна и вычислить их относительные координаты.
Затем надо руками вписать в константы координаты нужных окон, и закомментировать выделенный кусок.

Code: Select all
#( Task_Found_Child_Window
 NoActive
0 CONSTANT X1 \ Сюда надо вписать относительные координаты выбранных окон.
0 CONSTANT Y1
0 CONSTANT X2
0 CONSTANT Y2
\ 0 CONSTANT X3
\ 0 CONSTANT Y3
0 VALUE hwin
Action:
    0 TO hwin
    FOR-WINDOWS: "Приложение*"
      FOR-CHILD-WINDOWS: "Параметры*"
        WIN-CHILD-HWND TO hwin
      ;FOR-CHILD-WINDOWS
    ;FOR-WINDOWS
    hwin
    IF
      hwin TO WIN-HWND
      TRUE
    ELSE
      WIN-EXIST: "Параметры*"
      WIN-HWND GET-WCLASS S" Centura:AccFrame" COMPARE 0= AND
    THEN
    IF
      FOR-CHILD-WINDOWS: "Edit"
        WIN-CHILD-HWND WIN-POS
        WIN-HWND WIN-POS
        ROT SWAP - -ROT - 2>R \ Вычисляем относительные координаты дочернего окна.
\ ----------------------------------
\ Это можно будет закомментировать
  WIN-CHILD-HWND .H
  2R@ ."  (" . . ." )  "
  WIN-CHILD-HWND GET-WTEXT TYPE CR
\ ----------------------------------
        2R@ Y1 X1 D=
        2R@ Y2 X2 D= OR
\        2R@ Y3 X3 D= OR
        IF
          WIN-CHILD-HWND GET-WTEXT TYPE CR
          MSG: "%WIN-CHILD-HWND GET-WTEXT%"
        THEN
        RDROP RDROP
      ;FOR-CHILD-WINDOWS
    THEN
)#

Надо подключить плагин extwords.spf
Last edited by dothen on Sat, 01 Oct 2016, 14:32, edited 1 time in total.
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Добраться до поля ввода формы

Postby VoidVolker » Fri, 30 Sep 2016, 14:54

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

Re: Добраться до поля ввода формы

Postby Draga » Tue, 04 Oct 2016, 16:25

Спасибо за подсказку GET-WTEXT.
Делаю перебором. Пока вырисовывается такое
Code: Select all
#( test_win_2
NoActive
VARIABLE nEdit2
CREATE txtNum 256 ALLOT
CREATE txtDate 256 ALLOT
Action:
0 nEdit2 !
FOR-WINDOWS: "Приложение*"
    FOR-CHILD-WINDOWS: "Edit"
        nEdit2 1+!
        nEdit2 @
        CASE
           \ поле ввода 1
           1 OF
                MSG: "msg1-1 %WIN-CHILD-HWND GET-WTEXT%"
                S" %WIN-CHILD-HWND GET-WTEXT%" txtNum PLACE
                MSG: "msg1-2 %txtNum%"
      ENDOF
           \ поле ввода 2
           2 OF
      MSG: "msg2 %WIN-CHILD-HWND GET-WTEXT%"
      ENDOF
           \ остальные поля
           \ DUP OF  ENDOF
        ENDCASE
    ;FOR-CHILD-WINDOWS
;FOR-WINDOWS
)#

Проблема - поместить %WIN-CHILD-HWND GET-WTEXT% (это текст из первого поля ввода) в переменную txtNum. Аналогично надо получить переменную txtDate. Как?
Затем значения переменных надо сбросить в текстовой файл. В отдельной задаче буду его считывать и создать папку с именем "15229_20160927"
Draga
 
Posts: 8
Joined: Thu, 04 May 2006, 08:02

Re: Добраться до поля ввода формы

Postby dothen » Thu, 06 Oct 2016, 10:38

Вот так.
Code: Select all

#( test_win_2
NoActive
VARIABLE nEdit2
CREATE txtNum 256 ALLOT
CREATE txtDate 256 ALLOT
Action:
    0 nEdit2 !
    WIN-EXIST: "Параметры*"
    WIN-HWND GET-WCLASS S" Centura:AccFrame" COMPARE 0= AND
    IF
\    FOR-WINDOWS: "Параметры*"     \ или Приложение* ?
      FOR-CHILD-WINDOWS: "Edit"
        nEdit2 1+!
        nEdit2 @
        CASE
          1 OF \ поле ввода 1
               MSG: "msg1-1 %WIN-CHILD-HWND GET-WTEXT%"
               WIN-CHILD-HWND GET-WTEXT txtNum PLACE
               MSG: "msg1-2 %txtNum COUNT%"
          ENDOF
          2 OF \ поле ввода 2
               MSG: "msg2-1 %WIN-CHILD-HWND GET-WTEXT%"
               WIN-CHILD-HWND GET-WTEXT txtDate PLACE
               MSG: "msg2-2 %txtDate COUNT%"
          ENDOF
           \ остальные поля
           \ DUP OF  ENDOF
        ENDCASE
      ;FOR-CHILD-WINDOWS
\    ;FOR-WINDOWS
    \ Сохранить строку в файл.
    txtNum COUNT S" _" S+ txtDate COUNT SDD.MM.YYYY >R >R N>S S+ R> N>S S+ R> N>S S+ S" f:\EditBox.txt" FWRITE
\ Еще примеры:
\   txtNum COUNT S" _" S+ txtDate COUNT SDD.MM.YYYY YMD>DATE DATE>S S+ S" f:\EditBox.txt" FWRITE
\   txtNum COUNT S" _" S+ txtDate COUNT [CHAR] . [CHAR] _ CharReplace S+ S" f:\EditBox.txt" FWRITE
\   txtNum COUNT S" _" S+ txtDate COUNT S+ S" f:\EditBox.txt" FWRITE \ Сохранить как есть.
\   S" _" txtNum +PLACE txtDate COUNT txtNum +PLACE txtNum COUNT S" f:\EditBox.txt" FWRITE \ То же самое.
    THEN
)#

Last edited by dothen on Thu, 06 Oct 2016, 13:05, edited 1 time in total.
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Добраться до поля ввода формы

Postby Draga » Thu, 06 Oct 2016, 12:06

test_win_2: Ошибка стека в Action:
Draga
 
Posts: 8
Joined: Thu, 04 May 2006, 08:02

Re: Добраться до поля ввода формы

Postby dothen » Thu, 06 Oct 2016, 13:09

AND не было, исправил.
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Добраться до поля ввода формы

Postby Draga » Thu, 06 Oct 2016, 13:48

За синтаксис, спасибо. Так задача "корректна".
Но данная задача не работает, т.к. в моём MDI приложении "Параметры*" - дочернее окно, и WIN-EXIST'ом можно найти только основное окно "Приложение"
Draga
 
Posts: 8
Joined: Thu, 04 May 2006, 08:02

Re: Добраться до поля ввода формы

Postby dothen » Thu, 06 Oct 2016, 16:40

Ну а вот так чего-нибудь находит?

Code: Select all
#( test_win_3
NoActive
Action:
    WIN-EXIST: "Приложение*"
    IF
    FOR-WINDOWS: "Приложение*"
      FOR-CHILD-WINDOWS: "Edit"
          WIN-CHILD-HWND GET-WTEXT MsgBox
      ;FOR-CHILD-WINDOWS
    ;FOR-WINDOWS
    ELSE
      S" Окно Приложение* не найдено" MsgBox
    THEN
)#

Или так:
Code: Select all
#( test_win_4
NoActive
0 VALUE hwin
Action:
    0 TO hwin
    WIN-EXIST: "Приложение*"
    IF
      FOR-WINDOWS: "Приложение*"
        FOR-CHILD-WINDOWS: "Параметры*"
            WIN-CHILD-HWND TO hwin
            WIN-CHILD-HWND GET-WTEXT MsgBox
        ;FOR-CHILD-WINDOWS
      ;FOR-WINDOWS
      hwin
      IF
        hwin TO WIN-HWND
        FOR-CHILD-WINDOWS: "Edit"
            WIN-CHILD-HWND GET-WTEXT MsgBox
        ;FOR-CHILD-WINDOWS
      ELSE
        S" Окно Параметры* не найдено" MsgBox
      THEN
    ELSE
      S" Окно Приложение* не найдено" MsgBox
    THEN
)#
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Добраться до поля ввода формы

Postby Draga » Fri, 07 Oct 2016, 16:34

Оба варианта работают. Спасибо.
На основе 2-го подправил своё и двигаюсь дальше в решении своей задачи.
Draga
 
Posts: 8
Joined: Thu, 04 May 2006, 08:02

Re: Добраться до поля ввода формы

Postby Draga » Tue, 18 Oct 2016, 14:55

Ещё вопросы по синтаксису.
Мне надо выполнять код, если txtNum имеет вид только '0123456' или 'м0123456', т.е. ЧИСЛО или мЧИСЛО
Данная конструкция не работает:
Code: Select all
RE-MATCH: "%txtNum%" "/^м[0-9]/"
RE-MATCH: "%txtNum%" "/^[0-9]/"  OR
IF
   / работаем
THEN

Подправьте, пожалуйста, синтаксис.
Пустая txtNum тоже должна не пропускаться.

Как отдельно проверить строковую переменную на пустоту? Эта конструкция ошибочна:
Code: Select all
S" " txtNum COMPARE 0=
IF
        MSG: "%txtNum COUNT%"
THEN
Draga
 
Posts: 8
Joined: Thu, 04 May 2006, 08:02

Re: Добраться до поля ввода формы

Postby dothen » Tue, 18 Oct 2016, 16:44

Вот задача для примера:
Code: Select all
#( task-txtNum
 NoActive
CREATE txtNum 256 ALLOT
Action:
  S" м712653" txtNum PLACE \ пример
\ S" " txtNum PLACE           \ пример - пустая строка

  txtNum C@
  IF \ Если строка не пустая
\    RE-MATCH: "%txtNum COUNT%" "/^м*\d+$/"   \ или так:  "/^м*[0-9]+$/"
    RE-MATCH: "%txtNum COUNT%" "/^м*\d{6}$/"
    IF
      MSG: "OK:   %txtNum COUNT%"
    ELSE
      MSG: "В строке %txtNum COUNT% нет искомой подстроки"
    THEN
  ELSE
      MSG: "Пустая строка %txtNum COUNT%"
  THEN
)#
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Добраться до поля ввода формы

Postby VoidVolker » Thu, 20 Oct 2016, 08:39

Code: Select all
S" строка" NIP IF ." Строка не пустая" ELSE ." Строка пустая" THEN
S" " NIP IF ." Строка не пустая" ELSE ." Строка пустая" THEN

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

Re: Добраться до поля ввода формы

Postby Draga » Wed, 26 Oct 2016, 12:15

Всем: спасибо.
В принципе задачу реализовал.
Осталась одна проблемка, но за почти неделю эксплуатации она ни разу не возникла.
Сейчас триггером запуска задачи является изменение файлов в папке (контрольные файлы изменились -> задача считала поле из открытой формы и выполнила требуемое).
Задача nncron запускается 1 раз в минуту.
Вероятна ситуация, когда задача запустится, пользователь уже закроет форму и задаче уже негде будет брать данные (хотя повторюсь, если верить логу, пользователи не торопятся и таких проколов не было).
Или ещё хуже, а к моменту запуска задачи пользователь уже открыл форму с параметрами другого заказа (надеюсь этой ситуации не было).
Так вот, что б такой ситуации точно не возникло, думаю разбить задачу на две.
1-я - считывание данных из формы и запоминание номера.
2-я - при изменение контрольных файлов в папке, выполнение требуемых действий с использованием запомненного номера в 1-ой задаче.
Вопрос такой. События появления дочернего окна нет. Поэтому при появлении/активации окна программы надо постоянно сканить дочерние окна в ожидании требуемого с заголовком "Параметры*". Постоянный цикл, думаю, может загрузить проц на 100%. Можно ли сделать цикл с задержкой, например, 1 сек?
Draga
 
Posts: 8
Joined: Thu, 04 May 2006, 08:02

Re: Добраться до поля ввода формы

Postby VoidVolker » Wed, 26 Oct 2016, 20:26

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


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Bing [Bot] and 3 guests

cron