爱招飞帮助手册 爱招飞帮助手册
首页
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 系统工具
    • 系统管理
    • 数据库工具
    • 专用模板
    • 外部功能
    • 开发流程
    • 函数代码
  • 开发手册
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 开发手册
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 开发手册
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • 报表设计
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • RestAPI
    • WebSocket
  • 学习手册

    • 安装配置
    • 快速上手
    • 程序架构
    • 界面介绍
    • 功能介绍
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • 预设资料
    • RestAPI说明
    • WebSocket说明
    • MQTT说明
    • Python说明
    • 自定程序
    • 运行卫士
    • 自动化作业
    • 函数程序
    • 控件使用
  • 开发手册
  • FastERP
  • FastWeb
  • Smart
  • PinToo
  • Flying
  • TARS
  • 通用功能

    • Report
    • Script
    • Echarts
    • Chart
    • DB Install
    • HiDesk
    • HiNAT
    • FastBPM
    • ReportBuilder
首页
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 系统工具
    • 系统管理
    • 数据库工具
    • 专用模板
    • 外部功能
    • 开发流程
    • 函数代码
  • 开发手册
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 开发手册
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 开发手册
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • 报表设计
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • RestAPI
    • WebSocket
  • 学习手册

    • 安装配置
    • 快速上手
    • 程序架构
    • 界面介绍
    • 功能介绍
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • 预设资料
    • RestAPI说明
    • WebSocket说明
    • MQTT说明
    • Python说明
    • 自定程序
    • 运行卫士
    • 自动化作业
    • 函数程序
    • 控件使用
  • 开发手册
  • FastERP
  • FastWeb
  • Smart
  • PinToo
  • Flying
  • TARS
  • 通用功能

    • Report
    • Script
    • Echarts
    • Chart
    • DB Install
    • HiDesk
    • HiNAT
    • FastBPM
    • ReportBuilder
  • FastWeb帮助主页
  • 学习手册

    • 基本入门

    • 功能介绍

    • 控件说明

    • 系统工具

    • 系统管理

    • 云服务工具

    • 数据库工具

    • 专用模板

    • 外部功能

    • 开发流程

      • 开发案例
        • 1. 创建数据库
        • 2. 建立模块
        • 3. 模块设计
          • 3.1. 引用公共单元
          • 3.2. 机构管理
          • 3.3. 护照管理
        • 4. 菜单配置
        • 5. 权限设置
        • 6. 检查
      • 纺织印染业ERP设计实务
      • 页面布局
      • URLFrame与JS的交互
      • 自定控件扩展

      • RestAPI扩展

      • IsoBean开发

    • 函数程序

  • 开发手册

目录

开发案例

# FastWeb开发案例

  • 适用平台:WEB(桌面)

  在本节中,我们将以一个护照管理系统为例,讲解在FastWeb中如何进行模块开发以及实现模块上线的功能。

# 1. 创建数据库

  在本范例中,我们使用MSSQL作为演示用数据库。在FastWeb数据库中,建立两个表Pass_Paper_Inst与Pass_Paper_Info。表的基本信息如下图所示,也可以直接执行下方的SQL进行表的创建。我们提供的示例中已经创建了这两个表,无需再进行创建。

Paper_Inst
Paper_Info
---Pass_Paper_Inst 签证机构表
CREATE TABLE [dbo].[Pass_Paper_Inst](
	[ID] [nvarchar](50) NOT NULL,
	[InstNo] [nvarchar](50) NOT NULL,
	[InstName] [nvarchar](50) NOT NULL,
	[ParentID] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Pass_Paper_Inst] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

