Винпоцетин фрилансера - таймер-напоминалка

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

Винпоцетин фрилансера - таймер-напоминалка

Postby AleXH » Mon, 29 May 2017, 07:26

Часто сидя за ПК забываешь обо всём на свете - нужен простенький таймер-винпоцетин на ХХ минут, выдающий при сработке его GUI окошко поверх всех окон. Назначение - периодический контроль протекающих процессов в альтернативной реальности, вне ПК :-D и вне прямой видимости, например набор воды в ванной, её фильтрация в ёмкость на кухне, готовка пищи - варка/жарка и пр., чреватые неприятными последствиями в случае их бесконтрольности.

При всём многообразии таймеров в инете, не нашёл ни одного удобного в пользовании - хотелось бы устанавливать период сработки не только прямым вводом времени, но и слайдером, сдвигаемым мышью, желательно чтобы значения в полях ввода времени при этом синхронно изменялись согласно положению ползунка слайдера. Полезна было бы иметь и пару кнопок - "Повторить" и программируемую, период для которой задаётся в настройках пользователем. Установка/переустановка таймера должна быть максимально лёгкой и быстрой - вызвали окно таймера (глобальным шоркатом, или из меню nnCron), сдвинули слайдер, переключились в другую задачу - таймер активировался, его окно закрылось. Нажали повторить - таймер активировался с предыдущим значением, его окно закрылось.

Кто-нибудь может сделать такое?
AleXH
 
Posts: 44
Joined: Sun, 31 Mar 2013, 10:23

Re: Винпоцетин фрилансера - таймер-напоминалка

Postby dothen » Tue, 30 May 2017, 05:11

Удобный таймер.

Code: Select all
# Файл:       nncron_timer.tab
# Автор:      dothen
# Дата:       10.06.2017
# Версия:     1.4
# Описание:

# Горячие клавиши:
# Ctrl+=     Диалог ввода.
# Ctrl+-     Меню Избранное.
# Ctrl+0     Меню со списком таймеров.

# Эффект ползунка:
# Нажать левую или правую клавишу мыши между заголовком и окошком ввода, и двигать.
# После отжатия правой клавиши, диалог ввода закрывается и автоматически создается таймер.

# Можно крутить колесо мыши.
# Таймеры лежат в папке var\timer.


<%

 TRUE CONSTANT MouseWheel \ Задает направление вращения колеса для увеличения/уменьшения.
\ FALSE CONSTANT MouseWheel

 FALSE CONSTANT menusec \ Показывает в меню время с секундами.
\ TRUE CONSTANT menusec \ Без секунд.

\ FALSE CONSTANT msgsec \ Показывает в напоминании время с секундами.
 TRUE CONSTANT msgsec \ Без секунд.

 TRUE CONSTANT msgline \ Показывает в напоминании строку "Сработал: Просрочено:".
\ FALSE CONSTANT msgline

10000 CONSTANT maxMinutes \ Ограничитель при вводе (максимум 9999) (~7дней).
10 CONSTANT maxLength \ Ограничитель. Сколько символов преобразовывать в число.
\ Должно быть больше чем число разрядов в maxMinutes.
\ Если не ограничивать то может быть неопределенная ситуация при переполнении (см. >NUMBER).
\ В общем введенное число должно быть в диапазоне от 1 до maxMinutes.

16 CONSTANT MaxTimers \ Максимальное количество таймеров с максимально(50) длинным именем.
0 VALUE inputmin
1 VALUE plusminutes
0 VALUE latestsec
0 VALUE timerflag
2VARIABLE curtime
2VARIABLE finish-time
CREATE Timer-Name 64 ALLOT
CREATE BufTimerList MaxTimers 64 * ALLOT
USER-CREATE TimerName 64 USER-ALLOT
USER-CREATE 1stStartTime 32 USER-ALLOT

: >pad ( a u -- ) PAD  ZPLACE ;
: +pad ( a u -- ) PAD +ZPLACE ;
: pad> ( -- a u ) PAD ASCIIZ> ;

