一个“口令”与“权限”的问题(100分)

  • 主题发起人 主题发起人 lllin
  • 开始时间 开始时间
L

lllin

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个主窗体和一个用于验证用户身份的口令子窗体,在使用主窗体之前,先得验证用户的身份,然后根据用户的身份来控制主窗体上相应菜单的Enabled。
请大虾们指点。
 
在主窗体的create事件中创建口令子窗体。由子窗体返回值。
根据该值来控制主窗体。
procedure TForm1.OnCreate(sender : TObject);
begin
Form2 := TForm.create(self);
Form2.ShowModal;
{利用Form2中的Public变量返回值}
Form1.button1.enabled := Form2.button1enabled;
.....
Form2.Free;
Form2 := Nil;
end;
 
子窗体在主窗体中创建,而且子窗体以有模式显示,通过子窗体的返回值来决定主窗体的样式
 
to tanglu:
有“cannot create form,no MDI forms are currently active”的错误。
 
你的Form2设的FormStyle是fsMDIChild吧?
那必须要先有fsMDIForm后才能创建MDI子窗口啊。
但是你询问密码的窗口没有必要建成MDI子窗口啊。
改成fsNormal就可以了。
 
我的苯办法:
在口令窗体程序中写入一个临时文件
在主窗体的构造函数中打开并读取之,然后删除.

口令窗体在WinMain函数中先于主窗体创建,可以动态创建
BCB程序
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
TFormLogIn *FormLogIn; //登录窗口
FormLogIn = new TFormLogIn(Application);
FormLogIn->ShowModal()
if (FormLogIn->ModalResult==mrOk) //如果成功登录,设置窗体的返回属性ModalResult=mrOk,权限级别并写入临时文件.
{
delete FormLogIn;
}
else { //登录失败或退出登录
Application->MessageBox("登录不成功,你是无权用户!/n退出系统!","登录失败!",MB_OK+MB_ICONEXCLAMATION);
delete FormLogIn;
return(1);
}
Application->Initialize();
Application->CreateForm(__classid(TFormMain), &FormMain);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
 
to skyrabbit:
我需要的正是你所说的这类函数,可是我不知道怎样使用,你能不能更详细一点?
 
在创建主窗体之前,用
Application.createform(Form2,TForm2)
创建登录窗体,然后就可以传递参数了。
 
要根据用户来分配权限,你最好建立两个表:
user: 用户信息,包括权限分配信息
menu:各菜单项
在口令子窗口中用户登录成功后再分析user表,确定相应菜单项是否可用。
 
To lllin:
不知道你的用户帐号、用户口令和权限级别的信息是存放在哪里的?
是用文件形式还是像Hjking一样采用数据库表形式?

我的办法是在用户登陆口令窗体的处理代码里把相应信息写入注册表中的临时键值中,
在主窗体的formcreate或onshow句柄处理代码中读取此临时键值,根据键值信息允许
或禁止菜单项,然后清空临时键值。创建窗体的工程文件代码已经贴过了,不过要转换成Delphi语句
#include <registry.hpp>
//这是在口令窗体中的代码,
//if 成功登录得到了用户名UserName,用户口令UserPassword和用户权限级别UserGrade
//then 执行一下代码写入注册表的临时键值

try
{
TRegistry *RegKey = new TRegistry; //创建注册表对象
RegKey->RootKey = HKEY_LOCAL_MACHINE; //所在注册表目录
RegKey->OpenKey("SOFTWARE//LLLIN//demo",true);//如果不存在,则创建之;否则打开
RegKey->WriteString("Nam", UserName);
RegKey->WriteString("Pwd", UserPassword);
RegKey->WriteString("Grd", UserGrade);
RegKey->CloseKey();
delete RegKey;
}
catch(...)
{
delete RegKey;
ShowMessage("登录发生错误!");
}

//-----------------------------------------------------------------//

void __fastcall TFormMain::FormCreate(TObject *Sender)
{
AnsiString UserNameA,UserGradeA,UserPasswordA;
TRegistry *RegKey = new TRegistry; //创建注册表对象
RegKey->RootKey = HKEY_LOCAL_MACHINE; //所在注册表目录
bool FormMainLogSuccess = RegKey->OpenKey("SOFTWARE//LLLIN//demo",false);//如果存在,打开
if (FormMainLogSuccess) //键值存在
{
UserNameA = RegKey->ReadString("Nam");
UserGradeA = RegKey->ReadString("Grd");
UserPasswordA = RegKey->ReadString("Pwd");
}
RegKey->CloseKey();
RegKey->DeleteKey("SOFTWARE//LLLIN//demo");//删除临时键值
delete RegKey;
if (UserGradeA == "1")
{
//根据权限级别允许指定的那些菜单项
}
else if (UserGradeA == "2")
{
//根据权限级别允许指定的那些菜单项
}
else if (UserGradeA == "3")
{
//根据权限级别允许指定的那些菜单项
}
else
{
//缺省设置
}
}
 
建立一菜单库,内容包括:
(菜单名)cdm,(权限)qx
菜单1 1
菜单1 2
菜单1 3
菜单2 1
菜单2 2
菜单3 1
菜单4 2
...
登录后根据数据库的设置把相应的菜单打开就行了,还可以做个系统维护模块,调整
不同用户可运行的模块!
祝好!

 
wind200的方法好象不行!
菜单的值传递上有问题,我想应该这样!
用户 菜单1 菜单2 菜单3 菜单4 菜单5 菜单6 ...
1 true false true true false true ...
2 false true false false true false ...
3 true true false true true true ...
.
.
.
然后根据用户的不同,相就原改变菜单的ENABLED属性!这样才可以吧!
 
多人接受答案了。
 
后退
顶部