[FGL] 程序开发(2) - 4类6个交谈指令-功能选单部分

FGL程序运行时可用的画面已经可做出来了,但总不能只是拿来 DISPLAY TO 资料,应该要拿来做一些操作吧?

FGL 自然不是只拿画面来输出资料的。直接归纳给各位看,编排一个常用的剧情如下:
https://ithelp.ithome.com.tw/upload/images/20210902/20051169bgMAGq81mm.png

上述剧情中的 4 场景,可对应到FGL的『4类』6种交谈指令,分类分别为:

  1. 功能选单:直接进行选择MENU/ 搭配表格资料呈现的功能选择 DISPLAY ARRAY
  2. 资料输入:一般表单资料输入 INPUT/ 搭配表格资料输入的 INPUT ARRAY
  3. 查询条件输入:查询条件输入的 CONSTRUCT
  4. 问题答询:PROMPT

交谈指令语法

语法: 指令名称 ATTRIBUTES(属性)
控制区块
END 指令
不同的交谈指令具备不同的属性与控制区块,如果不存在控制区块,则可以不用END指令。接下来探究个别的交谈指令用法。

MENU选单指令

MENU "显示MENU的操作说明"
   COMMAND "A.按下说明"   #MENU-COMMAND 是最简单的结构,後方跟上的是要显示给操作者看的 "字串"
       #此处写该功能的程序码,例如 CALL function,可以做检查、做功能
       #第一个字元系统会自动转换为快捷键,因此建议不要使用中文字元,而以英文字元并且勿重复,如"A"
   ON ACTION action_id   #MENU-COMMAND 有多语言问题,所以Genero另外推出 MENU-ON ACTION结构
       # action_id 只是一个编号,正式呈现的以 .4ad(action default)档案设定为准 ( [Resource档案设定](https://ithelp.ithome.com.tw/articles/10260628) ),包含快捷键
       #其余功能与 COMMAND 控制区块相同
   COMMAND KEY(F1)       #旧式的快捷键写法,新式的使用 .4ad档案设定
       #此处写功能的程序码
   ON IDLE 5             #若操作人进入此段落後不操做键盘、滑鼠 5秒钟,则触发此段落
       #此处写对应处理的程序码,例如终止或退出程序
   ON TIMER 10           #3.20後提供的新控制区块,可指定一个定期需要检是的指令段落
       #此处写循环检查的品项,例如是不是已经满足了『全部的连线都已经超过IDLE设定』之类的消息检查
END MENU

主要功能如程序码范例内描述的。另外控制区块还可以有 BEFORE MENU / AFTER MENU。意思就是在进入MENU前与离开 MENU指令的时候个别要做哪些事情。
特殊形的控制区块 (如BEFORE MENU/AFTER MENU/ON IDLE等),没办法指定多次。

DISPLAY ARRAY

DISPLAY 的语法将会较MENU更加复杂,毕竟MENU的存在只是单纯提供功能的选择;而** DISPLAY ARRAY的存在,除了次要的功能选择外,最主要的是用来呈现阵列的资料 **。因此使用 DISPLAY 前要先将画面处理好。也就是OPEN WINDOW中要含有 TABLE或SCROLLGRID 容器。并且栏位数要能对上 (包含phatom)。

当栏位数无法对上时,执行 DISPLAY ARRAY会出现错误讯息。(编译时不会)

DISPLAY ARRAY中控制区块,MENU有的DISPLAY ARRAY 都有,只是此处改为 BEFORE DISPLAY/AFTER DISPLAY来管理进入前与离开後。

DISPLAY ARRAY g_array TO s_array.* ATTRIBUTES(COUNT=total_rows)  #显示阵列变数到画面阵列(s_array)
    #此功能开始出现ATTRIBUTES,可预先指定此指令要表现的行为,COUNT为总显示行数
    BEFORE ROW     #进入一行时要做的事
       CALL DIALOG.setSelectionMode( "s_array", 1 )  #将此DISPLAY ARRAY设定为多选,0为单选 
       #此处写功能的程序码:例如重新确认资料库刷新画面 (多人共同编辑资料的时候要做的保护)
    AFTER ROW      #离开一行时要做的事
       #此处写功能的程序码