: TimerName> ( -- a u ) TimerName ASCIIZ> ;

: TimerFileName ( -- a u )
    TimerName C@ 0= IF inputmin N>S TimerName ZPLACE THEN
    FT-CUR FT>SEC inputmin 60 * S>D D+ finish-time 2!
    S" %finish-time 2@ DOUBLE>S%_%TimerName>%" EVAL-SUBST
;

: TimerDirName ( -- a u ) S" \var\timer" +ModuleDirName ;

: StartTimeSave ( -- a u ) 1stStartTime C@ IF 1stStartTime ASCIIZ> ELSE S" " THEN ;

: TimerFileCreate ( -- ) FILE-WRITE: "%TimerDirName%\%TimerFileName%" "%StartTimeSave%" ;

: TimerListBuild ( -- )
    CRLF BufTimerList ZPLACE
    FOR-FILES: "%TimerDirName%\*"
       FOUND-FILENAME BufTimerList +ZPLACE
       CRLF BufTimerList +ZPLACE
    ;FOR-FILES
;
TimerListBuild

: StartItemTimer ( min -- )
    DUP 1 maxMinutes WITHIN 0= IF DROP EXIT THEN
    DUP TO inputmin TO plusminutes
    TimerFileCreate
    TimerListBuild
;


\ ------- Меню Избранное -------

\ В начале строки не должно быть пробелов, должно стоять число минут.
: MenuTimerPreset ( -- h )
    POPUPMENU
      S" 4 Чайник" OVER MENUITEM
      MENUSEPARATOR
      S" 3 Ванна" OVER MENUITEM
      S" 7 Кофе" OVER MENUITEM
      S" 11 Какао с чаем" OVER MENUITEM
      MENUSEPARATOR
      S" 10 минут Разгон облаков" OVER MENUITEM
      S" 20 минут Подвиг" OVER MENUITEM
      S" 30 минут Война с Англией" OVER MENUITEM
    END-MENU
;

: StartItemTimerPreset ( id -- )
    ?DUP IF
      CASE
       DUP DUP OF ASCIIZ> 2DUP TimerName ZPLACE S>NUM ENDOF
      ENDCASE
      StartItemTimer
    THEN
;
\ ------------------------------

\ умножение числа двойной длинны на одинарное
: DU* ( d u --> d ) TUCK * >R UM* R> + ; \ spf4-20.rar\devel\~moleg\lib\parsing\number.f

: InputSrt     ( -- a u ) TimerName> S" _" SEARCH DROP 1 /STRING ;
: S>TimeSec      ( -- d ) TimerName> S>DOUBLE ;
: TimerStartTime ( -- d ) S>TimeSec InputSrt S>NUM 60 * S>D D- 10000000 DU* ; \ время в формате FILETIME
: TimerStopTime  ( -- d ) S>TimeSec 10000000 DU* ; \ время в формате FILETIME

: InputMinutes ( -- )
    plusminutes
    0 TO inputmin
    TimerName OFF
    S" Таймер" CRLF S" Напомнить через" S+
    plusminutes N>S S"  минут" S+ 0 WIN-INPUT-TEXT 0=
    IF
      2DUP 50 MIN TimerName ZPLACE \ Введенная строка укорачивается до 50 символов.
      maxLength MIN S>NUM TO inputmin
      inputmin 1 maxMinutes WITHIN 0= IF -1 TO inputmin THEN
    THEN TO plusminutes
;

: RetryTimer ( -- )
    InputSrt >pad pad>
    2DUP TimerName ZPLACE
    S>NUM StartItemTimer
;


\ ----- Дата и время -----

: min>hh:mm ( min -- a u )
    60 /MOD SWAP
    <#
      S>D # # 2DROP 58 HOLD
      S>D # #
    #>
;

