MVCNIS 方法:6步实现动态DCL编程

1 MVCNIS 简述

  1. Model 建立数据模型
  2. View 建立视图 dcl文件
  3. Control 建立控制逻辑
  4. New 新建一个对话框对象
  5. Init 初始化对话框各控件的值
  6. Show 显示对话框并进行交互

2 Model 数据模型

初始化要显示的数据。

以表格为例,假如有 1000条数据,每条数据有5项内容。

需要初始化以下三个必要变量

  • 总页数 total-page
  • 当前页 curr-page
  • 表格数据 lst-table
"1. Model 建立数据模型。"
(setq lst-cell
      (quote (("里程L" "高程H" "半径R")
              (0.0 218.0 0.0)
              (315.589 226.02 1000)
              (815.589 261.02 1000)
              (988.596 255.83 1000)
              (1407.44 260.01 1000)
              (1578.32 265.14 1000)
              (1768.39 264.57 1000)
              (2068.39 240.57 1000)
              (2168.39 237.57 1000)
              (2439.11 215.91 1000)
              (2527.98 213.9 10.0)
              (315.589 226.02 1000)
              (815.589 261.02 1000)
              (988.596 255.83 1000)
              (1407.44 260.01 1000)
              (1578.32 265.14 1000)
              (1768.39 264.57 1000)
              (2068.39 240.57 1000)
              (2168.39 237.57 1000)
              (2439.11 215.91 1000)
              (2527.98 213.9 10.0)
              (315.589 226.02 1000)
              (815.589 261.02 1000)
              (988.596 255.83 1000)
              (1407.44 260.01 1000)
              (1578.32 265.14 1000)
              (1768.39 264.57 1000)
              (2068.39 240.57 1000)
              (2168.39 237.57 1000)
              (2439.11 215.91 1000)
              (2527.98 213.9 10.0)
              (315.589 226.02 1000)
              (815.589 261.02 1000)
              (988.596 255.83 1000)
              (1407.44 260.01 1000)
              (1578.32 265.14 1000)
              (1768.39 264.57 1000)
              (2068.39 240.57 1000)
              (2168.39 237.57 1000)
              (2439.11 215.91 1000)
              (2527.98 213.9 10.0))))
(setq accept-hook nil)
(setq lst-cellraw lst-cell)
(setq cell1tmp-data lst-cell)
(setq cell1curr-page 0)

3 View 建立视图 dcl文件

使用 lisp 代码创建dcl文件。

dcl 文件用于设置,各个控件(tile)的尺寸及布局方式。dcl 文件内容不包含Model中要显示数据。

数据的显示将在 Init 中实现。

@lisp函数库提示了一些组合控件,如表格、多行文字、翻页、Tabs、滚动条等。可以快速实现DCL设计。

"2. View 建立显示视图。"
(dcl:dialog "example")
(dcl:cell "cell1"
          9 (length (car cell1tmp-data))
          t t t t)
(dcl:dialog-end-ok-cancel)

4 Control 建立控制逻辑

在这里定义对话框的回调函数,回调函数命名一般以 cb- 或 callback- 开头,用于区别一般函数。

还以表格为例: 我们需要定义 cb-scrollbar 函数,用于实现操作滚动条时,表格内的数据可以更新。

如果引入了 分页控件,则需要定义cb-flush-page来实现表格数据的更新。

扩展框件 dcl:cell 已包含默认的回调函数。

5 New 新建一个对话框对象

以上 MVC 前三个步骤实现了DCL及业务逻辑的定义。 现在可以载入DCL 到内存了。

本步骤只需一行代码。

(dcl:new "example") ;; name 为 view 步骤中 dcl:dialog 创建的对话框名,两者需一致。

6 Init 初始化对话框各控件的值

现在需要初始化一些显示值,比如当前页,表格数据的显示等。

如分页控件的 (paging-init),显示页面 (cb-flush-page) 等。

"5. Init 初始化对话框"
(set_tile "title"
          "Example 标题")
(dcl:show-celldata "cell1")

7 Show 显示对话框并进行交互

以上步骤完整无误,现在只需显示即可。也是一行搞定。

(dcl:show)

不过我们还需要做后续的收尾工作。比如 关闭对话框后需要删除 临时创建的dcl文件。返回给程序后续需要的结果。

8 示例

示例代码见 http://atlisp.cn/function/example:dcl-dialog dcl系列。