開發案例
# 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,檢視兩者的差異。
至此護照管理系統的開發案例已全部完成。