: sec>hh:mm:ss ( sec -- a u )
    3600 /MOD SWAP 60 /MOD SWAP
    <#
      S>D # # 2DROP 58 HOLD
      S>D # # 2DROP 58 HOLD
      S>D # #
    #>
;

: sec>dd_hh:mm:ss ( sec -- a u )
     86400 /MOD SWAP 3600 /MOD SWAP 60 /MOD SWAP
    <#
      t:00 t:00 t00
      S"  дн. " HOLDS
      S>D #S
    #>
;

: time-format ( sec -- a u )
    DUP 86400 >   \ 86400 секунд = 24 часа
    IF sec>dd_hh:mm:ss ELSE sec>hh:mm:ss THEN
;

: FT>DD.MM.YY___hh:mm:ss ( d - a u )
    FT>YMDHMS
    <#
        0 HOLD
        t:00 t:00 t00 S"    " HOLDS
        ROT 2000 - t00 [CHAR] . HOLD
        SWAP t00 [CHAR] . HOLD
        t00 0 0
    #> 1-
;


\ ---------- "Ползунок" -----------

: SetPromptTextTimer ( hStatic -- )
    >R FT-CUR 2>R
    S" Старт:"                 >pad
    9 SP@ 1                    +pad DROP
    2R@ FT>DD.MM.YY___hh:mm:ss +pad
    9 SP@ 1                    +pad DROP
    plusminutes N>S            +pad
    CRLF                       +pad
    S" Стоп:"                  +pad
    9 SP@ 1                    +pad DROP
    plusminutes 600000000 UM* 2R>
    D+ FT>DD.MM.YY___hh:mm:ss  +pad
    9 SP@ 1                    +pad DROP
    S"  ("                     +pad
    plusminutes 60 * time-format 3 - +pad
    S" )"                      +pad
    PAD R> SetWindowTextA DROP
;

0 VALUE InputChange?
0 VALUE InputWheel?
0 VALUE vk_button

: SetInputTextTimer ( hEdit -- )
    >R plusminutes N>S >pad
    Timer-Name ASCIIZ> 2DUP S>NUM DUP IF N>S NIP THEN /STRING +pad
    PAD R> SetWindowTextA DROP
    FALSE TO InputChange?
;

: GetInputTextTimer ( hEdit -- )
    >R 51 Timer-Name R> GetWindowTextA DROP
    Timer-Name ASCIIZ> S>NUM TO plusminutes
;

: (SliderTimer) ( hEdit hStatic -- ) { hEdit hStatic \ -- }
    vk_button
    MOUSE-POS DROP
    BEGIN vk_button WHILE
\      MOUSE-POS DROP OVER - 1 MAX TO plusminutes                   \ Ползунок начинает отсчет с единицы.
      MOUSE-POS DROP TUCK SWAP - plusminutes + 1 MAX TO plusminutes \ Ползунок начинает отсчет с текущего значения.
      hEdit SetInputTextTimer
      hStatic SetPromptTextTimer
      50 PAUSE
    REPEAT DROP
    FALSE TO InputChange?
    hEdit PUSH-WINDOW DROP
    VK_RBUTTON = IF S" {ENTER}" ELSE S" {END}" THEN SEND-KEYS
;

: SliderTimer ( hwnd -- ) { hwnd \ hStatic hEdit -- }
    0 Z" Static" 0 hwnd FindWindowExA TO hStatic
    0 Z" Edit" 0 hwnd FindWindowExA TO hEdit
    BEGIN
      50 PAUSE
      vk_button IF hEdit hStatic (SliderTimer) THEN
      InputWheel? IF hEdit SetInputTextTimer FALSE TO InputWheel? THEN
      InputChange? IF hEdit GetInputTextTimer FALSE TO InputChange? THEN \ Сработает только при вводе с клавиатуры.
      hStatic SetPromptTextTimer
      hwnd IsWindow 0=
    UNTIL
;


\ ---- Текст окна напоминания ----

