Код для добавления x минут ко времени в поле ввода - PullRequest
0 голосов
/ 19 декабря 2018

Я новичок в программировании и прогрессе, первый пост в StackOverflow, надеюсь, я пишу в нужном месте!

У меня есть заполненное поле, в которое я вводю время (чч: мм), символьный формат.У меня также есть две стрелки, одна направлена ​​вперед, а другая назад, и я хочу, чтобы они добавляли / вычитали 20 минут соответственно при нажатии.

Что было бы хорошим способом написать код для этого?Превратить текущее значение времени в целое число и секунды после полуночи, а затем прибавить / вычесть 1200 сек?Как получить результат обратно в формат чч: мм для отображения в строке?

Любая помощь с благодарностью!/ Эллен

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Я думаю, что это будет делать то, что вам нужно.Пусть триггеры ON CHOOSE на ваших стрелках запускают процедуру changeMins.Передайте строку времени символа из вашего заполнения и либо «Добавить», либо «Вычесть».Выходным значением будет новая скорректированная временная строка.Затем вы можете установить экранное значение вашей заливки для этого выходного значения.

DEFINE VARIABLE cTime AS CHARACTER NO-UNDO.

cTime = "12:45".
RUN changeMins (INPUT-OUTPUT cTime, INPUT "Add").
MESSAGE cTime VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.


PROCEDURE changeMins:

    DEFINE INPUT-OUTPUT PARAMETER pcTime AS CHARACTER NO-UNDO.
    DEFINE INPUT PARAMETER pcAction AS CHARACTER NO-UNDO.

    DEFINE VARIABLE iHr AS INTEGER NO-UNDO.
    DEFINE VARIABLE iMn AS INTEGER NO-UNDO.

    /* Split the time string into hours and minutes */
    ASSIGN
        iHr = INTEGER(ENTRY(1, pcTime, ":"))
        iMn = INTEGER(ENTRY(2, pcTime, ":"))
        NO-ERROR.

    IF ERROR-STATUS:ERROR THEN RETURN.

    /* Adjust the time */
    CASE pcAction:
        WHEN "Add" THEN iMn = iMn + 20.
        WHEN "Subtract" THEN iMn = iMn - 20.
    END CASE.

    /* Correct for boundaries */
    IF iMn > 59 THEN
        ASSIGN
            iMn = iMn - 60
            iHr = iHr + 1.

    IF iMn < 0 THEN
        ASSIGN
            iMn = iMn + 60
            iHr = iHr - 1.

    IF iHr > 23 THEN iHr = iHr - 24.
    IF iHr < 0 THEN iHr = iHr + 24.

    /* Build the new time string */
    pcTime = STRING(iHr, "99") + ":" + STRING(iMn, "99").

END PROCEDURE.

В этом примере измените строку cTime на другое время и запустите ее.

0 голосов
/ 19 декабря 2018

Извлечение из кода TheDrooper's Я, вероятно, написал бы что-то вроде следующего кода, чтобы полностью использовать встроенные функции.Более короткий код, который по крайней мере так же легко понять, часто предпочтительнее.Также учтите, что в Progress нет оптимизирующего компилятора.Если вы можете заменить несколько простых операторов меньшими (даже если они более сложные и мощные, чем необходимо), код будет не только более понятным, но и более быстрым.

DEFINE VARIABLE cTime AS CHARACTER NO-UNDO.

cTime = "12:45".
RUN changeMins (INPUT-OUTPUT cTime, INPUT "Add").
MESSAGE cTime VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.


PROCEDURE changeMins:

DEFINE INPUT-OUTPUT PARAMETER pcTime AS CHARACTER NO-UNDO.
DEFINE INPUT PARAMETER pcAction AS CHARACTER NO-UNDO.

DEFINE VARIABLE iMn AS INTEGER NO-UNDO.

iMn = INTEGER(ENTRY(1, pcTime, ":")) * 60
    + INTEGER(ENTRY(2, pcTime, ":"))
    NO-ERROR. /* Calculate minutes since midnight */

IF ERROR-STATUS:ERROR THEN RETURN.

/* Adjust the time */
CASE pcAction:
    WHEN "Add" THEN iMn = iMn + 20.
    WHEN "Subtract" THEN iMn = iMn - 20.
END CASE.

/* Build the new time string */
pcTime = string(iMn * 60, 'HH:MM'). /* Convert minutes to seconds and convert the result to a string */

END PROCEDURE.

Если вам нужно разрешить более высокиеЗначения часов (например, если поле не представляет время дня, а временной интервал), вы не можете просто преобразовать полученное целое число с помощью строковой функции.В этом случае вы могли бы написать

pcTime = string(iMn / 60, '99') + ':' + string(iMn mod 60, '99').

(Кажется, и TheDrooper, и Том Баском предполагают время суток.) ​​

0 голосов
/ 19 декабря 2018

Функция времени выполнения возвращает целое число секунд после полуночи.Таким образом, ваша идея преобразования в такое целое число согласуется с другими применениями в 4gl, что является положительным.

Лично я хотел бы сохранить независимость пользовательского интерфейса и внутреннего хранилища.Таким образом, у меня, вероятно, будет переменная для часа, другая для минуты и третья для секунд (если вам это нужно).И я бы использовал целые числа, а не символы, для всех 3.

Я понятия не имею, какая версия Progress или в какой среде вы работаете, но этот быстрый и грязный небольшой фрагмент может иметь некоторый полезныйлакомые кусочки:

define variable hh as integer no-undo format ">9".
define variable mm as integer no-undo format "99".
define variable ss as integer no-undo format "99".

define variable myTime as integer no-undo.

form
  hh mm ss
 with
  frame a
.

on value-changed of hh in frame a do:
  if integer( self:screen-value ) > 23 then
    do:
      hh = 23.
      display hh with frame a.
    end.
end.

on value-changed of mm in frame a do:
  if integer( self:screen-value ) > 59 then
    do:
      mm = 59.
      display mm with frame a.
    end.
end.

on value-changed of ss in frame a do:
  if integer( self:screen-value ) > 59 then
    do:
      ss = 59.
      display ss with frame a.
    end.
end.

update hh mm ss with frame a.

myTime = (( hh * 3600 ) + ( mm * 60 ) + ss ).

display string( myTime, "hh:mm:ss am" ).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...