权限管理Delphi二维数组方案
权限管理Delphi实现算法
在运用DELPHI编制一些应用系统时,有很多时候都需要给不同的用户赋予不同的权限,
而不同的系统又有不同的权限分配方式,
如果在程序中去为每一位用户分配权限的话,不仅使得程序的编制十分麻烦,而且也不利于管理!
笔者近日想得一自认为比较好的方法,愿与大家共享,并望各位多指教!
在很多的系统中,权限通常是被分成几级的。
每一级的用户所能实现的操作是不同的,而实现这一功能的方法一般都是让不同权限的用户见到不同的菜单。
简单的说就是对不具有某一权限的用户这一菜单就是不可见的!
为了实现这一控制,程序员们往往得花费很多的时间去做这一模块,浪费了很多宝贵的时间!
想法是:如果设一个二维数组,第一维代表第一级菜单,第二维代表子菜单,
每一个数组元素只存储0或1这两个数,某一权限的用户对应着一个二维数组,而这个数组又代表了相应的菜单。
给某一级别的用户分配权限后,他便拥有了一个相应的数组。
登录时,从数组中取出各个元素的值,如果为1则相应的菜单出现,为0则不出现菜单。
用这种方式不但可以分级,还能实现在不同的用户间实现权限细分,只要你修改相应的数值为0或1即可!
上面是一个简单例子的运行结果。
下面是部分源程序(这仅是一个解释性的例子程序),为了简便,程序中只有一个窗体和一个主菜单。
在创建窗体时初始化数组M,显示时读出数组值并通过设置菜单的Enabled属性或者Visible属性的True或False来控制显示!!
var
Form1: TForm1;
m:array[0..1,0..4] of integer;//定义存储的数组
i,j:integer;//定义循环的变量
implementation
{$R *.dfm}
//权限数组直接设置或者从数据库表中加载
procedure TForm1.FormCreate(Sender: TObject);
begin
k:=0;
for i:=Low(m) to High(m) do
for j:=Low(m[i]) to High(m[i])
do
if (j mod 2)=0 then
m[i][j]:=1
else
m[i][j]:=0;
end;
//读出数组控制菜单的显示
procedure TForm1.FormShow(Sender: TObject);
begin
for i:=Low(m) to High(m) do
for j:=Low(m[i])
相关文档:
作为delphi的铁杆,在正式Delphi2010推出后,我当然也要尝尝新鲜,用电驴下来以后安装。呵呵二十多分钟就搞定了,启动也特快,简单使用一下,棒棒!!看来Delphi(太阳神)又回来了,如是我决定抛弃delphi2007,用这个新家伙。我所用的第三方组件主要是RemObjects和reportbuilder,reportbuilder还没有找到安装forD2009 Ful ......
名称 类型 说明
abort 函数 引起放弃的意外处理
abs 函数 绝对值函数
addexitproc 函数 将一过程添加到运行时库的结束过程表中
addr 函数 返回指定对象的地址
adjustlinebreaks 函数 将给定字符串的行分隔符调整为cr/lf序列
align 属 ......
服务端:添加ADOConnection,ADOQuery1,ADOQuery2。设置ADOQuery1为主表,ADOQuery2为从表。(通过 ADOQuery2.SQL.Text:= 'select * from 从表 where FKID=:主表PKID'设置)。添加DataSetProvider1和DataSetProvider2分别连接到ADOQuery1和ADOQuery2。
客户端:添加ClientDataSet1,ClientDataSet2。ClientDataS ......
Delphi 与 C/C++ 数据类型对照表
Delphi数据类型C/C++
ShorInt
8位有符号整数
char
Byte
8位无符号整数
BYTE,unsigned short
SmallInt
16位有符号整数
short
Word
16位无符号整数
unsigned short
Integer,LongInt
32位有符号整数
int,long
Cardinal,LongWord/DWORD
32位无符号整数
unsigned long
Int6 ......
制作圆角矩形的窗体:
01.procedure TPortForm.FormCreate(Sender: Tobject);
02.var hr :thandle;
03.begin
04.hr:=createroundrectrgn(0,0,width,height,20,20);
05.setwindowrgn(handle,hr,true);
06.end;
如果不要窗体外框,则使用:
01.procedure TPortForm.FormCreate(Sender: Tobject);
02.var hr :thandl ......