: 1st-line-text ( -- )
    S" 1-й Старт:   " >pad
    1stStartTime ASCIIZ> S>DOUBLE
    FT>DD.MM.YY___hh:mm:ss msgsec IF 3 - THEN +pad
    9 SP@ 1     +pad DROP
    S" Прошло:" +pad
    9 SP@ 1     +pad DROP
    FT-CUR 1stStartTime ASCIIZ> S>DOUBLE D-
    FT>SEC D>S time-format msgsec IF 3 - THEN +pad
    2CRLF +pad
;

: 2nd-line-text ( -- )
    S" Стартовал: " +pad
    TimerStartTime 2DUP 2>R
    FT>DD.MM.YY___hh:mm:ss msgsec IF 3 - THEN +pad
    9 SP@ 1     +pad DROP \ 0x00000909 SP@ 2 +pad DROP
    S" Прошло:" +pad
    9 SP@ 1     +pad DROP
    FT-CUR 2R> D- FT>SEC D>S time-format msgsec IF 3 - THEN +pad
;

: 3rd-line-text ( -- )
    CRLF +pad
    S" Сработал:  " +pad
    FT-CUR FT>DD.MM.YY___hh:mm:ss
    msgsec IF 3 - THEN +pad
    9 SP@ 1      +pad DROP
    S" Просроч:" +pad
    9 SP@ 1      +pad DROP
    FT-CUR FT>SEC S>TimeSec D- D>S time-format msgsec IF 3 - THEN +pad
;

: TimerFinishText ( -- )
    1st-line-text
    2nd-line-text
    msgline IF 3rd-line-text THEN
    2CRLF +pad
    InputSrt +pad PAD
;

: TimerFinishTitle ( -- )
    S" Таймер - " 1stStartTime ASCIIZ> S" _" SEARCH DROP 1 /STRING S+ DROP
;
\ -----------------------


: WaitTimer ( -- ? )
    0 50 0 DO
      DROP 10 PAUSE
      Z" Таймер" Z" spfwinclass" FindWindowA DUP IF LEAVE THEN
    LOOP
;

: SaveRetryTimer ( -- )
    FILE-EMPTY: "%TimerDirName%\%TimerName>%"
    IF
      TimerStartTime DOUBLE>S 1stStartTime ZPLACE
      S" _1" 1stStartTime +ZPLACE
    ELSE
      S" %TimerDirName%\%TimerName>%" EVAL-SUBST FILE 1stStartTime ZPLACE
      1stStartTime ASCIIZ> 2DUP S" _" SEARCH DROP NIP 1- - >pad
      1stStartTime ASCIIZ> S" _" SEARCH DROP 1 /STRING S>NUM 1+ N>S +pad
      pad> 1stStartTime ZPLACE
    THEN
;


\ Доопределение класса.
InputDialog REOPEN
0x020A CONSTANT WM_MOUSEWHEEL
0x0201 CONSTANT WM_LBUTTONDOWN
0x0204 CONSTANT WM_RBUTTONDOWN
0x0202 CONSTANT WM_LBUTTONUP
0x0205 CONSTANT WM_RBUTTONUP

WINAPI: SetCapture     USER32.DLL
WINAPI: ReleaseCapture USER32.DLL

W: WM_LBUTTONDOWN handle @ SetCapture DROP VK_LBUTTON TO vk_button 0 ;
W: WM_RBUTTONDOWN handle @ SetCapture DROP VK_RBUTTON TO vk_button 0 ;
W: WM_LBUTTONUP ReleaseCapture DROP FALSE TO vk_button 0 ;
W: WM_RBUTTONUP ReleaseCapture DROP FALSE TO vk_button 0 ;

W: WM_MOUSEWHEEL
    wparam @ 0> MouseWheel =
    IF plusminutes 1+ ELSE plusminutes 1- THEN 1 MAX TO plusminutes
    TRUE TO InputWheel?
    ;
;CLASS

