开发案例
# FastWeb开发案例
- 适用平台:WEB(桌面)
在本节中,我们将以一个护照管理系统为例,讲解在FastWeb中如何进行模块开发以及实现模块上线的功能。
# 1. 创建数据库
在本范例中,我们使用MSSQL作为演示用数据库。在FastWeb
数据库中,建立两个表Pass_Paper_Inst
与Pass_Paper_Info
。表的基本信息如下图所示,也可以直接执行下方的SQL进行表的创建。我们提供的示例中已经创建了这两个表,无需再进行创建。
---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]
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;
}
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.
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);
}
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;
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,查看两者的差异。


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