文章来自:iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天 (ithome.com.tw)
[day19] FGL程序开发(2) – 4类6个交谈指令-功能选单部分
FGL程序运行时可用的画面已经可做出来了,但总不能只是拿来 DISPLAY TO 数据,应该要拿来做一些操作吧?
FGL 自然不是只拿画面来输出数据的。直接归纳给各位看,编排一个常用的剧情如下:
上述剧情中的 4 场景,可对应到FGL的『4类』6种交谈指令,分类分别为:
- 功能选单:直接进行选择MENU/ 搭配表格数据呈现的功能选择 DISPLAY ARRAY
- 数据输入:一般窗体数据输入 INPUT/ 搭配表格数据输入的 INPUT ARRAY
- 查询条件输入:查询条件输入的 CONSTRUCT
- 问题答询: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之外还有
- DOUBLECLICK = action-id 指定双击的事件要触发哪一个 action-id,通常会设定为『维护』功能
- 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) 的工作。
另外,在范例中,要特别注意:
- ARR_CURR( ) 指的是取用现在画面对应在变量中的哪一笔
- 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)』** 将会由特殊形态的程序开发方法来做介绍说明。
熟悉这些控制区块,才能够对应到不同用户的需求,设计出符合规格的应用程序。其他的交谈指令项目待下回分解。