Edit REOPEN
M: InputChange TRUE TO InputChange? ;
VM: AfterCreate  ['] InputChange OnChange ! ;
;CLASS


%>


#( CLASSIC-TASK-#-SliderTimer
 SingleInstance
NoActive
Action:
    WaitTimer ?DUP IF SliderTimer THEN
)#

#( CLASSIC-TASK-#-Timer
SingleInstance NoActive
Action:
    CLASSIC-TASK-#-SliderTimer LAUNCH
    InputMinutes
)#

#( VINPOCETINE-FORTE
SingleInstance
: InputTimer ( -- )
    BEGIN 100 PAUSE CLASSIC-TASK-#-Timer RUN inputmin -1 > UNTIL
    inputmin ?DUP IF StartItemTimer THEN
;

WatchHotKey: "^="
Action:
    InputTimer
)#

#( CLASSIC-TASK-#-ShowTimerFinish
\ Задача запускается если у таймера осталось меньше минуты.
NoActive
Action:
    Timer-Name ASCIIZ> TimerName ZPLACE
    latestsec 0 MAX 1000 * PAUSE
    SaveRetryTimer
    FILE-DELETE: "%TimerDirName%\%TimerName>%"
    0x11106 TimerFinishTitle TimerFinishText 0 MessageBoxA \ MB_CANCELTRYCONTINUE+MB_DEFBUTTON2+MB_SYSTEMMODAL+MB_SETFOREGROUND
    CASE
      11  OF 1stStartTime OFF InputTimer ENDOF \ Продолжить
      10  OF RetryTimer 1stStartTime OFF ENDOF \ Повторить
       2  OF 1stStartTime OFF            ENDOF \ Отмена
    ENDCASE
)#


<%

: TimerFinish ( -- )
    FOR-FILES: "%TimerDirName%\*"
      FOUND-FILENAME S>DOUBLE curtime 2@ D- D>S DUP TO latestsec 60 <
      IF
        FOUND-FILENAME Timer-Name ZPLACE
        CLASSIC-TASK-#-ShowTimerFinish LAUNCH
        200 PAUSE
      THEN
    ;FOR-FILES
;

: CheckTimer ( -- )
    FT-CUR FT>SEC curtime 2!
    BufTimerList ASCIIZ>
    BEGIN CRLF SEARCH WHILE
    2 /STRING 2DUP
    S>DOUBLE curtime 2@ D- D>S 60 < IF TRUE TO timerflag THEN
    REPEAT 2DROP
    timerflag IF FALSE TO timerflag TimerFinish THEN
;

: RunMenuTimer ( hmenu -- id )
    >R WITH TrayIcon Z" Static" 0 0 Window >R ENDWITH
    R@ SetForegroundWindow DROP
    0 R> CalcMenuYX 260 R@ TrackPopupMenuEx
    R> DestroyMenu DROP
;

