一个新手编程时遇到的问题.(50分)

  • 主题发起人 Babyfloppy
  • 开始时间
B

Babyfloppy

Unregistered / Unconfirmed
GUEST, unregistred user!
一个程序,需要用户登录后才能正常执行,没有用户登录,则不能对该
程序执行操作.关于这个问题,我有两个想法,
1: 登录如果不通过,登录的Form就不消失(logonform.showmodal)
但有个问题是我可以屏蔽掉他的鼠标关闭方式,可是不能屏蔽掉快捷键,(alt+f4),那么是否要接管键盘的输入,然后再判断呢?
2: 登录时如果不通过,则程序的所有的菜单和按纽都是灰的,除了
菜单上的"用户登录",要是这样该如何做呢?如果用Actionlist,有个问题
是有一些东西是菜单上没有的,如: 单击一个label(button),等等..
分少,只因只能问,不能答.

 
如果登录不通过,你直接让登录form开着,
如要强行进入,关闭整个程序,不可以吗?
 
该程序一般情况下是不能被关闭的,因为他是一个类似实时管理的系统,必须要由
系统管理员来关闭
 
利用组件的Tag属性,将不能灰掉的菜单项(如“用户登录”)、按钮或其它控件的Tag
设为1,其余都为0,当登录没通过时,将Form上Tag不为1的控件Enabled全设为False,
登录通过时再全部变回来。
 
我同意churchill 的想法
 
->1.在Form1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if not CheckPass then CanClsoe:=False;
end;

其中CheckPass是你自己判登陆合法的一个条件或一个过程,
这样不管是鼠标或键盘都不能将该窗关闭。
 

Jetideas: thank you, 你的建议我已试过了,问题已解决我对delphi还有很多的东
西要学,onclosequery 这样的event都不会用.Anyway, thank you very much.


churchill: 能否再详细些?是这样, 我的程序里有很多的可点击的控件,如label,
button都是动态创建的,这样的话怎么让它不能响应事件呢?
 
1、Jetideas的方法好,我以前是将form.keypreview设置为ture,然后再keypress里判断的。
2、for i:=0 to form1.componentcount-1 do
with form1.components do
if name='login' then
enabled:=true
else
enbaled:=false;

login是你的login菜单(或者button)的变量名,也就是在inspect里的那个name
 
关于登录的问题我想说一下,
这样的登录界面可能做得太过于复杂。
一般来说登录界面只是一个小口令窗口,在口令窗口没有通过之前程序主窗口不显示。
口令窗口上只有两个LABEL,两个按钮和两个EDIT。为了不使用用户关闭窗口可以象
Jetideas说的那样做,并且同时使此窗口的“放弃”按钮变灰或者直接不显示
它。至于“确定”按钮则是必须开的。LABEL无所谓变不变灰呀,因为它没有
什么实际功能,只是提供一个提示作用罢了。因此来说,也就无所谓您的第二
个问题了。这样说应该可以解决您的问题。
 
不能响应事件>> onXXXXX:=nil;
 
感谢各位帮助.
关于3h的问题,大概是我没有说清楚,
程序是在有主窗口的情况下出现login form的,因为不止是程序刚启动
要输入密码,其有些类似NT,就是说,一个用户logout之后,程序不关闭,而是
不能操作,其后台仍要从数据库里读出消息,只是不能由人来控制.
所以采用第一种方法,就要在用户logout 之后,弹出一个login form,
就象是NT那样,那样也可以,
关于第二种,令非登录用户不能操作的方法,我看了churchill的回贴后,仍然
想不出对策,用tag 处理,有个问题是我的主form上有很多是动态创建的控件,即使
我动态的为每个控件付一个tag值,可是对于后来的遍历所有的控件来使 Enable为
false又有困难,一是不知具体的控件数目,二是不知其类型.

问题到这,我只是想确定一下这类问题的解法,希望大家再仔细想一想.
 
如果你的login form是showmoudal的, 那么不通过登陆是无法操作后面
的主窗口的呀! 你考虑那么多干什么??????
 
为了使所有控仅无效,最简单的方法是使其父窗口无效,如果,你需要在使所有
控件无效的同时,其父窗口继续有效,可以采用在中间插入一层窗口的方法,比如
在窗口中先放入一个Panel,以后添加的控件都作为Panel的子窗口,使用时只要
将Panel禁止就可以了。用同样原理可以使用多个Panel对子窗口分类,实现对
每一类控件分别禁止和使能。

另一种禁止用户关闭对话框的方法是去掉其系统菜单中的关闭选项。
通过
hMenu:=GetSystemMenu(handle of window,0);
count:=GetMenuItemCount(hMenu);
DeleteMenu(hMenu,count-1,MF_BYPOSITION);
这时,要关闭窗口,必须调用DestroyWindow.
 
多人接受答案了。
 
顶部