本帖最后由 vitalgg 于 2022-5-17 10:47 编辑
示例代码中所有函数 的定义代码来自 @lisp函数库 http://atlisp.cn/functionlib.html
查看函数定义请访问 http:// atlisp. cn/function/函数名
例如:
要查看函数 dcl:dialog 的定义,请访问 http://atlisp.cn/function/dcl:dialog
要查看函数 dcl:mtext 的定义,请访问 http://atlisp.cn/function/dcl:mtext
MVCNIS 简述
Model 建立数据模型
View 建立视图 dcl文件
Control 建立控制逻辑
New 新建一个对话框对象
Init 初始化对话框各控件的值
Show 显示对话框并进行交互
1 Model 数据模型
初始化要显示的数据。 以表格为例,假如有 1000条数据,每条数据有5项内容。 需要初始化以下三个必要变量 总页数 total-page 当前页 curr-page 表格数据 lst-table
2 View 建立视图 dcl文件
使用 lisp 代码创建dcl文件。 dcl 文件用于设置,各个控件(tile)的尺寸及布局方式。 dcl 文件内容不包含Model中要显示数据。 数据的显示将在 Init 中实现。 @lisp函数库提示了一些组合控件,如表格、多行文字、 翻页、Tabs、滚动条等。可以快速实现DCL设计。
3 Control 建立控制逻辑
在这里定义对话框的回调函数,回调函数命名一般以 cb- 或 callback- 开头,用于区别一般函数。 还以表格为例: 我们需要定义 cb-scrollbar 函数,用于 实现操作滚动条时,表格内的数据可以更新。 如果引入了 分页控件,则需要定义cb-flush-page来实现 表格数据的更新。
4 New 新建一个对话框对象
以上 MVC 前三个步骤实现了DCL及业务逻辑的定义。 现在可以载入DCL 到内存了。 本步骤只需一行代码。 (dcl:new "name") ;; name 为 view 步骤中 dcl:dialog 创建的对话框名,两者需一致。
5 Init 初始化对话框各控件的值
现在需要初始化一些显示值,比如当前页,表格数据的显示等。 如分页控件的 (paging-init),显示页面 (cb-flush-page) 等。
6 Show 显示对话框并进行交互
以上步骤完整无误,现在只需显示即可。也是一行搞定。 (dcl:show). 不过我们还需要做后续的收尾工作。比如 关闭对话框后需要删除 临时创建的dcl文件。返回给程序后续需要的结果。 示例代码见 http://atlisp.cn/function/example:dcl-dialog
基本示例
- (defun example:dcl-dialog (/ curr-page total-page dcl-fp dcl-tmp)
- "MVCNIS 法: 6 步进行动态 DCL 开发。"
- ""
- "(example:dcl-dialog)"
- (require (quote dcl:*))
- "1. Model 建立数据模型。"
- (setq curr-page 0)
- (setq total-page 5)
- "2. View 建立显示视图。"
- (dcl:dialog "example")
- (progn (dcl:hr 0.08)
- (write-line ":text{key=\"num\";}"
- dcl-fp)
- (dcl:hr 0.08)
- (dcl:table 8 8 nil t t nil)
- (dcl:hr 0.08)
- (dcl:paging t))
- (dcl:dialog-end-ok-cancel)
- "3. Control 创建控制流程"
- (defun cb-flush-page nil (set_tile "num"
- (strcat "
- 当前页面: "
- (itoa (1+ curr-page)))))
- "4. New 一个新对话框对象。"
- (dcl:new "example")
- "5. Init 初始化对话框"
- (set_tile "title"
- "Example 标题")
- (paging-init)
- (cb-flush-page)
- "6. Show dialog 显示并进行交互"
- (dcl:show)
- (princ))
一个多行文本示例
- (defun example:dcl-mtext (/ dcl-fp dcl-tmp)
- "MVCNIS 法: 6 步进行动态 DCL 开发。"
- ""
- "(example:dcl-mtext)"
- (require (quote dcl:*))
- "1. Model 建立数据模型。"
- "2. View 建立显示视图。"
- (dcl:dialog "example")
- (progn (dcl:mtext "mt"
- 3 50)
- (dcl:begin-cluster "row"
- "")
- (progn (dcl:button "btn1"
- "按钮1"
- "")
- (dcl:button "btn2"
- "按钮2"
- "")
- (dcl:end-cluster)))
- (dcl:dialog-end-ok-cancel)
- "3. Control 创建控制流程"
- (defun cb-btn1 nil (dcl:set-mtext "mt"
- "按下了按钮1按下了按钮1按下了按钮1按下了按钮1按下了按钮1按下了按钮1按下了按钮1按下了按钮1"))
- (defun cb-btn2 nil (dcl:set-mtext "mt"
- "按下了按钮2按下了按钮2按下了按钮2按下了按钮2按下了按钮2按下了按钮2按下了按钮2按下了按钮2"))
- "4. New 一个新对话框对象。"
- (dcl:new "example")
- "5. Init 初始化对话框"
- (set_tile "title"
- "dcl-多行文本示例")
- (dcl:set-mtext "mt"
- "初始化多行文本内容。初始化多行文本内容。初始化多行文本内容。初始化多行文本内容。初始化多行文本内容。")
- "6. Show dialog 显示并进行交互"
- (dcl:show)
- (princ))
多行文本的赋值示例:
一些View 示例:
|