我是编程和开发的初学者,在StackOverflow上发表第一篇文章,希望我在正确的位置发帖!
我有一个填充字段,我在其中输入时间(hh:mm)字符格式。我还有两个箭头,一个指向前方,另一个指向后方,我希望它们在按下时分别加减20分钟。
什么是为此编写代码的好方法?将当前时间值设置为午夜后的整数和秒,然后加/减1200秒?如何将结果恢复为hh:mm格式以显示在填充中?
任何帮助深表感谢! /艾伦
答案 0 :(得分:1)
我认为这将满足您的需求。让箭头按钮上的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字符串更改为不同的时间并运行它。
答案 1 :(得分:0)
Progress TIME函数返回午夜之后的整数秒数。因此,您转换为这样的整数的想法与4gl中的其他用法是一致的。
我个人将UI和内部存储保持独立。所以我可能会有一个小时的变量,另一个是分钟的变量,第三个是秒的变量(如果需要的话)。而且我会全部使用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" ).
答案 2 :(得分:0)
源自TheDrooper的代码,我可能会编写类似于以下代码的内容,以充分利用内置函数。 短代码至少仍然易于理解通常是可取的。 还要考虑到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和Tom Bascom似乎都是一天中的时间。)