PDA

Ver la Versión Completa : ventana de password


truequeman
13-01-2007, 00:19:45
(Antes que nada.. busque hilos sobre este tema antes de postear este y no encontre parecidos por eso publico este)

Hola.. tengo un proyecto en el cual sale una ventana de passwords (que verifica una base de datos y le asigna los permisos correspondientes a cada usuario) y de ahi se enlaza al programa principal...

el problema es que si se le da alt+f4 se brinca esa pantalla y entra a la principal con todos los permisos (abir, consultas, reportes etc..)..

hice un usuario 0 con contraseña 0. en el cual si se le ponia alt + f4 (configurando el usuario sin ningun acceso ) entra sin problemas pero no me sale nada.. ni siquiera el menu salir.

le puse un canclose = false... y a la hora de poner el usuario con la contraseña correcta no me manda a la ventana principal.. se queda la misma ventana sin salirse (y no se puede cerrar ni con alt+f4).

el codigo es este (un poco resumido) (para no hacerlo largo con eso de los permisos x usuario)

...................

(en que estoy mal?)
.....................


unit VentanaDePasswords;
interface
uses Windows, SysUtils, Dialogs, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons, Db, DBTables, jpeg, ExtCtrls;
type
TPasswordDlg = class(TForm)
Password: TEdit;
Usuario: TEdit;
Image1: TImage;
OKBtn: TBitBtn;
CancelBtn: TBitBtn;
Panel1: TPanel;
Label1: TLabel;
Label2: TLabel;
Image2: TImage;
procedure CancelBtnClick(Sender: TObject);
procedure OKBtnClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;
var
PasswordDlg: TPasswordDlg;
implementation
uses Principal, ModulodeDatos;
{$R *.DFM}
procedure TPasswordDlg.CancelBtnClick(Sender: TObject);
begin
Application.Terminate
end;
procedure TPasswordDlg.OKBtnClick(Sender: TObject);
Var
Existe : Boolean;
begin
ModuloDatos.Usuarios.Open;
Existe := False;
ModuloDatos.Usuarios.First;
repeat
If ModuloDatos.UsuariosNick.Value = Usuario.Text then
if ModuloDatos.UsuariosPassword.Value = PAssword.Text then
Existe := True;
ModuloDatos.Usuarios.MoveBy(1);
until ModuloDatos.Usuarios.Eof;
if Existe = True then
begin
ModuloDatos.RestricionUsuarios.Open;
Password.Clear;
ModuloDatos.RestricionUsuarios.Edit;
ModuloDatos.RestricionUsuarios.setkey;
ModuloDatos.RestricionUsuarios.fieldByName('Nick').AsString:=trim(Usuario.Text);
if ModuloDatos.RestricionUsuarios.gotoKey then
begin
if ModuloDatos.RestricionUsuariosMenArchivo.Value = 1 then
begin
Inicio.Archivo.Visible := True;
Inicio.Archivo.Enabled := True;
end
else
begin
Inicio.Archivo.Visible := False;
Inicio.Archivo.Enabled := False;
end;
if ModuloDatos.RestricionUsuariosCambiarUsuario.Value = 1 then
begin
Inicio.CambiardeUsuario1.Visible := True;
Inicio.CambiardeUsuario1.Enabled := True;
end
else
begin
Inicio.CambiardeUsuario1.Visible := False;
Inicio.CambiardeUsuario1.Enabled := False;
end;

((( y asi sucesivamente con todos los permisos .. continua codigo aqui:)))

end;
ModuloDatos.RestricionUsuarios.Close;
ModuloDatos.Usuarios.Close;
Close;
end
else
begin
MessageDlg('Nombre de Usuario o Password Erroneo, Intentelo de nuevo por favor', mtWarning,
[mbOk], 0);
OkBtn.SetFocus;
Usuario.SetFocus;
ModuloDatos.Usuarios.Close;
end;
end;
procedure TPasswordDlg.FormActivate(Sender: TObject);
begin
Usuario.SetFocus;
end;
procedure TPasswordDlg.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
CanClose:=True;
end;
end.


y si pongo canclose = False no se cierra..
gracias.

roman
13-01-2007, 00:51:25
1. Al botón OK ponle su propiedad ModalResult igual a mrOK
2. Traslada el código que tienes en el OnClick del botón al evento OnCloseQuery.
3. En ese evento checas la propiedad ModalResult del formulario para saber si se dió clic en OK:


if ModalResult = mrOk then
begin
{
Aquí el código que verifica si los datos son correctos. Si no lo son, pones
CanClose := false
}
end;


De esta manera, el formulario se cerrará si se oprime el botón Cancel o el botón X en la barra de título o con Alt+F4. Ahora bien, ShowModal (con lo que abres el formulario) es una función que regresa el valor de ModalResult. Entonces, desde donde abres la ventana checas ese valor y procedes a asignar derechos sólo en caso de que ese valor sea mrOK:


if PasswordDlg.ShowModal = mrOk then
begin
{
Asignas derechos
}
end
else
begin
{
Terminas
}
end;


La única otra forma de cerrar la ventana de password es oprimiendo el botón OK, y eso sólo si los datos fueron correctos.

En otras palabras, te propongo un enfoque distinto:

Deja que el cuadro de diálogo del password haga exclusivamente lo que tiene que hacer:

Verificar si los datos son o no correctos

Y pasa la parte de asignación de derechos al c'odigo que abre ese formulario.

// Saludos

vtdeleon
13-01-2007, 00:52:39
Chequea estos hilos:
http://www.clubdelphi.com/foros/showthread.php?t=24987&highlight=password+ventana
http://www.clubdelphi.com/foros/showthread.php?t=21935&highlight=password+ventana