Miser1 发表于 2014-1-21 19:27:41

[经验交流]在DL触发器中重新 分析打开 本DL模板的方法

主要用途:在复杂DL内,只需要定义一个DL会话项目定义/更新主体函数,在DL触发器导致的会话项目发生大量变动时,只需要重新
运行该主体函数,不需要重新定义计算。举例如下:
错误的方法:

ZVSE
!!FU645:P;
!?FU645;
!!DL645:N^645.txt^;分析模板
**会话项目定义**
.
.
.
!!DL645:S1;显示DL对话框
!!FU:E;
!?DL&v998=645/v999=123/v1000=13;左键点击ID123的会话时
**各种子触发、各种运算**
.
.
.
!!DL645:C1;关闭DL645
!!FU645:P;   重新打开DL645
!!FU:E;


这样的调用是错误的,原因是,在DL触发器中无法重新分析本DL模板,无法调用本DL显示。
为了实现重新调用,想了很久,比如重新增加一个相同的DL646互相调用,但都是没想通。
突然想到,为什么执着于再打开呢。。我可以想办法让DL一直反复打开,不需要时关闭就行了。
于是,方案如下:
ZVSE
!!DO645/0/0/0:P;   使用循环函数,保证每次加载DL模板时都处于释放状态,x16作为控制开头,可通过改变x16控制DL开头
!?FU645;
!!DL645:N^645.txt^;分析模板
**会话项目定义**
.
.
.
!!VRv16:S0;   DL开关
!!DL645:S1;显示DL对话框
!!VRx16:Sv16;循环条件判定
!!FU:E;
!?DL&v998=645/v999=123/v1000=13;左键点击ID123的会话时
**各种子触发、各种运算**
.
.
.
!!DL645:C1;关闭DL645,会自动重新分析模板,重新计算,重新打开
**如果真的想关闭DL645**
!?DL&v998=645/v999=321/v1000=13;左键点击ID321的会话时
!!VRv16:S1;
!!DL645:C1;关闭DL645,这次真的关了
!!FU:E;

贤知有您 发表于 2014-1-22 08:29:35

好像没看懂主要用途.
在DL对话框调用自己,这个怎么理解?
同时显示多个"相同ID的DL对话框"吗?
按理一般情况不需要显示多个自身对话框吧.

如果让对话框内容更改,实则是不需要重新关闭和加载对话框的.直接DL:A项目就可以更新显示了.

Miser1 发表于 2014-1-22 20:27:32

贤知有您 发表于 2014-1-22 08:29
好像没看懂主要用途.
在DL对话框调用自己,这个怎么理解?
同时显示多个"相同ID的DL对话框"吗?


比如说我的DL645有上百个ID元素,我把最常用的ID状态直接写入DL模版,来减少程序量。
而DL绝大多状态是根据十几个变量计算得来的。
我先写一个函数,用来定义这十几个变量和ID元素的对应关系,姑且叫这个函数为F。
然后打开DL645.
再然后就是通过!?DL触发器,触发的一系统操作改变这十几个变量。
这时,当然可以通过DL:A进行DL修正。
这里存在3个考虑:
1是这些算法我在函数F已经定义了。。存在重复。。当然你也可以采用多个分块函数。。
2是如果可变动的状态实在太多,每个都单独定义太麻烦,而且容易漏条件。
3是如果存在多次定义,如果以后要改东西,很容易漏掉个别模块,我认为,同一个功能越少重复相关模块越好,最好是一对一。
所以,我的方法是,只要变量改变结束,重新运行函数F,所有ID元素就能重新定义了。
但是这里有个问题,变量改变是DL触发器中改变的,这时是不能重新分析DL模版的,即使你用DL:C关闭掉也不行,除非触发器完全结束,也就是我原贴中的错误方案。
为保证DL触发器结束后,DL能继续被触发(重新分析打开),我才想出这个方法。
我已经测试可用了。不存在逻辑问题和反复调用的死循环。

Miser1 发表于 2014-1-22 21:18:00

贤知有您 发表于 2014-1-22 08:29
好像没看懂主要用途.
在DL对话框调用自己,这个怎么理解?
同时显示多个"相同ID的DL对话框"吗?


其实我还有另外一个方案
就是在每个可能激活DL的地方加入DL:N分析模板
而函数F只负责计算和变更。
要不就是加一个外函数如
!?647;
!!DL645:N^645.txt^;
!!FU645:P
每次调用FU647
但考虑还是存在很多问题,并且没有在触发器中重复打开DL功能。
最主要,还是不符合我的习惯。。呵呵。
页: [1]
查看完整版本: [经验交流]在DL触发器中重新 分析打开 本DL模板的方法

捐赠