(1)公共常量、自定义类型和变量
在UnitPublic公用单元文件的interface和implementation关键字间定义系统中使用的全局自定义数据结构、常量和公共变量。
本系统需要的定义如下:
Const // 定义常量
Role_SystemAdmin = 'SystemAdmin'; // 系统管理角色名
SystemAdmin = 'Admin'; // 系统管理员ID
Role_Teacher = 'Teacher'; // 教师角色名
Role_Student = 'Student'; // 学生角色名
AchievementCount = 6; // 输入成绩时的项目个数
strEmptySelect = '请选择'; // 查询时使用
Type // 定义自定义类型
// 节点数据字段名,每行表示一个节点。第一列为ID,第二列为显示信息
TOper_FieldDem2 = array[1..2] of string;
TOper_Fields = array of TOper_FieldDem2;
TAchievementDem2 = array[0..AchievementCount-1] of TEdit; // 用于动态输入成绩
TEditAchievement = array of TAchievementDem2;
Var // 定义变量
UserID : String[58];
UserType : Byte{1:教师;2:学生};
IsAdministroy : Boolean;
strSQL : String; // 存放SQL语句
strTemp : String; // 临时使用
IniFile : TIniFile; // 存放系统参数的文件
TreeList: TStringList; // 节点的关联数据
Fields : TOper_Fields; // 节点字段名
SelectNode : TTreeNode; // 选中的节点
AchievementTypeID : String[10]; // 存放考试类别
EditAchievement : TEditAchievement; // 用于动态输入学生成绩
iCount : Integer; // 用于计数
Scope : Array [0..6] of SmallInt; // 用于成绩统计
NumCount : SmallInt; // 总人数
因在上述变量中定义了一个TIniFile类型用于读写.ini文件的变量,在其后的函数和过程定义中使用了其它数据类型,故需要在uses单元引用部分添加对IniFiles(TIniFile类型在该单元中定义)等单元的引用,如下所示:
uses
Controls, Menus, Variants, ExtCtrls, StdCtrls, ComCtrls, Forms, DB, Classes, Dialogs, IniFiles;
(2)公共函数与过程
在UnitPublic公用单元文件的implementation与End关键字间定义系统中使用的自定义公共函数与过程。
本系统需要使用公共函数与过程有5个,具体定义如下。
1) 自动添加角色权限(AddRoleRight)过程。该过程将系统中操作对象自动添加到角色权限表中,而不必由管理员一个个地人工添加,大大提高了权限的管理效率。
2) 设置登录用户的对象权限(SetObjRight)过程。在用户登录后根据系统管理员分配给其的权限动态设置。
3) 查询登录的用户是否具有系统管理员权限(IsAdmin)函数。系统管理员具有系统的所有权限。
// 检测登录用户是否拥有系统管理角色
Function IsAdmin(DataSet: TDataSet): Boolean;
begin
DataSet.First;
Result := False;
while not DataSet.Eof do begin // Role_SystemAdmin为系统管理角色
if DataSet.FieldValues['RoleID']=Role_SystemAdmin then begin
Result := True;
Break;
end;
DataSet.Next;
end;
end;
4) 创建通用树型结构的快速算法CreateTreeFast过程。在本系统中使用了大量的查询,为方便用户使用,大多采用了树型结构表示。
CreateTreeFast过程中,DataSet是创建的树型结构所用到的数据集; Fields为一个字段名数组,是一个二维数组,按行的规则存放了树型结构的每个关键字字段及其对应的显示名称字段;如:Fields[0][1] 中为第一个关键字字段,Fields[0][2] 则为第一个关键字所对应的名称字段;TreeView是需要创建的树型结构对象。
procedure CreateTreeFast(DataSet: TDataSet; Fields: TOper_Fields; TreeView: TTreeView);
var
// 存放树型结构节点数据的临时字符串列表
Tree_Items: TStringList;
// 节点关键字值
KeyFieldValue: Array of string;
i, j, Level: Smallint;
StrIndent: string; // 缩进字符串
Chk: Boolean;
begin
Level := High(Fields)+1; // 求有几个关键字,即几层 // 检查Fields数组中的字段名是否包含在数据集中
|