📄 global.pas
字号:
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
// ┃ Copyright(c) 2001, Narada I.E., nCRM ┃
// ┃ 文件名 :Global.pas ┃
// ┃ 版本 :1.0, 2.0 ┃
// ┃ 创建日期 :2000.09.28 ┃
// ┃ 作者 :朱怀阳 ┃
// ┃ 说明 :公用文件。包括公用常量、变量、函数、对象。 ┃
// ┃ 修改历史 :2001.11.18 去除TUIControl和TUINavigator对象。(朱怀阳) ┃
// ┃ 2001.11.18 去除一些无用的函数。 (朱怀阳) ┃
// ┃ 2004.05.10 权限表及权限判断方法的改变。 (朱怀阳) ┃
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
unit Global;
interface
uses Classes, Sysutils, controls, stdctrls, Dialogs, extctrls, Forms, Graphics,
DB, ADOdb, Windows, Menus, ShellAPI, comctrls, Messages;
const
// UDL文件名
UDL_PATH = 'DataLinks\';
UDL_FILENAME = 'DataLinks.ini';
// 翻译属性词汇表文件名
TRANSLATE_FILENAME = 'NxInspectors.INI';
// The resource file which save ImageList
RS_MAIN = 'ILMain.res';
RS_APP = 'ILApp.res';
RS_CPL = 'ILCPL.res';
// Pub_ObjectType 中 ObjectTypeDataType
otdTable = 0;
otdSQL = 1;
otdNone = 2;
// 业务模块类型 Pub_UI.UIType
nx_mkUser = 0; // 用户自定义界面
nx_mkDLL = 1; // 外挂业务模块
nx_mkCust = 2; // 系统自动配置的功能模块
nx_mkURL = 3; // Internet/Intranet功能模块
// 界面显示方式
nx_utInplace = 0; // Inplace
nx_utShow = 1; // 非模式化弹出窗口
nx_utShowModal = 2; // 模式化弹出窗口
// 权限对象类型 Sys_Permission.PermissionBusiType字段定义
nx_pbtBusiObject = 0; // 业务对象
nx_pbtFunction = 1; // 特定功能
nx_pbtUI = 3; // 界面/模块
// 访问权限 Sys_Permission
nx_opDeny = 0; // 无权
nx_opAllow = 1; // 允许
nx_opOnlySelf = 2; // 只允许对自己建立的数据进行操作
// 访问类型
nx_acBrow = 'PermissionAllowBrow';
nx_acInst = 'PermissionAllowInst';
nx_acDele = 'PermissionAllowDele';
nx_acUpdt = 'PermissionAllowUpdt';
nx_acPrnt = 'PermissionAllowPrnt';
// Pub_Components中ComponentBuisType - 业务数据类型
nx_cbtData = 0; // 数据集
nx_cbtFunc = 1; // 功能调用
nx_cbtUI = 2; // 界面
nx_cbtSys = 3; // 系统调用
nx_cbtHL = 4; // 超级链接
nx_cbtObj = 5; // 业务对象
NX_CBTS: array[0..5] of Integer = (nx_cbtData, nx_cbtFunc, nx_cbtUI,
nx_cbtSys, nx_cbtHL, nx_cbtObj);
// 数字链接
DataHypers: array[1..7] of String =
('http:', 'data:', 'ui:', 'sql:', 'keyword:', 'function:', 'search:');
dh_APL = 0; //
dh_HTTP = 1;
dh_DATA = 2;
dh_UI = 3;
dh_SQL = 4;
dh_KEYW = 5;
dh_FUNC = 6;
dh_SEARCH = 7;
// 系统参数
isp_ReportDir = 1; // 汇总目录下内容
isp_DisplayTab = 3; // 显示方式:紧凑方式
isp_DisplayWin = 4; // 显示方式:窗口方式
// IPensee消息处理名
WM_IPENSEE = WM_USER + 8182;
type
// 回调函数:聚焦数据
// 参数说明:ObjectID: 数据索引号;InPlace: 是否在系统界面中显示(如果为 False,
// 则弹出单独的信息窗口显示);ShowModal: 是否Modal显示。
// 参考:DoCompAct.pas 中 DoFocusObject 函数。
// 2004.3.9 作废!用TDoActionHyper代替
//TnxFocusObject = procedure (ObjectID: Integer; InPlace, ShowModal: Boolean); stdcall;
TDoActionHyper = procedure (ADataHyper: PChar); stdcall;
// TEnv是保存并处理系统环境的类。
// 注意:如果对TEnv的结构有所改动,所有引用它的动态连接库都必须重新编译!
TEnv = class(TObject)
private
FOperatorID: Integer;
FOperatorName: String;
FSysName: String;
FLoginName: String;
FUIID: Integer;
FIsAdmin: Boolean;
FEnterAsAdmin: Boolean;
FTodayPrompt: Boolean;
FADOConnection: TADOConnection;
FEnterDate: TDateTime;
FEmplID: Integer;
FGroupID: Integer;
FParams: TStringList;
ADOQueryPerm: TADOQuery; // 权限表
protected
procedure SetOperatorID(Value: Integer);
function GetComputerName: String;
public
// 数据库(ADO)配置文件(UDL)
UDLConfFile: String;
constructor Create; //override;
destructor Destroy; override;
//属性:
// 作为系统管理员进入系统
property EnterAsAdmin: Boolean read FEnterAsAdmin write FEnterAsAdmin;
// 数据库ADO连接
property ADOConnection: TADOConnection read FADOConnection write FADOConnection;
// 进入系统的操作员ID。来源于表Sys_Operators.OptID
property OperatorID: Integer read FOperatorID write SetOperatorID;
// 进入系统的操作员姓名。
property OperatorName: String read FOperatorName;
// 进入的系统名称。
property SysName: String read FSysName write FSysName;
// 该操作员进入系统的第一个界面ID
property UIID: Integer read FUIID default 0;
// 判断该操作员是否为管理员
property IsAdmin: Boolean read FIsAdmin default False;
// 判断该操作员是否显示任务提醒
property TodayPrompt: Boolean read FTodayPrompt default False;
// 该操作员登录进入系统的时间
property EnterDate: TDateTime read FEnterDate;
// 使用的计算机名
property ComputerName: String read GetComputerName;
// 使用的系统登录名
property LoginName: String read FLoginName;
// 该操作员的员工ID。来源于表Pub_Objects.ObjectID
property EmplID: Integer read FEmplID;
// 该操作员的部门ID。来源于表Pub_Objects.ObjectParentID
property GroupID: Integer read FGroupID;
// 该操作员的全局参数
property Params: TStringList read FParams write FParams;
//方法:
// 提示信息
function TodayPromptStr: String;
// 判断是否属于某一组 (目前已不用!)
function IsBelongGroup(GroupID: Integer): Boolean;
// 向某一操作员发送信息
function SendMsgTo(OptID: Integer): TModalResult;
// 异常处理
procedure RaiseExcept(ExceptMsg: String);
// 获得指定业务类型的SQL
function GetBusiSQL(ObjTypeID: Integer): String;
// 判断业务操作的权限
function HasPermission(AType, AID, DataOwnerID: Integer; Action: String): Boolean;
// 添加操作日志
procedure AddLogRecord(AObjectID: Integer; AOperation, ARemark: String);
end;
// CPL调用接口函数
TCPLFunction = procedure (AHandle: Integer; AEnv: TEnv; Params: PChar); stdcall;
type
TncDSList = class(TObject)
private
FADOConnection: TADOConnection;
FDSItems: TList;
FObjectTypeDS: TDataSet;
function GetItem(Index: Integer): TADOQuery;
function GetItemCount: Integer;
procedure SQLDataSetBeforePost(Sender: TDataSet);
protected
public
constructor Create(BusiClasses: array of Integer;
Connection: TADOConnection; ObjectDS: TDataSource);
destructor Destroy; override;
function FindItem(ObjectTypeID: Integer): TDataSet;
property ADOConnection: TADOConnection read FADOConnection write FADOConnection;
property Items[Index: Integer]: TADOQuery read GetItem;
property ItemCount: Integer read GetItemCount;
property ObjectTypeDS: TDataSet read FObjectTypeDS;
end;
type
// 系统参数,存在于表Sys_Parameters中
TisParameters = class(TObject)
private
FADOQuery: TADOQuery;
protected
public
constructor Create(AConnection: TADOConnection);
destructor Destroy; override;
function GetParamByName(AParam: String): Boolean;
function GetParamByIndex(AParamIndex: Integer): Boolean;
end;
type
// IPenseeObject
TIPenseeObject = class(TObject)
private
FQry: TADOQuery;
FObjectID: Integer;
FObjectTypeID: Integer;
FObjectParentID: Integer;
FObjectFID: Integer;
FObjectName: String;
FObjectShortName: String;
FObjectTypeName: String;
FObjectOwnerID: Integer;
protected
procedure SetObjectID(Value: Integer);
public
constructor Create(AConnection: TADOConnection);
destructor Destroy; override;
property ObjectID: Integer read FObjectID write SetObjectID;
property ObjectTypeID: Integer read FObjectTypeID;
property ObjectParentID: Integer read FObjectParentID;
property ObjectFID: Integer read FObjectFID;
property ObjectName: String read FObjectName;
property ObjectShortName: String read FObjectShortName;
property ObjectTypeName: String read FObjectTypeName;
property ObjectOwnerID: Integer read FObjectOwnerID;
end;
var
Env: TEnv;
isParameters: TisParameters;
procedure SendMsgToIPensee(AMsg: String);
implementation
{ TEnv }
constructor TEnv.Create;
begin
inherited;
FOperatorID := -1;
FADOConnection := nil;
FEnterAsAdmin := False;
FParams := TStringList.Create;
// 权限表 - 事先建立好,由于它被频繁调用,不建议采用用时建立方式
ADOQueryPerm := TADOQuery.Create(nil);
end;
destructor TEnv.Destroy;
begin
ADOQueryPerm.Free;
FParams.Free;
inherited;
end;
function TEnv.GetComputerName: String;
var
ACN: PAnsiChar;
ALen: Cardinal;
begin
ACN := StrAlloc(50);
ALen := 50;
Windows.GetComputerName(ACN, ALen);
Result := ACN;
StrDispose(ACN);
end;
function TEnv.IsBelongGroup(GroupID: Integer): Boolean;
begin
Result := False;
if (FADOConnection = nil) or (FOperatorID = -1) then
begin
MessageBox(Application.Handle,
'TEnv: 在执行此方法(IsAdmin)之前,请设置ADOConnection和OperatorID属性。',
'错误', MB_OK or MB_ICONERROR);
Exit;
end;
with TADOQuery.Create(FADOConnection) do
begin
Connection := FADOConnection;
SQL.Text := 'select Count(*) from Sys_OptrGroup ' +
' where (Sys_OptrGroup.OptID = ' + IntToStr(FOperatorID) + ') and' +
' (Sys_OptrGroup.GroupID = ' + IntToStr(GroupID) + ')';
ExecuteOptions := ExecuteOptions - [eoExecuteNoRecords];
try
Open;
Result := (Fields[0].AsInteger > 0);
finally
Close;
end;
Free;
end;
end;
function TEnv.GetBusiSQL(ObjTypeID: Integer): String;
var
TableName: String;
begin
with TADOQuery.Create(FADOConnection) do
begin
Connection := FADOConnection;
SQL.Text := 'select * from Pub_ObjectType where ObjectTypeID = ' +
IntToStr(ObjTypeID);
try
Open;
except
Free;
Exit;
end;
case FieldByName('ObjectTypeDataType').AsInteger of
0: // Table
begin
TableName := FindField('ObjectTypeData').AsString;
Result := 'select Pub_Objects.*, ' + TableName + '.* ' +
' from Pub_Objects left outer join ' + TableName +
' on Pub_Objects.ObjectFID = ' + TableName + '.' +
FindField('ObjectTypeKeyField').AsString +
' where Pub_Objects.ObjectTypeID = ' + IntToStr(ObjTypeID) +
' and IsNull(Pub_Objects.ObjectDeleteFlag, 0) = 0 ' +
#10#13#10#13'/*' +
#10#13'<<' + FindField('ObjectTypeKeyField').AsString +
#10#13#10#13'*/';
end;
{
1: // SQL
Result := FindField('ObjectTypeData').AsString;
}
else // None
Result := 'select * from Pub_Objects ' +
' where ObjectTypeID = ' + IntToStr(ObjTypeID);
end;
Free;
end;
end;
procedure TEnv.RaiseExcept(ExceptMsg: String);
// 处理异常事件
// 参数:ExceptMsg - 异常事件信息
begin
//MessageBox(Handle, PChar(ExceptMsg), '错误', MB_OK);
end;
function TEnv.SendMsgTo(OptID: Integer): TModalResult;
{
向OptID所对应的操作员发送信息,并返回结果。
}
begin
//
end;
procedure TEnv.SetOperatorID(Value: Integer);
begin
FOperatorID := Value;
FEnterDate := Now;
if (FADOConnection = nil) or (FOperatorID = -1) then Exit;
with TADOQuery.Create(FADOConnection) do
begin
Connection := FADOConnection;
SQL.Add('select Pub_Objects.*, Sys_Operators.* from Sys_Operators ' +
' left outer join Pub_Objects on Sys_Operators.OptEmplID = Pub_Objects.ObjectID ' +
' where Sys_Operators.OptID = ' + IntToStr(FOperatorID));
//ExecuteOptions := ExecuteOptions - [eoExecuteNoRecords];
try
Open;
if RecordCount > 0 then
begin
// 设置LoginName属性
FLoginName := FieldByName('OptLoginName').AsString;
// 设置OperatorName属性
if FieldByName('ObjectName').IsNull then
FOperatorName := '<未名>/' + FieldByName('OptLoginName').AsString
else
FOperatorName := FieldByName('ObjectName').AsString;
// 设置UIID属性
if FieldByName('OptUIID').IsNull then
FUIID := 0
else
FUIID := FieldByName('OptUIID').AsInteger;
// 设置IsAdmin属性
if FieldByName('OptIsAdmin').IsNull then
FIsAdmin := False
else
FIsAdmin := FieldByName('OptIsAdmin').AsBoolean;
// 设置TodayPrompt属性
if FieldByName('OptPrompt').IsNull then
FTodayPrompt := False
else
FTodayPrompt := FieldByName('OptPrompt').AsBoolean;
// 设置EmplID属性
if FieldByName('OptEmplID').IsNull then
FEmplID := -1
else
FEmplID := FieldByName('OptEmplID').AsInteger;
// 设置GroupID属性
if FieldByName('ObjectParentID').IsNull then
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -