1 一个实例效果
2 前台框架解析
3 节点绑定界面
4 如何实现主界面参数传递给子界面,页面间的跳转
5 如何实现增、删、改、查、复核、撤回的数据存储
6 如何实现权限控制
之前的七个问题回答的比较勉强,很多地方的理解都不太清楚,这里通过实际的实例,再重新把七个问题中的五个问题的逻辑在梳理一遍。
1 一个实例效果
首先看效果
文字描述
- 1 节点绑定页面,实现页面切换;
- 2 A、B、C三个页面的跳转、传参;
- 3 数据的增、删、改、查;
- 4 复核、撤回状态变化,多页面复核状态控制;
- 5 权限控制;
2 前台框架解析
第一层:容器层(不做涉及具体业务的一切事情)
主要实现功能:
- 注册业务节点.实现接口IMDChileForm的两个方法:InitLeftControl,GetLeftControl}(下图左侧红框处)
InitLeftControl
GetLeftControl
- 实现对ToolBar上面功能按钮权限控制及可见性控制 (下图上侧红框处)
tvYwlbChange
- 将各业务节点所对应的功能Action引出,绑定在相应的ToolButton功能按钮上
tvYwlbChange
- 实现公共参数取值, 传递给各业务FramList---- GetParam
tvYwlbChange
SetControlsState
第二层:数据浏览层(为统一标准必须从TBaseListFrame继承)
主要实现功能:
- 1 各业务操作功能实例化: 增,删,改,查看
- 2 调整类函数为: StdCall类型 并用关键字:Exports引出.为扩展系统自由组合菜单使用
- 3 打印<定制>, 导出<定制>,复制,复核,取消复核功能的实现
对于第二层来说,最重要的部分就是参数的传递以及函数之间的调用,页面间的传递。
第三层:具体实现层
主要实现功能:
- 各业务操作函数的具体实现,操作后台数据库:增,删,改,查看,打印<定制>, 导出<定制>,复制,复核,取消复核....
//属性读函数,是属性被“读取”时所执行的操作,这样在执行“取值”操作时,具备了执行其他动作的可能。
property ywlb: Integer read l_ywlb write setywlb;
https://www.cnblogs.com/yplong/archive/2011/12/26/2301630.html
3 节点绑定界面
(1)uses处声明
uses
hsZQXX_GP
(2)指定统一入口函数,并进行函数初始化
//入口函数统一标准化,为以后自由组合菜单,将此函数引出
function SHOW_GPSZ(Parent: TWinControl; const Ywlb: Integer;
const OnGetParam: TGetParamEvent): TBaseListFrame; stdcall;
//引出入口函数可供其他DLL或EXE程序调用
exports SHOW_GPSZ;
function SHOW_GPSZ(Parent: TWinControl; const Ywlb: Integer; const OnGetParam: TGetParamEvent): TBaseListFrame;
begin
Result := TFramZQXX_GP.Create(Parent);
TFramZQXX_GP(Result).ywlb := Ywlb;
Result.Name := '';
TFramZQXX_GP(Result).FOnGetParam := OnGetParam;
Result.Parent := Parent;
Result.Align := alClient;
end;
(3)将需要add的node节点TYwlb_Entry传入
procedure Add_Operation(APath, AName:string; AYwlb: Integer; op: TYwlb_Entry);
var
nd: TYwlbNode;
sa: TStringDynArray;
i: Integer;
pNode: TTreeNode;
begin
if not Assigned(op) then Exit;
pNode := nil;
APath := Trim(APath);
if APath <> '' then
begin
SetLength(sa, 0);
sa := StrToArray(APath, '|');
for i := Low(sa) to High(sa) do
pNode := FindNode(sa[i], pNode);
end;
nd := TYwlbNode.Create(tvYwlb.Items);
if AName <> '理财产品' then
nd.ImageIndex := 2
else
nd.ImageIndex := 1;
nd.SelectedIndex := 3;
nd.ywlb := AYwlb;
nd.func := @op;
tvYwlb.Items.AddNode(nd, pNode, AName, nil, naAddChild);
if not Assigned(fNode) then
fNode := nd;
end;
4 如何实现主界面参数传递给子界面,页面间的跳转
(1)页面参数传递。
仔细观察后,其实就是需要什么参数就在方法中添加对应的参数,可能是之前对参数的类型不熟悉,后面应该会好。
列举一下第三层主要的一些控制参数
1 iNeedChecked
2 增、删、查的状态函数
获取页面关键参数
Self.VerifyEnabled := (pos(',7,',','+GetSysParam(0,'JCSZ_XFHZQLB','')+',') <> 0);
Self.LookField := 'l_zqnm'; //主键,这里设置的需要获得的域在后面可以被查看
//注入ListFrame的数据操作函数
Self.OnRefresh := DoGetData; //刷新功能
Self.OnOpenNode := DoOpenNode; //查看功能
Self.OnAddNode := DoAddNode; //新增功能
Self.OnEditNode := DoEditNode; //编辑功能
Self.OnDelNode := DoDelNode; //删除功能
Self.OnVerifyNode := DoVerifyNode; //复核功能
Self.OnUndoNode := DoUndoNode; //撤消功能
5 复核、撤回的数据存储
复核部分:一般都是通过获取系统参数的方式来获取是否需要复核,然后根据复核与否在页面上执行不同的逻辑。
复核表:记录已复核的数据。当未开启复核状态时,则默认为不复核状态,插入的数据直接存入复核表。
未复核表:开启复核功能。
新增数据(复核):先存入未复核表,复核后存入复核表;
删除数据(复核):数据在未复核状态下,直接从未复核表中将数据删除。数据在由未复核表进入复核表时,则需要将复核表中的数据撤回到未复核表中。
6 如何实现权限控制
第一种权限控制,在框架的第一层实现,主要是通过实际的业务逻辑控制参数。
第二种权限控制,由后面模块调用产生页面,这时需要通过当前页面参数进行权限控制。
涉及OnExcute和OnUpdate两个方法:
OnExcute:点击时调用
OnUpdate:不断轮训刷新调用
权限是实时刷新检测的,主要OnUpdate:不断轮训刷新调用
另一个OnExcute在点击时会自动调用,在下面方法在读取参数时,也会自动执行OnExcute方法。
property acExcel: TAction read actExcel; //导出功能
property acPrint: TAction read actPrint; //导出功能
property acCopy: TAction read actCopy; //复制功能