vitalgg 发表于 2022-4-11 20:24:01

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

本帖最后由 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 示例:











MUSIC-DIE 发表于 2022-4-11 21:13:43

牛哇牛哇牛哇牛哇牛哇牛哇牛哇牛哇

xshrimp 发表于 2022-4-11 23:39:15

能看懂你的思路和方法的估计自己也写出来了.

vitalgg 发表于 2022-4-12 05:36:33

本帖最后由 vitalgg 于 2022-4-12 05:45 编辑

xshrimp 发表于 2022-4-11 23:39
能看懂你的思路和方法的估计自己也写出来了.
MVC模式 是一种开发模式或开发框架,
这个思路不是我创立的。只不过是套用了其它语言的界面开发方法。只是为了方便记忆全部过程 后面加了NIS.主要思想还是MVC.

像早期的 微软C++的 MVC开发库
以及 java 的 strust , spring
PHP 的 Zend Framework
.net MVC

https://pic3.zhimg.com/80/v2-0c16fc01e5f9422d12c7b6b27880285a_720w.jpg

spp_wall 发表于 2022-4-12 14:42:02

厉害!!!!!!

紫苏炒黄瓜 发表于 2022-4-12 22:18:20

支持一下!

xiongyuer 发表于 2022-4-17 21:48:38

可以很好的学习DCL了
页: [1]
查看完整版本: MVCNIS 方法:6步实现动态DCL编程