Что нового

Запуск функции в зависимости от выделенной строки

Авдей

Новичок
Сообщения
12
Репутация
0
Всем доброго времени суток!
Продолжая изучать AutoIT и пытаться автоматизировать программу на работе, на конечном этапе столкнулся с одной проблемой.
Есть код вида
Код:
$var='предоплата'                           ;схема или предоплатная
$var2='%'                                         ;или отсрочка (там есть знак %)

;второй строкой (иногда первой) идет
$var3='Выдача скидки'

$dataend1=@MDAY&@MON&@YEAR          ;дата закрытия старой схемы  (текущая дата)
$datanew='0'&(@MDAY+1)&@MON&@YEAR  ;дата открытия новой схемы=тек.дата +1день  (тут почему то выводит в формате 3.11.2015, поэтому пришлось добавить 0)
$dataend=@MDAY&@MON&(@YEAR+1)        ;дата закрытия новой схемы = тек.дата + 1 год
    
WinActivate('Схемы работы контрагента','')    ;активируем окно со схемами
send('{PGUP}')                                                 ;смещаемся на верхнюю строчку в схемах
  $i=ControlTreeView('Схемы работы контрагента','','[CLASS:TTreeView; INSTANCE:1]','GetSelected')  ;считываем выделенную строку
  $aRes = StringInStr($i, $var)                  ;проверяем есть ли нужное нам слово в строке
  $aRes2 = StringInStr($i, $var2)
  $aRes3 = StringInStr($i, $var3)

Select
    Case $aRes>0           ;Если предоплата то
        DataEnd()              ;закрываем старую схема
             sleep(500)
                       DataNewSh()    ;открываем новую схему

    Case $aRes2>0        ;если отсрочка (%) то.....
         DataEnd()          
              sleep(500)
                        DataNewSh()
    Сase $aRes3>0       ;Если Выдача скидки то....
          DataEnd()
               sleep(500)
                        DataNewSSKID()
 EndSelect

Func DataEnd()    ;просто закрывает схему текущей датой
ControlClick('Схемы работы контрагента','','[CLASS:TButton; INSTANCE:1]','left')
WinWait('Ввод дат действия схемы','')
ControlSend ('Ввод дат действия схемы', '', '[CLASS:TDateEdit; INSTANCE:1]', $dataend1)
send('{F2}')
EndFunc

Func DataNewSh()    ;открывает новую схему завтрашней датой с окончанием плюс 1 год
ControlClick('Схемы работы контрагента','','[CLASS:TBitBtn; INSTANCE:1]','left')
WinWait('Схемы работы','','[CLASS:TFormGet2DateAndLib')
ControlFocus ('Схемы работы', '', '[CLASS:TDateEdit; INSTANCE:2]')
send('{NUMPADADD}')                                                                                                                     так решил проблему с отображение даты на +1 день
ControlSend ('Схемы работы', '', '[CLASS:TDateEdit; INSTANCE:1]', $dataend)              ;
send('{F2}')
winwait('Внимание...','Вы уверены, что хотите назначить схему по умолчанию?')
ControlClick('Внимание...','Вы уверены, что хотите назначить схему по умолчанию?','[CLASS:Button; INSTANCE:1]','left')
EndFunc

Func DataNewSSKID()    ;открывает новую схему завтрашней датой с окончанием плюс 1 год
ControlFocus ('Схемы работы контрагента', '', '[CLASS:TTreeView; INSTANCE:1]')
ControlClick('Схемы работы контрагента','','[CLASS:TBitBtn; INSTANCE:1]','left')
WinWait('Схемы работы','','[CLASS:TFormGet2DateAndLib')
ControlFocus ('Схемы работы', '', '[CLASS:TDateEdit; INSTANCE:2]')
send('{NUMPADADD}')
ControlSend ('Схемы работы', '', '[CLASS:TDateEdit; INSTANCE:1]', $dataend)
send('{F2}')
EndFunc


и в чем у меня проблема! программа написана на Delfi, считать сразу две строки я не могу..то есть за раз считывается только 1 строка (предоплата, % или выдача скидки) при этом в окне одновременно могут быть или (1 строка=предоплата, 2 строка= выдача скидки) или (1 строка= Отсрочка (%), 2 строка= Выдача скидки), то есть меняется только Предоплата или Отсрочка, Выдача скидки постоянно присутствует.и данные строки могут быть в произвольном порядке.То есть иногда Выдача скидки находится на первой позиции и иногда после действий с одной строкой, она меняется местами со второй, то есть верхняя становится нижней, нижняя верхней! (понимаю что по дурацки сделана прога, но тут не я виноват :smile:)

