为什么我可以在浏览器中对列进行排序?
Why can I sort columns in a browser?
通常 Whosebug 问题的形式是“我不知道如何做某事。”,但这个问题的形式是“我知道如何做某事,但我不明白它为什么有效。 ".
更确切地说,我在常规 window 中单击浏览器的标题列,然后触发 MOUSE-SELECT-CLICK
事件,导致相应列按升序或降序排序,如您所愿参见以下源代码:
DEFINE BROWSE browser-object
QUERY browser-object DISPLAY
temp_table.Field1 FORMAT ... COLUMN-LABEL "Label1"
temp_table.Field2 FORMAT ... COLUMN-LABEL "Label2"
...
DEFINE VARIABLE L-logical-Field1 AS LOGICAL INITIAL TRUE.
DEFINE VARIABLE L-logical-Field2 AS LOGICAL INITIAL TRUE.
...
ON MOUSE-SELECT-CLICK OF temp_table.Field1 IN BROWSE browser-object
DO:
IF L-logical-Field1
THEN OPEN QUERY browser-object FOR EACH temp_table BY temp_table.Field1.
ELSE OPEN QUERY browser-object FOR EACH temp_table BY temp_table.Field1 DESC.
L-logical-Field1 = NOT L-logical-Field1.
END.
ON MOUSE-SELECT-CLICK OF temp_table.Field2 IN BROWSE browser-object
DO:
IF L-logical-Field2
THEN OPEN QUERY browser-object FOR EACH temp_table BY temp_table.Field2.
ELSE OPEN QUERY browser-object FOR EACH temp_table BY temp_table.Field2 DESC.
L-logical-Field2 = NOT L-logical-Field2.
END.
这是有效的:
当我单击列的标题时,该列得到排序。当我单击列中的其他位置时,没有任何反应。
但它为什么有效?在源代码中我写了当我在任何地方点击列时要做什么,我没有指定应该点击标题列,但它仍然有效。
你可以说“是的,那又怎样?它在工作,那有什么大不了的?”,但我担心稍后客户可能会要求我在某个元组上方单击列时要求我编写一些行为并询问我要用那个特定的元组做点什么,我不知道如何开始。
有人知道吗?
要查看正在执行的内容,您可以使用条目类型为 4glTrace
的 log-manager
。
ON ALT-CTRL-H ANYWHERE DO:
IF LOG-MANAGER:LOGFILE-NAME = ? THEN DO:
LOG-MANAGER:LOGFILE-NAME = "4gltrace.log".
LOG-MANAGER:LOG-ENTRY-TYPES = "4GLTRACE:2".
MESSAGE "Started logging. Press Ctrl+Alt+H again to stop.":u VIEW-AS ALERT-BOX.
END.
ELSE DO:
LOG-MANAGER:CLOSE-LOG().
OS-COMMAND NO-WAIT VALUE( "4gltrace.log" ).
END.
RETURN NO-APPLY.
END.
通常 Whosebug 问题的形式是“我不知道如何做某事。”,但这个问题的形式是“我知道如何做某事,但我不明白它为什么有效。 ".
更确切地说,我在常规 window 中单击浏览器的标题列,然后触发 MOUSE-SELECT-CLICK
事件,导致相应列按升序或降序排序,如您所愿参见以下源代码:
DEFINE BROWSE browser-object
QUERY browser-object DISPLAY
temp_table.Field1 FORMAT ... COLUMN-LABEL "Label1"
temp_table.Field2 FORMAT ... COLUMN-LABEL "Label2"
...
DEFINE VARIABLE L-logical-Field1 AS LOGICAL INITIAL TRUE.
DEFINE VARIABLE L-logical-Field2 AS LOGICAL INITIAL TRUE.
...
ON MOUSE-SELECT-CLICK OF temp_table.Field1 IN BROWSE browser-object
DO:
IF L-logical-Field1
THEN OPEN QUERY browser-object FOR EACH temp_table BY temp_table.Field1.
ELSE OPEN QUERY browser-object FOR EACH temp_table BY temp_table.Field1 DESC.
L-logical-Field1 = NOT L-logical-Field1.
END.
ON MOUSE-SELECT-CLICK OF temp_table.Field2 IN BROWSE browser-object
DO:
IF L-logical-Field2
THEN OPEN QUERY browser-object FOR EACH temp_table BY temp_table.Field2.
ELSE OPEN QUERY browser-object FOR EACH temp_table BY temp_table.Field2 DESC.
L-logical-Field2 = NOT L-logical-Field2.
END.
这是有效的:
当我单击列的标题时,该列得到排序。当我单击列中的其他位置时,没有任何反应。
但它为什么有效?在源代码中我写了当我在任何地方点击列时要做什么,我没有指定应该点击标题列,但它仍然有效。
你可以说“是的,那又怎样?它在工作,那有什么大不了的?”,但我担心稍后客户可能会要求我在某个元组上方单击列时要求我编写一些行为并询问我要用那个特定的元组做点什么,我不知道如何开始。
有人知道吗?
要查看正在执行的内容,您可以使用条目类型为 4glTrace
的 log-manager
。
ON ALT-CTRL-H ANYWHERE DO:
IF LOG-MANAGER:LOGFILE-NAME = ? THEN DO:
LOG-MANAGER:LOGFILE-NAME = "4gltrace.log".
LOG-MANAGER:LOG-ENTRY-TYPES = "4GLTRACE:2".
MESSAGE "Started logging. Press Ctrl+Alt+H again to stop.":u VIEW-AS ALERT-BOX.
END.
ELSE DO:
LOG-MANAGER:CLOSE-LOG().
OS-COMMAND NO-WAIT VALUE( "4gltrace.log" ).
END.
RETURN NO-APPLY.
END.