[FGL] 开发一个类似MDI的操作介面

在网页上,在功能较多的网页,常可以看到下列两种介面
https://ithelp.ithome.com.tw/upload/images/20210928/20051169aJcgvQ0uyX.png

  • 样式A 功能选项在上方:可以利用 TOOLBAR 的方式来满足 (如果想做成下拉式选单,也可考虑TOPMENU),可以回头参考 [FGL] 4GL程序的资源档Resource file体系
  • 样式B 功能选项在左侧:回归到 HTML的语法,应该是要切分 frame来做。但若『只用FGL』,就可以考量使用 MDI 模式来进行模拟。

Genero套件基本是一个协助尽量用最少code满足最多功能的产品,若需要大量的美化工具协助妆点自然也是可并入使用,就是看关注的重点在哪边。本系列文主要在引导多使用 Genero功能来满足需求,故最大量运用套件所提供的功能,而减少使用注入式的插件进行外观的改动。(但不表示不可行哦)

MDI介面的模拟思路

MDI 是 Multi-Document Interface 的意思。FGL可以透过模拟外框+限定程序运行在内部的做法,满足MDI的需求,但此需求却达不到左侧有 MENU展在画面上的做法。

方法:

  1. 使用 TREE containar来做模拟
  2. 使用 GBC 的 popup-menu 在初始化时就展开所有程序
  3. 使用自动缩合的 start menu(4sm) 凑合凑合

经过实验,方法 1 在每次调整 MENU 时要伴随着大量的 coding,有违初心。方法 2 则是会耗用大量的主机记忆体,事先准备一堆不一定要开来用的程序,失败。

所以剩下的就是方法 3.

准备一个空框架程序

事先准备一个空框架程序,启动後可以读取 style(4st),以及读取 start menu(4sm)的小型主程序。为了维系主程序的运行,布置一个 MENU。

MAIN
   CALL ui.Interface.setName("main")
   CALL ui.Interface.loadStyles("mdi.4st")
   #如果有额外要做的事情放在这里,做完了再去读取 MENU(4sm) 设定
   CALL ui.Interface.loadStartMenu("mdi.4sm")
      MENU "外框的MENU,布置登出功能"
       ON ACTION logout   #POPUP MENU的登出
          EXIT MENU
       ON ACTION close    #对应 WINDOWS 的关闭功能
          EXIT MENU
   END MENU
END MAIN

准备 style (mdi.4st)档案,设定起始画面

接下来对主要的 screen进行风格设定。如下方范例:

  • 将 tabbedContainar 打开,这就是形成 MDI 的重要属性
  • 设定 ringMenu 缩在右上(chrome模式),作个别程序的小功能用 (LOGOUT也座落在此)
  • StartMenu 设定为 menu (可下拉下展模式)
<?xml version="1.0" encoding="ANSI_X3.4-1968"?>
<StyleList>
  <Style name="Window">
     <StyleAttribute name="windowType" value="normal" />
     <StyleAttribute name="tabbedContainer" value="yes" />
     <StyleAttribute name="startMenuPosition" value="menu" />
     <StyleAttribute name="ringMenuPosition" value="chrome" />
     <!-- StyleAttribute name="browserMultiPage" value="yes" / -->
  </Style>
 </StyleList>

此处选择不设定将作业开在新的浏览器页签 (browserMultiPage),期望能更贴近实际的网页操作模式。

准备 start menu(mdi.4sm)档案,设定起始画面

最後则是准备要执行的作业清单。从此处应该可以明显发现,4sm是透过 MAIN作业调动,但其实并不需要绑入 main.4gl 的 MENU 选项。而是在 MENU 指令(或其他交谈指令生效的状况下) 作为配合的可选择项目。而对应的指令就直接列在 4sm 档案内。

此处最外阶层,建议应配置一个操作说明,以做出类似 **上方介面B ** 的样态。

<?xml version="1.0" encoding="UTF-8"?>
<StartMenu text="Template">
  <StartMenuGroup text="操作选项 (点此处,展开选项)">
    <StartMenuGroup text="大功能1">
       <StartMenuCommand text="子作业1-1" exec="fglrun svms1-1"/>
       <StartMenuCommand text="子作业1-2" exec="fglrun svms1-2"/>
       <StartMenuCommand text="子作业1-3" exec="fglrun svms1-3"/>
       <StartMenuCommand text="子作业1-4" exec="fglrun svms1-4"/>
    </StartMenuGroup>
    <StartMenuGroup text="大功能2">
       <StartMenuCommand text="子作业2-1" exec="fglrun svms2-1"/>
       <StartMenuCommand text="子作业2-2" exec="fglrun svms2-2"/>
    </StartMenuGroup>
  </StartMenuGroup>
</StartMenu>

实作的MDI样态

依据上列的范例实做出来的 GDC 样态是:
https://ithelp.ithome.com.tw/upload/images/20210928/20051169Q4QNQahKhH.png

若可以套上 GBC 则操作上会更类似
https://ithelp.ithome.com.tw/upload/images/20210928/20051169kr7qOAzhNL.png

大家手上都有许多程序,或许对於部分需要移动做事的人来说,能协助将程序移入 MDI 这样的网页操作介面,应该是对於这些移动工作者来说最方便的。


<<:  [Day 13] 重新思考之後的内容

>>:  Day13 React- Forms(1)

【Day22】立即函式(IIFE)

立即函式特点: 立即执行 无法在函式外再次执行 接着我们来看立即函式的语法 (function() ...

python30天-DAY28-Matplotlib(子图)

今天来介绍一下 子图 ,通常像前两天我们每一次都只会看到一张图,但有时候我们会同时需要看到许多张图,...

Day27:今天我们来聊一下IoT and OT Hacking

物联网(IoT)的重大发展促进了日常生活中连网设备的激增。 从智能家庭到自动化医疗保健应用,物联网无...

IT铁人DAY 18-Adapter 适配器模式

  今天介绍的Adapter Pattern是属於结构型模式,以字面上来说不难猜到它是用来让物件与物...

Day-17 TextView

TextView可说是最常用的元件, 它可以将文字显示於APP画面上, 但在了解Tetx的属性之前,...