Вопрос?
Как организовать перебор (типа If , Select,Case...) чтоб бы по очереди выполнить действия: проверить что за строка сейчас выделена, в зависимости от Предоплата или отсрочка выполнить одно действие..заново установить фокус, считать строку выделенную, проверить, не прошлая ли строка сейчас выделена и сместиться на другую строку и выполнить действия с ВЫДАЧА СКИДКИ..Ну или наоборот, неважно какая строка первой идет...порядок строк меняется постоянно :(
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: Выполнение цикла

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"Выполнение цикла" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, ваш Модератор.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Re: Выполнение цикла

Если ты тоже ничего не понял, ставь лайк
 
Автор
А

Авдей

Новичок
Сообщения
12
Репутация
0
Вам хорошо смеяться :( А я уже всю голову сломал как сделать :(
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Авдей у вас вроде правильно, считываете текущую строку, если там предоплата, то одно действие, если скидка - то другое итд.
Код:
Local $currentSelected = ControlTreeView(...)
Select
	Case StringInStr($currentSelected, 'предоплата')
		;Выделено Предоплата
	Case StringInStr($currentSelected, '%')
		;Выделено Отсрочка
	Case StringInStr($currentSelected, 'Выдача скидки')
		;Выделено Выдача скидки
EndSelect

Если вам нужно узнать порядок, в котором сейчас данные, и если я правильно понял, то StringInStr как раз возвращает позицию совпадения. Определите позицию каждого слова, если находится, то добавляете ее в массив, затем отсортируйте его. Так вы узнаете что сперва идет, к примеру, предоплата - выдача скидки, или отсрочка - выдача скидки.

Что бы действия повторить, оберните получение строки и всю конструкцию Select в цикл For.

Авдей [?]
проверить, не прошлая ли строка сейчас выделена
для этого заведите вторую переменную, где и храните прошлое выделение. В цикле, после получения текущей строки, сравните с сохраненной, если они равны, значит вы остались на предыдущей позиции, сделайте переход к следующей и повторите цикл ContinueLoop.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Код:
$datanew='0'&(@MDAY+1)&@MON&@YEAR  ;дата открытия новой схемы=тек.дата +1день  (тут почему то выводит в формате 3.11.2015, поэтому пришлось добавить 0)
, а что будет после 10 числа ? 010,011,012...? Здесь ,если уж первый ноль важен можно применить
Код:
$datanew=StringFormat("%02d%02d%04d\n",@MDAY+1,@MON,@YEAR)
 
Автор
А

Авдей

Новичок
Сообщения
12
Репутация
0
для этого заведите вторую переменную, где и храните прошлое выделение. В цикле, после получения текущей строки, сравните с сохраненной, если они равны, значит вы остались на предыдущей позиции, сделайте переход к следующей и повторите цикл ContinueLoop.
а поподробнее можно?Просто с первым выделением проблем нету, все отлично работает..Но после прохода первой функции, часто строки меняются местами (почему так происходит, не знаю)..приходится опять смещаться в самый верх и начинать считывать! и вот тут начинаются у меня проблемы


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

ra4o сказал(а):
[/autoit], а что будет после 10 числа ? 010,011,012...? Здесь ,если уж первый ноль важен можно применить
Код:
$datanew=StringFormat("%02d%02d%04d\n",@MDAY+1,@MON,@YEAR)
Вот за это спасибо! буду знать что делать :smile:
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Посмотрите библиотеку "GuiTreeView.au3", может облегчит Вашу задачу ? Вам в любом случае нужно считывать в цикле с первой строки. При первом чтении новой переменной присваиваете значение прочтенной строки, при повторном проходе - сравниваете значение этой переменной с тем, что прочли - совпало, значит переходите к след.строке, нет- работаете с этой и обнуляете переменную.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Авдей
считать сразу две строки я не могу
А так?
Код:
WinActivate('Схемы работы контрагента','') ;активируем окно со схемами
send('{PGUP}')                             ;смещаемся на верхнюю строчку в схемах
$i1=ControlTreeView('Схемы работы контрагента','','[CLASS:TTreeView; INSTANCE:1]','GetSelected')  ;считываем первую выделенную строку
send('{DOWN}')                             ;смещаемся на следующую строчку в схемах
$i2=ControlTreeView('Схемы работы контрагента','','[CLASS:TTreeView; INSTANCE:1]','GetSelected')  ;считываем вторую выделенную строку
 
Автор
А

Авдей

Новичок
Сообщения
12
Репутация
0
InnI сказал(а):
А так?
Код:
WinActivate('Схемы работы контрагента','') ;активируем окно со схемами
send('{PGUP}')                             ;смещаемся на верхнюю строчку в схемах
$i1=ControlTreeView('Схемы работы контрагента','','[CLASS:TTreeView; INSTANCE:1]','GetSelected')  ;считываем первую выделенную строку
send('{DOWN}')                             ;смещаемся на следующую строчку в схемах
$i2=ControlTreeView('Схемы работы контрагента','','[CLASS:TTreeView; INSTANCE:1]','GetSelected')  ;считываем вторую выделенную строку
Так пробовал сделать проход, но видно не додумал что то..Буду дальше пробовать!


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

ra4o сказал(а):
Посмотрите библиотеку "GuiTreeView.au3", может облегчит Вашу задачу ? Вам в любом случае нужно считывать в цикле с первой строки. При первом чтении новой переменной присваиваете значение прочтенной строки, при повторном проходе - сравниваете значение этой переменной с тем, что прочли - совпало, значит переходите к след.строке, нет- работаете с этой и обнуляете переменную.
Буду пробовать! На работе уже бумаги полпачки испортил, блок-схемы рисую :smile:
 
Верх