为什么我可以在浏览器中对列进行排序?

问题描述

通常 StackOverflow 问题的形式是“我不知道如何做某事。”,但这个问题的形式是“我知道如何做某事,但我不明白它为什么有效。”。
更准确地说,我在常规窗口内点击浏览器的标题列,然后触发 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.

这是有效的:
当我点击列的标题时,列被排序。当我点击列中的其他地方时,没有任何反应。

但是为什么它有效?在源代码中,我写了单击 ANYWHERE 列时要执行的操作,我没有指定应单击标题列,但它仍然有效。

您可以说“是的,那又怎样?它可以工作,那有什么大不了的?”,但我担心稍后客户可能会要求我在某个元组上方单击该列并要求我编写一些行为用那个特定的元组做一些事情,我不知道如何开始。

有人有想法吗?
提前致谢

解决方法

要查看正在执行的内容,您可以使用条目类型为 log-manager4glTrace

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.