\ Из плагина menu.spf
: Item-Grey       1 ['] MENUITEM 81 + DUP @ ROT OR SWAP ! ;
: Item-Normal     0 ['] MENUITEM 81 + ! ;

\ Прошло и осталось в сумме дают 59 т.к. после 59 идет не 60 а 0.
: TimerListItemText ( -- )
    Item-Grey
    S" Пр:  " >pad
    TimerStartTime 2>R
    FT-CUR 2R@ D- FT>SEC D>S time-format menusec IF 3 - THEN +pad
    S"   Ост:  " +pad
    TimerStopTime
    FT-CUR D- FT>SEC D>S time-format menusec IF 3 - THEN +pad pad> 0 MENUITEM
    S" Старт: " >pad
    2R> FT>DD.MM.YY___hh:mm:ss menusec IF 3 - THEN +pad pad>    0 MENUITEM
    S" Стоп:  " >pad
    TimerStopTime
    FT>DD.MM.YY___hh:mm:ss menusec IF 3 - THEN +pad pad>    0 MENUITEM
    Item-Normal
;

: ShowTimerList ( -- )
    POPUPMENU
    Item-Grey
    S" Список таймеров" 0 MENUITEM
    Item-Normal
    MENUSEPARATOR
    FOR-FILES: "%TimerDirName%\*"
      POPUP
        FOUND-FILENAME TimerName ZPLACE
        TimerListItemText
        S" Удалить" FOUND-FULLPATH S>ZALLOC MENUITEM
      FOUND-FILENAME S" _" SEARCH DROP 1 /STRING
      2DUP S>NUM min>hh:mm >pad 9 SP@ 1 +pad DROP +pad pad>
      END-POPUP
    ;FOR-FILES
    END-MENU
;


%>


#( CLASSIC-TASK-#-WatchTimer
SingleInstance  NoLog
Action:
    CheckTimer
)#

<%
\ CLASSIC-TASK-#-WatchTimer LAUNCH

\ Если во время выполнения задачи CLASSIC-TASK-#-ShowTimerFinish
\ перечитать кронтабы то таймер сработает с опозданием,
\ т.к. задача CLASSIC-TASK-#-WatchTimer запускается только в начале новой минуты.

\ Можно запускать задачу CLASSIC-TASK-#-WatchTimer сразу при перечитывании кронтабов,
\ но тогда если задача CLASSIC-TASK-#-ShowTimerFinish не завершится до начала новой минуты,
\ то будет запущена вторая задача CLASSIC-TASK-#-ShowTimerFinish для того же таймера,
\ и значит будет два сообщения для одного таймера, но зато без опоздания.
%>


#( VINPOCETINE
SingleInstance
\ : task_menu_run VINPOCETINE LAUNCH ;
\ ' task_menu_run CronIcon OnLB !
WatchHotKey: "^-"
Action:
    MenuTimerPreset RunMenuTimer StartItemTimerPreset
)#

#( VINPOCETINE-LIST
SingleInstance
WatchHotKey: "^0"
Action:
    ShowTimerList RunMenuTimer ?DUP IF ASCIIZ> FDELETE TimerListBuild THEN
)#


<%

\ --------- Меню ---------

: ItemStr ( u -- a u )
    DUP N>S >pad
    S"  ("  +pad
    60 * time-format 3 - +pad
    S" )"   +pad pad>
;

: (MENUITEM) ( minutmin minutmax itemstep -- )
    TUCK + ROT 2 PICK + DO \ itemstep (minutmax+itemstep) (minutmin+itemstep) DO
       I ItemStr I MENUITEM
    DUP +LOOP
    DROP
;

: SUBMENU ( itemstep minutmin minutmax -- )
    DUP 2SWAP ROT ROT
    POPUP
      (MENUITEM)
    ItemStr
    END-POPUP
;

: (SUBMENU) ( minutmin minutmax substep itemstep -- )
    2SWAP SWAP DO \ minutmax minutmin DO
     2DUP I ROT I + SUBMENU
    OVER +LOOP  \ Число-ограничитель будет кратно substep
    2DROP
;

: MenuTimer ( -- h )
    POPUPMENU
\      720 1740 60 5 (SUBMENU)
\      MENUSEPARATOR
\      SubCol
\      0 30 30 1    (SUBMENU)
\      SubNormal
\      30 300 30 1  (SUBMENU)
      0 300 30 1  (SUBMENU)
      300 720 60 5  (SUBMENU)
    END-MENU
;

%>

#( VINPOCETINE2
 NoActive
SingleInstance
\ : task_menu_run VINPOCETINE LAUNCH ;
\ ' task_menu_run CronIcon OnLB !
WatchHotKey: "^9"
Action:
    MenuTimer RunMenuTimer StartItemTimer
)#


Last edited by dothen on Mon, 12 Jun 2017, 13:36, edited 6 times in total.
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Винпоцетин фрилансера - таймер-напоминалка

Postby AleXH » Tue, 30 May 2017, 08:28

Спасибо за отзывчивость - работает и на практике вполне удобно. Единственно:

При использовании мыши нужно только потянуть слайдер мышью и (возможно) нажать кнопку подтверждения, если невозможно активировать таймер по отпусканию слайдера.