以上是DISPLAY ARRAY初段落常出现的范例。在 ATTRIBUTES 部分,常见的除了 COUNT之外还有

  1. DOUBLECLICK = action-id 指定双击的事件要触发哪一个 action-id,通常会设定为『维护』功能
  2. ACCEPT =TRUE / FALSE 与 CANCEL = TRUE / FASE 这两组是设定 ACCEPT/CANCEL 两颗按钮是否呈现/消失

DISPLAY ARRAY 可以维护TABLE/SCROLLGIRD甚至是 TREE containar,因此还可支援下述区块,提供不同的画面使用:

就地维护控制区块 (TABLE/SCROLLGRID/TREE适用)
理论上已经启用了交谈指令A,若不是同样处在同一个DIALOG时,是不能再调起另一个交谈指令的。但是在Genero 2.50後,开始支持简易版的就地维护模式,因此在DISPLAY ARRY中创造下列的豁免区块,可以在下列区块中启动INPUT指令进行单行的维护。

  • ON APPEND [ ATTRIBUTES (...) ] #跳到行尾空白行进行维护
  • ON INSERT [ ATTRIBUTES (...) ] #插入一个空白行维护
  • ON UPDATE [ ATTRIBUTES (...) ] #进入指定行进行维护
  • ON DELETE [ ATTRIBUTES (...) ] #触发删除所在行,但阵列与database需自行处理
      ON INSERT
         LET li_pos = ARR_CURR()  #确定插入的位置
         INPUT g_arr[li_pos].* FROM record1[scr_line()].*  
           AFTER INPUT
              IF g_arr[li_pos].warehouse_no IS NOT NULL THEN
                 INSERT INTO d_tag(tenantsid,comp_no) VALUES(g_tenantsid,g_comp_no)
              END IF
         END INPUT

依据上面的范例,简单的说就是触发後,放入一个INPUT指令,输入完成(AFTER INPUT)时,顺便执行写入资料库(INSERT INTO) 的工作。
另外,在范例中,要特别注意:

  1. ARR_CURR( ) 指的是取用现在画面对应在变数中的哪一笔
  2. SCR_LINE( ) 指的是取用现在停留在画面的哪一个位置
    两者意义上还是有差异的,请小心不要混用。

拖拉功能控制区块 (TABLE/TREE适用)

  • ON DRAG_START ( dnd-object )
  • ON DRAG_FINISH ( dnd-object )
  • ON DRAG_ENTER ( dnd-object )
  • ON DRAG_OVER ( dnd-object )

树状伸展控制区块 (TREE适用)

  • ON EXPAND ( row-index )
  • ON COLLAPSE ( row-index )

上面提到的 ** 『拖拉(drag and drop)』与『树状(TREE)开启(expand)/关闭(collapse)』** 将会由特殊形态的程序开发方法来做介绍说明。

熟悉这些控制区块,才能够对应到不同用户的需求,设计出符合规格的应用程序。其他的交谈指令项目待下回分解。


<<:  Day05-入口管制(四)

>>:  Day6 Vue实体的生命周期

Day14:堆积排序(Heap Sort)

堆积(Heap) 堆积,是一种树状结构,用於实现「优先伫列(Priority queue)」。Pri...

线性串列的循序储存 - DAY 4

定义 指的是用一段连续的储存单元一次储存线性串列的资料元素 优缺 优点: 无须为表示串列中元素之间的...

{CMoney战斗营} 的第八周 #如果我不再这里学习

游戏专题进行了半个月,耗费最大的心力是在处理碰撞的逻辑问题,为1 Pixcel的逻辑误差斤斤计较,不...

[Day 16] 针对网页的单元测试(二)

首先先写测试 我们昨天测试了首页, 那我们今天要开始做新的设计, 并且针对我们的设计来做测试, 我们...

Day 16 - Android Studio 一个简单的计数器

Day 16 - Android Studio 一个简单的计数器 上次我们大致介绍了Andorid ...