--Pass_Paper_Info 签证表
CREATE TABLE [dbo].[Pass_Paper_Info](
	[ID] [nvarchar](50) NOT NULL,
	[OwnerNo] [nvarchar](50) NOT NULL,
	[OwnerName] [nvarchar](50) NOT NULL,
	[PaperNo] [nvarchar](50) NOT NULL,
	[PaperType] [nvarchar](50) NOT NULL,
	[PaperState] [nvarchar](50) NOT NULL,
	[InstNo] [nvarchar](50) NOT NULL,
	[InstName] [nvarchar](50) NOT NULL,
	[UserImage] [image] NULL,
	[PaperDate] [datetime] NULL,
	[PaperExpire] [datetime] NULL,
 CONSTRAINT [PK_Pass_Paper_Info] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 2. 建立模块

  在FastWeb中点击左侧菜单栏中的[系统工具]-[模块列表(WEB)],打开模块列表界面。在此处建立两个模块,分别对应为机构管理和护照管理。

  点击模块页面左上角的[添加]按钮,进行模块的添加,填写模块的标题以及对应的开发用户,填写完成后点击[保存]。

  按照同样的方式建立护照管理。

# 3. 模块设计

# 3.1. 引用公共单元

  在该案例中,我们将数据库的连接定义写在公共单元中,如果已经按照要求设置好TARS中关于FastWeb数据库的连接设置,在此处可直接勾选引用。

  进入任意一个模块的设计模式界面,切换至程序代码编辑界面,在右侧的公共单元中选择pub_js_tarslink(JScript)或者pub_pas_tarslink(PasScript),点击上方的[修改]按钮,打开公共单元编辑界面。

  根据实际的情况修改GetRFWeb其中的部分属性内容,修改完成后,点击[保存]以完成数据库连接的定义。

# 3.2. 机构管理

  在模块列表中选择机构管理,点击上方的[模块设计]按钮,进入到模块设计界面。

  在其中放置一个TUgContainer三个TUgButton、一个TUgTreeGrid、一个TUgRFDataSet、一个TUgDataSource和一个UgTimer。设计效果如图所示。

  其中的部分控件配置如下:

  • UgWebRunFrame

  该控件为页面的背景,其中的部分属性配置如下:

属性 取值 说明
Align alClient 控件客户端页面布局
  • UgContainerPanel01

  该控件用于为工具栏的按钮区确定布局。其中的部分属性配置如下:

属性 取值 说明
Align alTop 控件排布于页面的顶部
  • btnAppend、btnDelete、btnEditor

  该控件为按钮控件。

属性 取值 说明
Caption 添加/删除/修改 按钮字幕内容
Name btnAppend/btnDelete/btnEditor 按钮控件名称
  • UgFDQuery01 TUgRFDataSet的控件名称
属性 取值 说明
CachedUpdates True 是否允许缓存需要进行更新的数据
  • UgDataSource01
属性 取值 说明
DataSet UgFDQuery01 设定数据源绑定的数据集
  • UgDBTreeGrid01

  该控件是以树的方式对数据内容进行显示。在此处需设置两组字段用于显示。双击该控件,在显示的表格编辑器中对需要显示的字段进行设定。

  该控件的部分属性配置如下:

属性 取值 说明
DataSource UgDataSource01 设定控件绑定的数据源
IdField ID 设定显示为树形结点的主键字段
IdParentField ParentID 设定显示为树形节点的父结点的字段
  • FullExpand

  该控件为一个计时器的控件,用于延迟触发事件,此处用于展开数据表格。

属性 取值 说明
Name FullExpand 控件的名称
Interval 500 控件的时间间隔
  • 事件设置

UgWebRunFrame的Events界面,在OnAfterRunScript处双击以生成事件。

btnApeend、btnDelete、btnEditor的Events界面,在OnClick处双击以生成事件。

FullExpand的Events界面,在OnTimer处双击以生成事件。

UgDBTreeGrid01的Events界面,在OnSelectionChange处双击以生成事件。

  • 代码程序编辑

  在事件对应的程序生成后,在对应的事件中进行代码的填写,包含一些自定义函数以及过程的定义。该程序需要引用公共单元中的DBLink,在公共单元模块中需对DBLink进行勾选。

  参考的程序内容如下:

    //JScript
    function GetEditorForm()
    //生成编辑窗体,用于编辑机构信息
    {
      var edID,edInstNo,edInstName,edParentID,btOk;
      Result = new TUgWebForm(UniApplication);
      Result.FreeOnClose = False;
      Result.Width = 320;
      Result.Height = 460;
      Result.Bordericons =biSystemMenu;
      
      //ID字段
      edID= new TUgEdit(Result);
      edID.Name = "edID";
      edID.Height = 48;
      edID.Enabled = False;
      edID.Parent = Result;
      edID.FieldLabel = "记录唯一地址";
      edID.FieldLabelSeparator = "";
      edID.FieldLabelAlign = laTop;
      edID.Align = alTop;
      edID.Margins.Left = 8;
      edID.Margins.Right = 8;
      edID.AlignWithMargins = True;
      
      //InstNo机构代码
      edInstNo = new TUgEdit(Result);
      edInstNo.Name = "edInstNo";
      edInstNo.Height = 48;
      edInstNo.Parent = Result;
      edInstNo.FieldLabel = "机构代码";
      edInstNo.FieldLabelSeparator = "";
      edInstNo.FieldLabelAlign =laTop;
      edInstNo.Align = alTop;
      edInstNo.Margins.Left = 8;
      edInstNo.Margins.Right = 8;
      edInstNo.AlignWithMargins = True;
      edInstNo.EmptyText="请输机构组代码";
    
      //InstName客户名称
      edInstName= new TUgEdit(Result);
      edInstName.Name = "edInstName";
      edInstName.Height = 48;
      edInstName.Parent = Result;
      edInstName.FieldLabel = "机构名称";
      edInstName.FieldLabelSeparator = "";
      edInstName.FieldLabelAlign = laTop;
      edInstName.Align = alTop;
      edInstName.Margins.Left = 8;
      edInstName.Margins.Right = 8;
      edInstName.AlignWithMargins = True;
      edInstName.EmptyText="请输入机构名称";
    
      //ParetID 上级地址
      edParentID= new TUgEdit(Result);
      edParentID.Name = "edParentID";
      edParentID.Height = 48;
      edParentID.Enabled = False;
      edParentID.Parent = Result;
      edParentID.FieldLabel = "上级地址";
      edParentID.FieldLabelSeparator = "";
      edParentID.FieldLabelAlign = laTop;
      edParentID.Align = alTop;
      edParentID.Margins.Left = 8;
      edParentID.Margins.Right = 8;
      edParentID.AlignWithMargins = True;
      
      btOk= new TUgButton(Result);
      btOk.Name = "btOk";
      btOk.Height = 32;
      btOk.Parent = Result;
      btOk.Margins.Bottom= 6;
      btOk.Margins.Left = 8;
      btOk.Margins.Right = 8;
      btOk.Align = alBottom;
      btOk.Caption="保存";
      btOk.ModalResult = mrOK;
      btOk.AlignWithMargins = True;  
    }
    
    //获取当前节点的下级节点数
    function CurrentCount(AParentID)
    {
      var iCds;
      iCds= new TUgRFDataSet(Self);
      try{
      	iCds.Connection = GetRFWeb;
      	iCds.SQL = UgFDQuery01.SQL;
        iCds.Open;
        iCds.Filtered = False;
        iCds.Filter   = "ParentID = """+ AParentID + """";
        iCds.Filtered = True;
        Result=iCds.RecordCount;
        }
      finally{
        iCds.Free;
      }
    }
    
    //获取当前节点的索引值
    function CurrentIndex(AParentID,AID)
    {
      var iCds,i;
      iCds= new TUgRFDataSet(Self);
      try{
        iCds.Connection = GetFD;
      	iCds.SQL = UgFDQuery01.SQL;
        iCds.Open;
        iCds.IndexFieldNames = UgFDQuery01.IndexFieldNames;
        iCds.Filtered = False;
        iCds.Filter   = "ParentID = """ + AParentID + """";
        iCds.Filtered = True;
        i=0;
        while (!iCds.Eof)
        {
          if (iCds.FieldByName("ID").AsString == AID)
          {
            Result= i;
            return;
          }
          i = i + 1;
          iCds.Next;
        }
        Result= -1;
      }
      finally{
        iCds.Free;
      }
    }
    
    //以唯一地址获取上级地址
    function GetParentByGuid(AID)
    {
      var iCds;
      iCds= new TUgRFDataSet(Self);
      try{
        iCds.Connection = GetRFWeb;
      	iCds.SQL = UgFDQuery01.SQL;
        iCds.Open;
        iCds.Filtered = False;
        iCds.Filter   = "ID = """ + AID + """";
        iCds.Filtered = True;
        if (iCds.RecordCount > 0){
          Result=iCds.FieldByName("ParentID").AsString;
          return;
        }
        Result= "";
      }
      finally{
        iCds.Free;
      }
    }
    
    //刷新按钮状态
    function RefButtons()
    {
      var c,p,g,i;
      //当前节点唯一地址
      g = UgFDQuery01.FieldByName("ID").AsString;
      //当前节点上级地址
      p = UgFDQuery01.FieldByName("ParentID").AsString;
      //获取当前节点的下级节点数
      c = CurrentCount(g);
      //获取当前节点的索引值
      i = CurrentIndex(p,g);
      btnAppend.Enabled = True;
      btnDelete.Enabled = ((c == 0) && (p != ""));
      btnEditor.Enabled = p != "";
    }
    
    //btnAppend的OnClick事件,点击按钮以添加按钮分类
    function btnAppendOnClick(sender)
    {
      var F,b,l,e,c;
      F=GetEditorForm;
      l= new TStringList;
      Try{
        F.Caption = UGMM.LT("添加机构");
        TUgEdit(F.FindComponent("edID")).Text   = UGMM.CreateGuid; //获取GUID
        if (UgFDQuery01.IsEmpty){
          TUgEdit(F.FindComponent("edParentID")).Text = TUgEdit(F.FindComponent("edID")).Text;
        }
        else{
          TUgEdit(F.FindComponent("edParentID")).Text = UgFDQuery01.FieldbyName("ID").AsString; 
        }
        e="";
        b=True;
        While (b)
        {
          if (e!="")
          MessageDlg(e,mtError,mbOK);
          if (F.ShowModal == mrOK) 
          {
            Try{
              if (Trim(TUgEdit(F.FindComponent("edInstNo")).Text) == "")
                RaiseException(UGMM.LT("机构代码不能为空"));
              if (Trim(TUgEdit(F.FindComponent("edInstName")).Text) == "")
                RaiseException(UGMM.LT("机构名称不能为空"));
                 l.Clear;
              l.add("ActionType=Update");
              l.add("ID=" + TUgEdit(F.FindComponent("edID")).Text);
              l.add("InstNo=" + TUgEdit(F.FindComponent("edInstNo")).Text);
              l.add("InstName=" + TUgEdit(F.FindComponent("edInstName")).Text);
              l.add("ParentID=" + TUgEdit(F.FindComponent("edParentID")).Text);
              
              UgFDQuery01.Append;
              UgFDQuery01.FieldbyName("ID").AsString = l.Values["ID"];
              UgFDQuery01.FieldbyName("InstNo").asString = l.Values["InstNo"];
              UgFDQuery01.FieldbyName("InstName").asString = l.Values["InstName"];
              UgFDQuery01.FieldbyName("ParentID").asString = l.Values["ParentID"];
              UgFDQuery01.Post;
    					UgFDQuery01.ApplyUpdates(-1);
              b = False;
              UgDBTreeGrid01.Refresh;
              RefButtons;
            }
            Except{RaiseException(ExceptionMessage);}
           }
           else{
            b=False;
            }
          }
        }
      Finally{
        l.Free;
        F.Free;
      }
    }
    
    //btnDelete按钮的OnClick事件
    function btnDeleteOnClick(sender)
    {
      var c,p,g,i;
      if (UgFDQuery01.FieldbyName("ID").asString == UgFDQuery01.FieldbyName("ParentID").asString)
      RaiseException(UGMM.LT("禁止删除菜单根节点"));
      
      //当前节点唯一地址
      g = UgFDQuery01.FieldByName("ID").AsString;
      //当前节点上级地址
      p = UgFDQuery01.FieldByName("ParentID").AsString;
      //获取当前节点的下级节点数
      c = CurrentCount(g);
      //判断是否有下级字段
      if (c > 0)
      RaiseException(UGMM.LT("不能删除有下级节点的记录"));
        if (MessageDlg(UGMM.LT("是否删除该机构"),mtWarning,mbYes + mbNo) == mrYes)
        {
          UgFDQuery01.Delete;
          UgFDQuery01.ApplyUpdates(-1);
          UgDBTreeGrid01.Refresh;
          RefButtons;
        }
    }
    
    //btnEditor按钮的OnClick事件,点击以修改
    function btnEditorOnClick(sender)
    {
      var F,b,l,e;
      F=GetEditorForm;
      l= new TStringList();
      Try{
        F.Caption = UGMM.LT("编辑机构");
        TUgEdit(F.FindComponent("edID")).Text   = UgFDQuery01.FieldbyName("ID").AsString; 
        TUgEdit(F.FindComponent("edInstNo")).Text   = UgFDQuery01.FieldbyName("InstNo").AsString; 
        TUgEdit(F.FindComponent("edInstName")).Text   = UgFDQuery01.FieldbyName("InstName").AsString; 
        TUgEdit(F.FindComponent("edParentID")).Text   = UgFDQuery01.FieldbyName("ParentID").AsString;
        e="";
        b=True;
        While (b)
        {
          if (e!="")
          MessageDlg(e,mtError,mbOK);
          if (F.ShowModal == mrOK) 
          {
          Try{
              if (Trim(TUgEdit(F.FindComponent("edFGroupCode")).Text) == "")
                RaiseException(UGMM.LT("机构代号不能为空"));
              if (Trim(TUgEdit(F.FindComponent("edFGroupName")).Text) == "")
                RaiseException(UGMM.LT("机构名称不能为空"));
                 l.Clear;
              l.add("ActionType=Update");
              l.add("ID=" + TUgEdit(F.FindComponent("edID")).Text);
              l.add("InstNo=" + TUgEdit(F.FindComponent("edInstNo")).Text);
              l.add("InstName=" + TUgEdit(F.FindComponent("edInstName")).Text);
              l.add("ParentID=" + TUgEdit(F.FindComponent("edParentID")).Text);
    
              UgFDQuery01.Edit;
              UgFDQuery01.FieldbyName("ID").asString = l.Values["ID"];
              UgFDQuery01.FieldbyName("InstNo").asString = l.Values["InstNo"];
              UgFDQuery01.FieldbyName("InstName").asString = l.Values["InstName"];
              UgFDQuery01.FieldbyName("ParentID").asString = l.Values["ParentID"];
    					UgFDQuery01.Post;
              UgFDQuery01.ApplyUpdates(-1);
              b = False;
              UgDBTreeGrid01.Refresh;
              RefButtons;
            }
            Except{RaiseException(ExceptionMessage);}
              
           }
         else{
            b=False;
          }
        }
      }
      Finally{
        l.Free;
        F.Free;
      }
    }
    
    //UgWebRunFrame的OnAfterRunScript事件,窗体运行时进行程序加载
    function UgWebRunFrameOnAfterRunScript(Sender)
    {
    //翻译界面
      UGMM.LC(Self);
    //节点自动展开
      FullExpand.Enabled = True;
    //验证模块权限
      UGMM.VerifyRunFramePerm(Self);
      UgFDQuery01.Connection = GetRFWeb;
      UgFDQuery01.SQL.Text = "SELECT * FROM Paper_Inst";
      UgFDQuery01.Open; 
    }
    
    //FullExpand的OnTimer事件,以启用延迟表格刷新的功能
    function FullExpandOnTimer(sender)
    {
      FullExpand.Enabled = False;
      UgDBTreeGrid01.FullExpand;
    }
    
    //UgDBTreeGrid01的OnSelectionChange事件,刷新按钮
    function UgDBTreeGrid01OnSelectionChange(sender)
    {
      RefButtons;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    //PasScript
    Function GetEditorForm:TUgWebForm;
    //生成编辑窗体,用于编辑机构信息
    Var
      edID:TUgEdit;
      edInstNo:TUgEdit;
      edInstName:TUgEdit;
      edParentID:TUgEdit;
      btOk:TUgButton;
    Begin
      Result := TUgWebForm.Create(UniApplication);
      Result.FreeOnClose := False;
      Result.Width := 320;
      Result.Height := 460;
      Result.Bordericons :=biSystemMenu;
      
      //ID字段
      edID:=TUgEdit.Create(Result);
      edID.Name := 'edID';
      edID.Height := 48;
      edID.Enabled := False;
      edID.Parent := Result;
      edID.FieldLabel := '记录唯一地址';
      edID.FieldLabelSeparator := '';
      edID.FieldLabelAlign := laTop;
      edID.Align := alTop;
      edID.Margins.Left := 8;
      edID.Margins.Right := 8;
      edID.AlignWithMargins := True;
      
      //InstNo机构代码
      edInstNo := TUgEdit.Create(Result);
      edInstNo.Name := 'edInstNo';
      edInstNo.Height := 48;
      edInstNo.Parent := Result;
      edInstNo.FieldLabel := '机构代码';
      edInstNo.FieldLabelSeparator := '';
      edInstNo.FieldLabelAlign :=laTop;
      edInstNo.Align := alTop;
      edInstNo.Margins.Left := 8;
      edInstNo.Margins.Right := 8;
      edInstNo.AlignWithMargins := True;
      edInstNo.EmptyText:='请输机构组代码';
    
      //InstName客户名称
      edInstName:=TUgEdit.Create(Result);
      edInstName.Name := 'edInstName';
      edInstName.Height := 48;
      edInstName.Parent := Result;
      edInstName.FieldLabel := '机构名称';
      edInstName.FieldLabelSeparator := '';
      edInstName.FieldLabelAlign := laTop;
      edInstName.Align := alTop;
      edInstName.Margins.Left := 8;
      edInstName.Margins.Right := 8;
      edInstName.AlignWithMargins := True;
      edInstName.EmptyText:='请输入机构名称';
    
      //ParetID 上级地址
      edParentID:=TUgEdit.Create(Result);
      edParentID.Name := 'edParentID';
      edParentID.Height := 48;
      edParentID.Enabled := False;
      edParentID.Parent := Result;
      edParentID.FieldLabel := '上级地址';
      edParentID.FieldLabelSeparator := '';
      edParentID.FieldLabelAlign := laTop;
      edParentID.Align := alTop;
      edParentID.Margins.Left := 8;
      edParentID.Margins.Right := 8;
      edParentID.AlignWithMargins := True;
      
      btOk:=TUgButton.Create(Result);
      btOk.Name := 'btOk';
      btOk.Height := 32;
      btOk.Parent := Result;
      btOk.Margins.Bottom:= 6;
      btOk.Margins.Left := 8;
      btOk.Margins.Right := 8;
      btOk.Align := alBottom;
      btOk.Caption:='保存';
      btOk.ModalResult := mrOK;
      btOk.AlignWithMargins := True;  
    end;
    
    //获取当前节点的下级节点数
    Function CurrentCount(Const AParentID:String):Integer;
    Var
      iCds:UgRFDataSet;
    begin
      iCds:=TUgRFDataSet.Create(Self);
      try
      	iCds.Connection := GetFD;
      	iCds.SQL := UgFDQuery01.SQL;
        iCds.Open;
        iCds.Filtered := False;
        iCds.Filter   := 'ParentID = '''+ AParentID + '''';
        iCds.Filtered := True;
        Result:=iCds.RecordCount;
      finally
        iCds.Free;
      end;
    end;
    
    //获取当前节点的索引值
    Function CurrentIndex(const AParentID,AID:String):Integer;
    Var
      iCds:UgRFDataSet;
      i:Integer;
    begin
      iCds:=UgRFDataSet.Create(Self);
      try
        iCds.Connection := GetFD;
      	iCds.SQL := UgFDQuery01.SQL;
        iCds.Open;
        iCds.IndexFieldNames := UgFDQuery01.IndexFieldNames;
        iCds.Filtered := False;
        iCds.Filter   := 'ParentID = ''' + AParentID + '''';
        iCds.Filtered := True;
        i:=0;
        while not iCds.Eof do
        begin
          if iCds.FieldByName('ID').AsString = AID then
          Begin
            Result:= i;
            Exit;
          end;
          i := i + 1;
          iCds.Next;
        end;
        Result:= -1;
      finally
        iCds.Free;
      end;
    end;
    
    //以唯一地址获取上级地址
    Function GetParentByGuid(const AID:String):string;
    Var
      iCds:UgRFDataSet;
    begin
      iCds:=UgRFDataSet.Create(Self);
      try
        iCds.Connection := GetFD;
      	iCds.SQL := UgFDQuery01.SQL;
        iCds.Open;
        iCds.Filtered := False;
        iCds.Filter   := 'ID = ''' + AID + '''';
        iCds.Filtered := True;
        if iCds.RecordCount > 0 then
        Begin
          Result:=iCds.FieldByName('ParentID').AsString;
          Exit;
        end;
        Result:= '';
      finally
        iCds.Free;
      end;
    end;
    
    //刷新按钮状态
    procedure RefButtons;
    var
      c:Integer;
      p:string;
      g:string;
      i:integer;
    Begin
      //当前节点唯一地址
      g := UgFDQuery01.FieldByName('ID').AsString;
      //当前节点上级地址
      p := UgFDQuery01.FieldByName('ParentID').AsString;
      //获取当前节点的下级节点数
      c := CurrentCount(g);
      //获取当前节点的索引值
      i := CurrentIndex(p,g);
      btnAppend.Enabled := True;
      btnDelete.Enabled := (c = 0) and (p <> '');
      btnEditor.Enabled := p <> '';
    end;
    
    //btnAppend的OnClick事件,点击按钮以添加按钮分类
    procedure btnAppendOnClick(sender: tobject);
    Var
      F:TUgWebForm;
      b:Boolean;
      l:TStringList;
      e:string;
      c:Integer;
    Begin
      F:=GetEditorForm;
      l:=TStringList.Create;
      Try
        F.Caption := UGMM.LT('添加机构');
        TUgEdit(F.FindComponent('edID')).Text   := UGMM.CreateGuid; //获取GUID
        if UgFDQuery01.IsEmpty Then
          TUgEdit(F.FindComponent('edParentID')).Text := TUgEdit(F.FindComponent('edID')).Text
        Else
          TUgEdit(F.FindComponent('edParentID')).Text := UgFDQuery01.FieldbyName('ID').AsString; 
        e:='';
        b:=True;
        While b do
        Begin
          if e<>'' then
          MessageDlg(e,mtError,mbOK);
          if F.ShowModal = mrOK then 
          Begin
            Try
              if Trim(TUgEdit(F.FindComponent('edInstNo')).Text) = '' then
                RaiseException(UGMM.LT('机构代码不能为空'));
              if Trim(TUgEdit(F.FindComponent('edInstName')).Text) = '' then
                RaiseException(UGMM.LT('机构名称不能为空'));
                 l.Clear;
              l.add('ActionType=Update');
              l.add('ID=' + TUgEdit(F.FindComponent('edID')).Text);
              l.add('InstNo=' + TUgEdit(F.FindComponent('edInstNo')).Text);
              l.add('InstName=' + TUgEdit(F.FindComponent('edInstName')).Text);
              l.add('ParentID=' + TUgEdit(F.FindComponent('edParentID')).Text);
              
              UgFDQuery01.Append;
              UgFDQuery01.FieldbyName('ID').AsString := l.Values['ID'];
              UgFDQuery01.FieldbyName('InstNo').asString := l.Values['InstNo'];
              UgFDQuery01.FieldbyName('InstName').asString := l.Values['InstName'];
              UgFDQuery01.FieldbyName('ParentID').asString := l.Values['ParentID'];
              UgFDQuery01.Post;
    					UgFDQuery01.ApplyUpdates(-1);
              b := False;
              UgDBTreeGrid01.Refresh;
              RefButtons;
            Except{ExceptionMessage}
              e:=ExceptionMessage;
            end;
          End else
            b:=False;
        End;
      Finally
        l.Free;
        F.Free;
      end;
    End;
    
    //btnDelete按钮的OnClick事件
    procedure btnDeleteOnClick(sender: tobject);
    var
      c:Integer;
      p:string;
      g:string;
      i:integer;
    Begin
      if UgFDQuery01.FieldbyName('ID').asString = UgFDQuery01.FieldbyName('ParentID').asString then
      RaiseException(UGMM.LT('禁止删除菜单根节点'));
      
      //当前节点唯一地址
      g := UgFDQuery01.FieldByName('ID').AsString;
      //当前节点上级地址
      p := UgFDQuery01.FieldByName('ParentID').AsString;
      //获取当前节点的下级节点数
      c := CurrentCount(g);
      //判断是否有下级字段
      if c > 0 then
      RaiseException(UGMM.LT('不能删除有下级节点的记录'));
        if MessageDlg(UGMM.LT('是否删除该机构'),mtWarning,mbYes + mbNo) = mrYes then
        Begin
          UgFDQuery01.Delete;
          UgFDQuery01.ApplyUpdates(-1);
          UgDBTreeGrid01.Refresh;
          RefButtons;
        end;
    End;
    
    //btnEditor按钮的OnClick事件,点击以修改
    procedure btnEditorOnClick(sender: tobject);
    Var
      F:TUgWebForm;
      b:Boolean;
      l:TStringList;
      e:string;
    Begin
      F:=GetEditorForm;
      l:=TStringList.Create;
      Try
        F.Caption := UGMM.LT('编辑机构');
        TUgEdit(F.FindComponent('edID')).Text   := UgFDQuery01.FieldbyName('ID').AsString; 
        TUgEdit(F.FindComponent('edInstNo')).Text   := UgFDQuery01.FieldbyName('InstNo').AsString; 
        TUgEdit(F.FindComponent('edInstName')).Text   := UgFDQuery01.FieldbyName('InstName').AsString; 
        TUgEdit(F.FindComponent('edParentID')).Text   := UgFDQuery01.FieldbyName('ParentID').AsString;
        e:='';
        b:=True;
        While b do
        Begin
          if e<>'' then
          MessageDlg(e,mtError,mbOK);
          if F.ShowModal = mrOK then 
          Begin
            Try
              if Trim(TUgEdit(F.FindComponent('edFGroupCode')).Text) = '' then
                RaiseException(UGMM.LT('机构代号不能为空'));
              if Trim(TUgEdit(F.FindComponent('edFGroupName')).Text) = '' then
                RaiseException(UGMM.LT('机构名称不能为空'));
                 l.Clear;
              l.add('ActionType=Update');
              l.add('ID=' + TUgEdit(F.FindComponent('edID')).Text);
              l.add('InstNo=' + TUgEdit(F.FindComponent('edInstNo')).Text);
              l.add('InstName=' + TUgEdit(F.FindComponent('edInstName')).Text);
              l.add('ParentID=' + TUgEdit(F.FindComponent('edParentID')).Text);
    
              UgFDQuery01.Edit;
              UgFDQuery01.FieldbyName('ID').asString := l.Values['ID'];
              UgFDQuery01.FieldbyName('InstNo').asString := l.Values['InstNo'];
              UgFDQuery01.FieldbyName('InstName').asString := l.Values['InstName'];
              UgFDQuery01.FieldbyName('ParentID').asString := l.Values['ParentID'];
    					UgFDQuery01.Post;
              UgFDQuery01.ApplyUpdates(-1);
              b := False;
              UgDBTreeGrid01.Refresh;
              RefButtons;
            Except{ExceptionMessage}
              e:=ExceptionMessage;
            end;
          End else
            b:=False;
        End;
      Finally
        l.Free;
        F.Free;
      end;
    End;
    
    //UgWebRunFrame的OnAfterRunScript事件,窗体运行时进行程序加载
    Procedure UgWebRunFrameOnAfterRunScript(Const Sender: TObject);
    Begin
    //翻译界面
      UGMM.LC(Self);
    //节点自动展开
      FullExpand.Enabled := True;
    //验证模块权限
      UGMM.VerifyRunFramePerm(Self);
    End;
    
    //FullExpand的OnTimer事件,以启用延迟表格刷新的功能
    procedure FullExpandOnTimer(sender: tobject);
    begin
      FullExpand.Enabled := False;
      UgDBTreeGrid01.FullExpand;
    end;
    
    //UgDBTreeGrid01的OnSelectionChange事件,刷新按钮
    procedure UgDBTreeGrid01OnSelectionChange(sender: tobject);
    begin
      RefButtons;
    end;
    
    Begin
      UgFDQuery01.Connection := GetRFWeb;
      UgFDQuery01.SQL.Text := 'SELECT * FROM Paper_Inst';
      UgFDQuery01.Open; 
    End.
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    // Make sure to add code blocks to your code group
    • 保存运行

      点击设计区界面左上角的保存按钮进行保存,然后点击运行按钮,进行调试运行。

      至此机构管理的模块设计完毕。

    # 3.3. 护照管理

      在模块列表中选择护照管理,点击上方的[模块设计]按钮,进入到模块设计界面。

      该界面中需要放置的控件较多,下方会用表格的方式列出使用的控件。

    控件名称 对应控件 说明
    UgContainerPanel01 UgContainerPanel 内容面板控件,用于放置按钮以及编辑区的控件
    btnFirst UgBitBtn [首页]按钮
    btnPrior UgBitBtn [前项]按钮
    btnNext UgBitBtn [后项]按钮
    btnLast UgBitBtn [尾项]按钮
    edQuery UgEdit 用于输入员工编号的查询文本框
    btnQuery UgBitBtn [查询]按钮
    btnAppend UgBitBtn [添加]按钮
    UgVerticalLine01 UgVerticalLine [查询]按钮与[首项]按钮之间的垂直间隔线
    UgVerticalLine02 UgVerticalLine [尾项]按钮与[添加]按钮之间的垂直间隔线
    UgVerticalLine03 UgVerticalLine [取消]按钮与[刷新]按钮之间的垂直间隔线
    btnDelete UgBitBtn [删除]按钮
    btnEditor UgBitBtn [修改]按钮
    btnSave UgBitBtn [保存]按钮
    btnCancel UgBitBtn [取消]按钮
    btnRefresh UgBitBtn [刷新]按钮
    btnPrint UgBitBtn [打印]按钮
    edOwnerNo UgDBEdit 员工编号编辑框
    edOwnerName UgDBEdit 员工姓名编辑框
    cbPaperType UgDBComboBox 护照类型下拉选择框
    edPaperNo UgDBEdit 护照编号编辑框
    dtpPaperDate UgDBDateTimePicker 入库日期选择框
    dtpPaperExpire UgDBDateTimePicker 有效期至选择框
    cbPaperState UgDBComboBox 护照状态选择框
    lkcbInstNo UgDBLookupComboBox 机构编号下拉选择框
    lkcbInstName UgDBLookupComboBox 机构名称下拉选择框
    UgGroupBox01 UgGroupBox 图片显示控件的外层组框
    UgDBImage01 UgDBImage 图片显示控件
    UgDBGrid01 UgDBGrid 列表显示组件
    dsPaperInfo UgDataSource 护照信息数据源控件
    QryPaperInfo UgRFDataSet 存储护照信息的数据集
    dsPaperInst UgDataSource 机构数据源控件
    QryPaperInst UgRFDataSet 存储机构信息的数据集
    UgFileUpload01 UgFileUpload 文件上传的控件
    UgHtmlReport01 UgHtmlReport HTML格式报表控件

      其中的控件属性设置如下:

    • UgContainerPanel01
    属性 取值 说明
    Align alTop 内容面板控件需置顶
    Height 256 控件的高度
    • edQuery
    属性 取值 说明
    Width 121 控件的宽度
    EmptyText 请输入员工编号 输入框为空时显示的文字内容
    Name edQuery 控件名称
    • btnQuery/btnFirst/btnPrior/btnNext/btnLast/btnQuery/btnAppend/btnDelete/btnEditor/btnSave/btnCancel/btnRefresh/btnPrint
    属性 取值 说明
    Caption 查询/首项/前项/后项/尾项/添加/删除/修改/保存/取消/刷新/打印 按钮显示的文字字幕
    Height 40 控件高度
    Name btnQuery/btnFirst/btnPrior/btnNext/btnLast/btnQuery/
    btnAppend/btnDelete/btnEditor/btnSave/btnCancel/btnRefresh/btnPrint
    控件名称
    • UgVerticalLine01/UgVerticalLine02/UgVerticalLine03
    属性 取值 说明
    Height 40 控件高度
    Name UgVerticalLine01/UgVerticalLine02/UgVerticalLine03 控件名称
    • edOwnerNo
    属性 取值 说明
    DataField OwnerNo 设定绑定的字段
    DataSource dsPaperInfo 设定绑定的数据源
    FieldLabel 员工编号 设定显示的标签内容
    FieldLabelWidth 60 设定标签的显示宽度
    Name edOwnerNo 控件名称
    Width 250 控件宽度
    • edOwnerName
    属性 取值 说明
    DataField OwnerName 设定绑定的字段
    DataSource dsPaperInfo 设定绑定的数据源
    FieldLabel 员工姓名 设定显示的标签内容
    FieldLabelWidth 60 设定标签的显示宽度
    Name edOwnerName 控件名称
    Width 250 控件宽度
    • cbPaperType
    属性 取值 说明
    DataField PaperType 设定绑定的字段
    DataSource dsPaperInfo 设定绑定的数据源
    FieldLabel 护照类型 设定显示的标签内容
    FieldLabelWidth 60 设定标签的显示宽度
    Items 护照/港澳通行证/台湾通行证 设定下拉选框的项目
    Name cbPaperType 控件名称
    Width 250 控件宽度
    • edPaperNo
    属性 取值 说明
    DataField PaperNo 设定绑定的字段
    DataSource dsPaperInfo 设定绑定的数据源
    FieldLabel 护照编号 设定显示的标签内容
    FieldLabelWidth 60 设定标签的显示宽度
    Name edPaperNo 控件名称
    Width 250 控件宽度
    • dtpPaperDate
    属性 取值 说明
    DataField PaperDate 设定绑定的字段
    DataSource dsPaperInfo 设定绑定的数据源
    FieldLabel 入库日期 设定显示的标签内容
    FieldLabelWidth 60 设定标签的显示宽度
    Name dtpPaperDate 控件名称
    Width 250 控件宽度
    • dtpPaperExpire
    属性 取值 说明
    DataField PaperExpire 设定绑定的字段
    DataSource dsPaperInfo 设定绑定的数据源
    FieldLabel 有效期至 设定显示的标签内容
    FieldLabelWidth 60 设定标签的显示宽度
    Name dtpPaperExpire 控件名称
    Width 250 控件宽度
    • cbPaperState
    属性 取值 说明
    DataField PaperState 设定绑定的字段
    DataSource dsPaperInfo 设定绑定的数据源
    FieldLabel 护照状态 设定显示的标签内容
    FieldLabelWidth 60 设定标签的显示宽度
    Items 已出库/未出库 设定下拉选框的项目
    Name cbPaperState 控件名称
    Width 250 控件宽度
    • lkcbInstNo
    属性 取值 说明
    DataField InstNo 设定绑定的字段
    DataSource dsPaperInfo 设定绑定的数据源
    FieldLabel 机构编号 设定显示的标签内容
    FieldLabelWidth 60 设定标签的显示宽度
    KeyField InstNo 设定下拉列表需要进行传递的值的字段
    ListField InstNo 设定下拉列表显示的内容的对应字段
    ListSource dsPaperInst 设定下拉列表显示的数据对应的数据源
    Name lkcbInstNo 控件名称
    Width 250 控件宽度
    • lkcbInstName
    属性 取值 说明
    DataField InstName 设定绑定的字段
    DataSource dsPaperInfo 设定绑定的数据源
    FieldLabel 机构名称 设定显示的标签内容
    FieldLabelWidth 60 设定标签的显示宽度
    KeyField InstName 设定下拉列表需要进行传递的值的字段
    ListField InstName 设定下拉列表显示的内容的对应字段
    ListSource dsPaperInst 设定下拉列表显示的数据对应的数据源
    Name lkcbInstName 控件名称
    Width 250 控件宽度
    • UgGroupBox01
    属性 取值 说明
    Caption 双击框内以上传图片 分组框显示的内容
    • UgDBImage01
    属性 取值 说明
    DataField UserImage 设定绑定的字段
    DataSource dsPaperInfo 设定绑定的数据源
    • UgDBGrid01

      UgDBGrid01建立后,双击该控件以打开字段窗口,添加如下字段内容:

      其属性配置如下:

    属性 取值 说明
    DataSource dsPaperInfo 设定绑定的数据源
    • dsPaperInfo
    属性 取值 说明
    DataSet QryPaperInfo 设置其绑定的数据集
    Name dsPaperInfo 控件名称
    • QryPaperInfo
    属性 取值 说明
    Name QryPaperInfo 控件名称
    • dsPaperInst
    属性 取值 说明
    DataSet QryPaperInst 设置其绑定的数据集
    Name dsPaperInst 控件名称
    • QryPaperInst
    属性 取值 说明
    Name QryPaperInst 控件名称
    • UgFileUpload01
    属性 取值 说明
    Filter *.png,*.jpg 文件筛选器,筛选指定后缀名的文件
    Messages.BrowseText 浏览 文本信息翻译
    Messages.Cancel 取消 文本信息翻译
    Messages.PleaseWait 请等待 文本信息翻译
    Messages.Processing 正在处理中... 文本信息翻译
    Messages.Upload 上传 文本信息翻译
    Messages.UploadError 上传出错 文本信息翻译
    Messages.Uploading 上传中 文本信息翻译
    Messages.UploadTimeout 上传超时 文本信息翻译
    • UgHtmlReport01
    属性 取值 说明
    DBGrid UgDBGrid01 选择导出HTML报表的数据表格
    • 事件设置

    UgWebRunFrame的Events界面,在OnAfterRunScript处双击以生成事件。

    btnQuery、btnFirst、btnPrior、btnNext、btnLast、btnAppend、btnDelete、btnEditor、btnSave、btnCancel、btnRefresh、btnPrint的Events界面,在OnClick处双击以生成事件。

    lkcbInstNo、lkcbInstName的Events界面,在OnChange处双击以生成事件。

    UgDBImage01的Events界面,在OnDoubleClick处双击以生成事件。

    UgFileUpload01的Events界面,在OnCompleted处双击以生成事件。

    • 代码程序编辑

      在事件对应的程序生成后,在对应的事件中进行代码的填写,包含一些自定义函数以及过程的定义。该程序需要引用公共单元中的pub_js_tarslink,在公共单元模块中需对pub_js_tarslink进行勾选。

      参考的程序内容如下:

      //JScript
        //浏览状态
      var tyView   = 0;
        //编辑状态【添加、编辑、涂改】
      var tyEditor = 1;
        
      //刷新状态
      function RefState(AValue)
      {
        //查找
        btnQuery.Enabled = (AValue == tyView);
        //游标状态
        btnFirst.Enabled = (AValue == tyView);
        btnPrior.Enabled = (AValue == tyView);
        btnNext.Enabled  = (AValue == tyView);
        btnLast.Enabled  = (AValue == tyView);
        //编辑功能
        btnAppend.Enabled     = (AValue == tyView);
        btnDelete.Enabled     = ((AValue == tyView) && (!QryPaperInfo.IsEmpty));
        btnEditor.Enabled     = ((AValue == tyView) && (!QryPaperInfo.IsEmpty));
        //保存功能
        btnSave.Enabled       = (AValue == tyEditor);
        btnCancel.Enabled     = (AValue == tyEditor);
        cbPaperType.Enabled   = (AValue == tyEditor);
        cbPaperState.Enabled  = (AValue == tyEditor);
        lkcbInstNo.Enabled    = (AValue == tyEditor);
        lkcbInstName.Enabled  = (AValue == tyEditor);
        UgDBImage01.Enabled   = (AValue == tyEditor);
        //数据集
        dsPaperInfo.AutoEdit     = (AValue == tyEditor);
        //勾选
        if (AValue == tyEditor){
        UgDBGrid01.Options = dgEditing + dgTitles + dgIndicator + dgColumnResize + dgColLines + dgRowLines + dgConfirmDelete + dgAutoRefreshRow;
        }
        else{
        UgDBGrid01.Options = dgTitles + dgIndicator + dgColumnResize + dgColLines + dgRowLines + dgConfirmDelete + dgAutoRefreshRow;
        }
        //编辑状态
        Self.IsEditor        = (AValue == tyEditor);
      }
      
      //查询
      function btnQueryOnClick(sender)
      {
        if (edQuery.Text == "") 
        {
          QryPaperInfo.Filtered = False;
          UgDBGrid01.Refresh;
          return;
        }
        QryPaperInfo.Filtered = False;
        QryPaperInfo.Filter = "OwnerNo = '" + edQuery.Text + "'";
        QryPaperInfo.Filtered = True;
      }
      
      //首项
      function btnFirstOnClick(sender)
      {
        if (QryPaperInfo.IsEmpty)
          return;
        QryPaperInfo.First;
      }
      
      //前项
      function btnPriorOnClick(sender)
      {
        if (QryPaperInfo.IsEmpty)
          return;
        QryPaperInfo.Prior;
      }
      
      //后项
      function btnNextOnClick(sender)
      {
        if (QryPaperInfo.IsEmpty)
          return;
        QryPaperInfo.Next;
      }
      
      //尾项
      function btnLastOnClick(sender)
      {
        if (QryPaperInfo.IsEmpty)
          return;
        QryPaperInfo.Last;
      }
      
      //添加
      function btnAppendOnClick(sender)
      {
        QryPaperInfo.Insert;
        QryPaperInfo.FieldByName("ID").AsString = UGMM.CreateGuid;
        RefState(tyEditor);
      }
      
      //删除
      function btnDeleteOnClick(sender)
      {
        if (MessageDlg(UGMM.LT("注意:是否删除该信息?"),mtWarning,mbYes + mbNo) == mrYes)
        {
          QryPaperInfo.Delete;
          QryPaperInfo.Post;
          QryPaperInfo.ApplyUpdates(-1);
          ShowMessage(UGMM.LT("删除成功"));
          RefState(tyView);
        }
      }
      
      //修改
      function btnEditorOnClick(sender)
      {
        QryPaperInfo.Edit;
        RefState(tyEditor);  
      }
      
      //保存
      function btnSaveOnClick(sender)
      {
        if (Trim(QryPaperInfo.FieldByName("OwnerNo").AsString) == "")
        RaiseException(UGMM.LT("员工编号不能为空"));
        
        if (Trim(QryPaperInfo.FieldByName("OwnerName").AsString) == "")
        RaiseException(UGMM.LT("员工名称不能为空"));
        
        if (Trim(QryPaperInfo.FieldByName("PaperNo").AsString) == "")
        RaiseException(UGMM.LT("护照编号不能为空"));  
      
        if (Trim(QryPaperInfo.FieldByName("PaperType").AsString) == "")
        RaiseException(UGMM.LT("护照类型不能为空"));
        
        if (Trim(QryPaperInfo.FieldByName("PaperDate").AsString) == "")
        RaiseException(UGMM.LT("入库日期不能为空"));
      
        if (Trim(QryPaperInfo.FieldByName("PaperExpire").AsString) == "")
        RaiseException(UGMM.LT("有效日期不能为空"));
        
        if (Trim(QryPaperInfo.FieldByName("PaperState").AsString) == "")
        RaiseException(UGMM.LT("护照状态不能为空"));
        
        if (Trim(QryPaperInfo.FieldByName("InstNo").AsString) == "")
        RaiseException(UGMM.LT("机构编号不能为空"));
        
        if (Trim(QryPaperInfo.FieldByName("InstName").AsString) == "")
        RaiseException(UGMM.LT("机构名称不能为空"));
        
        QryPaperInfo.Post;
        QryPaperInfo.ApplyUpdates(-1);
        ShowMessage(UGMM.LT("保存成功"));
        RefState(tyView);
      }
      
      //取消
      function btnCancelOnClick(sender)
      {
        if (MessageDlg(UGMM.LT("注意:是否放弃保存?"),mtWarning,mbYes + mbNo) == mrYes)
        {
          QryPaperInfo.Cancel;
          RefState(tyView);
        }  
      }
      
      //刷新
      function btnRefreshOnClick(sender)
      {
        UgDBGrid01.Refresh; 
      }
      
      //修改的同时也更改名称
      function lkcbInstNoOnChange(sender)
      {
        QryPaperInfo.FieldByName("InstName").AsString = QryPaperInst.FieldByName("InstName").AsString;
      }
      
      //双击以打开图片上传对话框
      function UgDBImage01OnDblClick(sender)
      {
        UgFileUpload01.Execute;
      }
      
      //修改的同时也更改编号
      function lkcbInstNameOnChange(sender)
      {
        QryPaperInfo.FieldByName("InstNo").AsString = QryPaperInst.FieldByName("InstNo").AsString;
      }
      
      //上传后将图片加载至数据中
      function UgFileUpload01OnCompleted(sender,astream)
      {
        TBlobField(UgDBImage01.DataSource.DataSet.FieldByName(UgDBImage01.DataField)).LoadFromStream(astream);
      }
      
      //打印
      function btnPrintOnClick(sender)
      {
        UgHtmlReport01.Print;
      }
      
      //运行基本内容
      function UgWebRunFrameOnAfterRunScript(sender)
      {
        QryPaperInfo.Connection = GetRFWeb;
        QryPaperInfo.SQL.Text = "SELECT * FROM Pass_Paper_Info";
        QryPaperInfo.Open;
        
        QryPaperInst.Connection = GetRFWeb;
        QryPaperInst.SQL.Text = "SELECT * FROM Pass_Paper_Inst";
        QryPaperInst.Open;
      //进入浏览状态
        RefState(tyView);
      //翻译界面
        UGMM.LC(Self);
      //验证模块权限
        UGMM.VerifyRunFramePerm(Self);
      }
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      101
      102
      103
      104
      105
      106
      107
      108
      109
      110
      111
      112
      113
      114
      115
      116
      117
      118
      119
      120
      121
      122
      123
      124
      125
      126
      127
      128
      129
      130
      131
      132
      133
      134
      135
      136
      137
      138
      139
      140
      141
      142
      143
      144
      145
      146
      147
      148
      149
      150
      151
      152
      153
      154
      155
      156
      157
      158
      159
      160
      161
      162
      163
      164
      165
      166
      167
      168
      169
      170
      171
      172
      173
      174
      175
      176
      177
      178
      179
      180
      181
      182
      183
      184
      185
      186
      187
      188
      189
      190
      191
      192
      193
      194
      195
      196
      197
      198
      199
      200
      201
      202
      203
      204
      205
      206
      207
      208
      209
      210
      211
      212
      213
      214
      //PasScript
      Const
        //浏览状态
        tyView   = 0;
        //编辑状态【添加、编辑、涂改】
        tyEditor = 1;
        
      //刷新状态
      Procedure RefState(Const AValue:Integer);
      Begin
        //查找
        btnQuery.Enabled := AValue = tyView;
        //游标状态
        btnFirst.Enabled := AValue = tyView;
        btnPrior.Enabled := AValue = tyView;
        btnNext.Enabled  := AValue = tyView;
        btnLast.Enabled  := AValue = tyView;
        //编辑功能
        btnAppend.Enabled     := AValue = tyView;
        btnDelete.Enabled     := (AValue = tyView)and(Not QryPaperInfo.IsEmpty);
        btnEditor.Enabled     := (AValue = tyView)and(Not QryPaperInfo.IsEmpty);
        //保存功能
        btnSave.Enabled       := AValue = tyEditor;
        btnCancel.Enabled     := AValue = tyEditor;
        cbPaperType.Enabled   := AValue = tyEditor;
        cbPaperState.Enabled  := AValue = tyEditor;
        lkcbInstNo.Enabled    := AValue = tyEditor;
        lkcbInstName.Enabled  := AValue = tyEditor;
        UgDBImage01.Enabled   := AValue = tyEditor;
        //数据集
        dsPaperInfo.AutoEdit     := AValue = tyEditor;
        //勾选
        if AValue = tyEditor Then
        UgDBGrid01.Options := dgEditing + dgTitles + dgIndicator + dgColumnResize + dgColLines + dgRowLines + dgConfirmDelete + dgAutoRefreshRow
        Else
        UgDBGrid01.Options := dgTitles + dgIndicator + dgColumnResize + dgColLines + dgRowLines + dgConfirmDelete + dgAutoRefreshRow;
        //编辑状态
        Self.IsEditor        := AValue = tyEditor;
      end;
      
      //查询
      procedure btnQueryOnClick(sender: tobject);
      begin
        if edQuery.Text = '' Then
        Begin
          QryPaperInfo.Filtered := False;
          UgDBGrid01.Refresh;
          Exit;
        End;
        QryPaperInfo.Filtered := False;
        QryPaperInfo.Filter := 'OwnerNo = ''' + edQuery.Text + '''';
        QryPaperInfo.Filtered := True;
      end;
      
      //首项
      procedure btnFirstOnClick(sender: tobject);
      begin
        if QryPaperInfo.IsEmpty Then
          Exit;
        QryPaperInfo.First;
      end;
      
      //前项
      procedure btnPriorOnClick(sender: tobject);
      begin
        if QryPaperInfo.IsEmpty Then
          Exit;
        QryPaperInfo.Prior;
      end;
      
      //后项
      procedure btnNextOnClick(sender: tobject);
      begin
        if QryPaperInfo.IsEmpty Then
          Exit;
        QryPaperInfo.Next;
      end;
      
      //尾项
      procedure btnLastOnClick(sender: tobject);
      begin
        if QryPaperInfo.IsEmpty  Then
          Exit;
        QryPaperInfo.Last;
      end;
      
      //添加
      procedure btnAppendOnClick(sender: tobject);
      begin
        QryPaperInfo.Insert;
        QryPaperInfo.FieldByName('ID').AsString := UGMM.CreateGuid;
        RefState(tyEditor);
      end;
      
      //删除
      procedure btnDeleteOnClick(sender: tobject);
      begin
        if MessageDlg(UGMM.LT('注意:是否删除该信息?'),mtWarning,mbYes + mbNo) = mrYes then
        Begin
          QryPaperInfo.Delete;
          QryPaperInfo.Post;
          QryPaperInfo.ApplyUpdates(-1);
          ShowMessage(UGMM.LT('删除成功'));
          RefState(tyView);
        End;
      end;
      
      //修改
      procedure btnEditorOnClick(sender: tobject);
      begin
        QryPaperInfo.Edit;
        RefState(tyEditor);  
      end;
      
      //保存
      procedure btnSaveOnClick(sender: tobject);
      begin
        if Trim(QryPaperInfo.FieldByName('OwnerNo').AsString) = '' then
        RaiseException(UGMM.LT('员工编号不能为空'));
        
        if Trim(QryPaperInfo.FieldByName('OwnerName').AsString) = '' then
        RaiseException(UGMM.LT('员工名称不能为空'));
        
        if Trim(QryPaperInfo.FieldByName('PaperNo').AsString) = '' then
        RaiseException(UGMM.LT('护照编号不能为空'));  
      
        if Trim(QryPaperInfo.FieldByName('PaperType').AsString) = '' then
        RaiseException(UGMM.LT('护照类型不能为空'));
        
        if Trim(QryPaperInfo.FieldByName('PaperDate').AsString) = '' then
        RaiseException(UGMM.LT('入库日期不能为空'));
      
        if Trim(QryPaperInfo.FieldByName('PaperExpire').AsString) = '' then
        RaiseException(UGMM.LT('有效日期不能为空'));
        
        if Trim(QryPaperInfo.FieldByName('PaperState').AsString) = '' then
        RaiseException(UGMM.LT('护照状态不能为空'));
        
        if Trim(QryPaperInfo.FieldByName('InstNo').AsString) = '' then
        RaiseException(UGMM.LT('机构编号不能为空'));
        
        if Trim(QryPaperInfo.FieldByName('InstName').AsString) = '' then
        RaiseException(UGMM.LT('机构名称不能为空'));
        
        QryPaperInfo.Post;
        QryPaperInfo.ApplyUpdates(-1);
        ShowMessage(UGMM.LT('保存成功'));
        RefState(tyView);
      end;
      
      //取消
      procedure btnCancelOnClick(sender: tobject);
      begin
        if MessageDlg(UGMM.LT('注意:是否放弃保存?'),mtWarning,mbYes + mbNo) = mrYes then
        Begin
          QryPaperInfo.Cancel;
          RefState(tyView);
        end;  
      end;
      
      //刷新
      procedure btnRefreshOnClick(sender: tobject);
      begin
        UgDBGrid01.Refresh; 
      end;
      
      //修改的同时也更改名称
      procedure lkcbInstNoOnChange(sender: tobject);
      begin
        QryPaperInfo.FieldByName('InstName').AsString := QryPaperInst.FieldByName('InstName').AsString;
      end;
      
      //双击以打开图片上传对话框
      procedure UgDBImage01OnDblClick(sender: tobject);
      begin
        UgFileUpload01.Execute;
      end;
      
      //修改的同时也更改编号
      procedure lkcbInstNameOnChange(sender: tobject);
      begin
        QryPaperInfo.FieldByName('InstNo').AsString := QryPaperInst.FieldByName('InstNo').AsString;
      end;
      
      //上传后将图片加载至数据中
      procedure UgFileUpload01OnCompleted(sender: tobject;astream: tfilestream);
      begin
        TBlobField(UgDBImage01.DataSource.DataSet.FieldByName(UgDBImage01.DataField)).LoadFromStream(astream);
      end;
      
      //打印
      procedure btnPrintOnClick(sender: tobject);
      begin
        UgHtmlReport01.Print;
      end;
      
      //运行基本内容
      procedure UgWebRunFrameOnAfterRunScript(const sender: tobject);
      begin
        QryPaperInfo.Connection := GetRFWeb;
        QryPaperInfo.SQL.Text := 'SELECT * FROM Pass_Paper_Info';
        QryPaperInfo.Open;
        
        QryPaperInst.Connection := GetRFWeb;
        QryPaperInst.SQL.Text := 'SELECT * FROM Pass_Paper_Inst';
        QryPaperInst.Open;
      //进入浏览状态
        RefState(tyView);
      //翻译界面
        UGMM.LC(Self);
      //验证模块权限
        UGMM.VerifyRunFramePerm(Self);
      end;
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      101
      102
      103
      104
      105
      106
      107
      108
      109
      110
      111
      112
      113
      114
      115
      116
      117
      118
      119
      120
      121
      122
      123
      124
      125
      126
      127
      128
      129
      130
      131
      132
      133
      134
      135
      136
      137
      138
      139
      140
      141
      142
      143
      144
      145
      146
      147
      148
      149
      150
      151
      152
      153
      154
      155
      156
      157
      158
      159
      160
      161
      162
      163
      164
      165
      166
      167
      168
      169
      170
      171
      172
      173
      174
      175
      176
      177
      178
      179
      180
      181
      182
      183
      184
      185
      186
      187
      188
      189
      190
      191
      192
      193
      194
      195
      196
      197
      198
      199
      200
      201
      202
      203
      204
      205
      206
      207
      208
      209
      210
      211
      212
      213
      // Make sure to add code blocks to your code group
      • 保存运行

        点击设计区界面左上角的保存按钮进行保存,然后点击运行按钮,进行调试运行。

      # 4. 菜单配置

        点击左侧菜单栏中的[系统工具]-[菜单列表(WEB)],进入到菜单列表界面,在该界面下,新增两个菜单列,分别对应为机构管理和护照管理,配置如图所示。填写完成后点击[保存]。

      # 5. 权限设置

        在此处我们设置两种权限,一种权限是仅浏览,即不能对数据进行更改新增删除的操作;另外一种权限是可以进行数据的新增更改删除查找。

        在机构管理的程序代码编辑界面,切换右侧选项卡至权限选项,点击[添加]按钮,新增以下两项平行的权限选项。权限选项中的配置内容如图所示。

        在护照管理的程序代码编辑界面,切换右侧选项卡至权限选项,点击[添加]按钮,新增权限选项。权限选项卡中的配置内容如图所示。

        设置完毕,点击左侧菜单栏[系统管理]-[角色],点击[新增]新建一个角色帐套用户,将其权限列表中机构管理与护照管理的浏览进行勾选。点击[保存]按钮。

        点击[查询]按钮选择角色,双击将角色切换至系统管理员,将其权限列表中的机构管理与护照管理下的权限项目全部勾选,点击[保存]按钮。

        点击左侧菜单栏中的[系统管理]-[用户],点击[新增]新建一个用户user,根据下图内容进行设置。设置完成点击[保存]按钮。

        点击[查询]按钮,选择管理员,双击以切换用户至管理员,检查其角色是否勾选系统管理员,检查完成点击[保存]按钮。

        至此权限设置完毕。

      # 6. 检查

        刷新浏览器,在系统用户模式下http://localhost:8888 (opens new window)分别用admin与user用户登陆FastWeb,查看两者的差异。

        至此护照管理系统的开发案例已全部完成。

      图灵数据分析
      纺织印染业ERP设计实务

      ← 图灵数据分析 纺织印染业ERP设计实务→

      Copyright © 2021-2025 爱招飞IsoFace | ALL Rights Reserved
      • 跟随系统
      • 浅色模式
      • 深色模式
      • 阅读模式