При использовании клавиатуры нужно:
1. Перенести взгляд с монитора на клаву
2. Перенести руку на клаву для ввода и ввести число
3. Вернуть руку на мышь, а взгляд на монитор
- неоптимально. Конечно это в предположении, что в правой руке мышь, но имхо это более частый сценарий, ведь ОС с графическим интерфейсом. Можно и левой рукой нажать 2 цифры, а затем ввод, либо мышью "Ок", но слайдером ввод имхо удобнее.

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

З.Ы. подсказку изменил на "Напомнить через (минут):"
AleXH
 
Posts: 44
Joined: Sun, 31 Mar 2013, 10:23

Re: Винпоцетин фрилансера - таймер-напоминалка

Postby AlikasS » Tue, 30 May 2017, 10:54

до кучи, как вариант (из старых постов )
Code: Select all
#( напомнить_о
NoActive
NoLog
Action:
WIN-INPUT-TEXT: "Напоминание" "через сколько минут напомнить? и что?" "5 не пора ли домой?" 0 0=
IF
<TIB
get-number 1 WORD COUNT 256 MIN
START-APP: "C:\Program Files\nnCron\tm.exe" %2 esPICK% 60000 * PAUSE Reminder "nncron.tab" once|*     %crlf%%crlf%            %1 esPICKS%
TIB>
THEN
)#

задача, "защищенная" после запуска от перечитывания кронтабов и "падения" nncron.
а вообще, здесь на форуме выложен сборник либ для построения почти любых gui-форм, можно и самому нарисовать хотелку
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Винпоцетин фрилансера - таймер-напоминалка

Postby AleXH » Tue, 30 May 2017, 11:21

Если речь о "GUI формы: таймер обратного отчета", то я его запустить не смог - позавчера распаковал forguiplugins.zip с сохранением всех путей в папку nnCron, добавил строки из вашего nnCron.ini в свой, перезапустил nnCron и не взлетело - выдал не помню какую ошибку. У меня ванильный 1.93b15, может чего не хватает.
AleXH
 
Posts: 44
Joined: Sun, 31 Mar 2013, 10:23

Re: Винпоцетин фрилансера - таймер-напоминалка

Postby Morituruz » Tue, 30 May 2017, 22:32

Десять лет назад я можно сказать ради таймера ннкроном и пользовался, хотя в форте за эти 10 лет продвинулся недалеко :cry:

Вот до кучи мой текущий вариант. (нужно изменить путь к Orzeszek Timer.exe
Code: Select all
<%
   \ Orzeszek_Timer
   : o_timer { a u -- }
      ShowNormal
      S" e:\soft\_other\_usability\Orzeszek_Timer\Orzeszek Timer.exe " a u S+ START-APP
      100 0 DO
         100 PAUSE
         S" *seconds" WIN-EXIST? IF
            500 PAUSE
            WIN-HWND N>S WIN-MINIMIZE
            LEAVE
         ELSE
            I 99 = IF
               MSG: "Orzeszek_Timer NOT FOUND"
            THEN
         THEN
      LOOP
   ;
%>


#( CLASSIC-TASK-#-timer_0-20
HyperActive
S" Timer " CUR-TASK-NAME 21 /STRING S+ add_task NoActive
Action: CUR-TASK-NAME 21 /STRING o_timer )#

#( CLASSIC-TASK-#-timer_0-30
HyperActive
S" Timer " CUR-TASK-NAME 21 /STRING S+ add_task NoActive
Action: CUR-TASK-NAME 21 /STRING o_timer )#

#( CLASSIC-TASK-#-timer_0-40
HyperActive
S" Timer " CUR-TASK-NAME 21 /STRING S+ add_task NoActive
Action: CUR-TASK-NAME 21 /STRING o_timer )#

и т.п.
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Винпоцетин фрилансера - таймер-напоминалка

Postby AleXH » Wed, 31 May 2017, 09:11

dothen
Если планируете доработки, то выскажу пожелания:
1. сейчас введённое пользователем "10 ванная-вода" после повтора обрежется до имени файла, т.е. "ванная-вода" будет утеряно, лучше TimerFileName - в заголовок окна, то что ввёл пользователь - в сообщение.
2. вывести в 1-ой строке время старта и прошедшим с него временем: "Старт 10:32 Прошло 0:45", во 2-ой строке - строку введённую пользователем.

nnCron: Reminder
1. расположение управляющих элементов неоптимально - лучше (слева-направо):
выпадающий список (минуты-часы...), затем числовое поле, затем "Remind me again", чекбокс, кнопка Close. Тогда меньше суеты мышкой, все управляющие элементы сгруппированы рядом.
2. обход табуляцией захватывает поле сообщения, но изменить его при этом невозможно, а значит перход на него бессмысленен.
AleXH
 
Posts: 44
Joined: Sun, 31 Mar 2013, 10:23

Re: Винпоцетин фрилансера - таймер-напоминалка

Postby dothen » Thu, 01 Jun 2017, 11:58

Доработал, можно испытывать.
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Винпоцетин фрилансера - таймер-напоминалка

Postby AleXH » Thu, 01 Jun 2017, 13:16

Может чего не хватает, ругается на:
Code: Select all
MOUSE-POS SWAP WindowFromPoint hStatic =

Избранное улыбнуло :) Если со слайдером есть сложности, то от него лучше отказаться - всё равно ввод не только времени, но и сообщения подразумевает клавиатуру.
AleXH
 
Posts: 44
Joined: Sun, 31 Mar 2013, 10:23

Re: Винпоцетин фрилансера - таймер-напоминалка

Postby dothen » Thu, 01 Jun 2017, 14:42

Убрал комментарий в строке:
Code: Select all
\ WINAPI: WindowFromPoint user32.dll
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Винпоцетин фрилансера - таймер-напоминалка

Postby AleXH » Thu, 01 Jun 2017, 15:29

Теперь работает, но слайдер шире окна сообщения и чтобы установить менее часа, нужно двигать влево, а не вправо, что весьма неожиданно.
AleXH
 
Posts: 44
Joined: Sun, 31 Mar 2013, 10:23

Re: Винпоцетин фрилансера - таймер-напоминалка

Postby dothen » Thu, 01 Jun 2017, 15:47

Это же Форт! Лучшее средство для мозгов :)
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Винпоцетин фрилансера - таймер-напоминалка

Postby AleXH » Sat, 03 Jun 2017, 09:03

Да, он своеобразен, это точно. По теме:
1. "Прошло" отображает время от последнего повтора, а не от первоначального старта - ожидалось последнее.
Пожелания:
2. сделать слайдер более интуитивным - от позиции клика вправо
3. добавить колесо мыши +- минуты
4. выводить время не "DD.MM.YY-hh:mm", а "DD.MM.YY hh:mm". В остальных местах также без левых дефисов, подчёркиваний. "DD.MM.YYYY/hh:mm:ss" заменить на "DD.MM.YYYY / hh:mm:ss", добавив пробелы.
AleXH
 
Posts: 44
Joined: Sun, 31 Mar 2013, 10:23

Re: Винпоцетин фрилансера - таймер-напоминалка

Postby dothen » Sun, 04 Jun 2017, 00:14

Доработал.
Прошу уточнить пункт 1.
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Винпоцетин фрилансера - таймер-напоминалка

Postby AleXH » Sun, 04 Jun 2017, 00:57

Лучше так:
1. Прошло это разница между текущим временем и стартом, а не период.
2. 1-я строка: Старт hh:mm Прошло hh:mm
3. 2-я строка: строка введённая пользователем как есть "1 кухня"
4. 3-я строка: кнопки Отмена, Повторить, Продолжить
AleXH
 
Posts: 44
Joined: Sun, 31 Mar 2013, 10:23

Next

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 3 guests