Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ventana de password (https://www.clubdelphi.com/foros/showthread.php?t=39205)

truequeman 13-01-2007 00:19:45

ventana de password
 
(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?)
.....................

Código Delphi [-]
 
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:

Código Delphi [-]
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:

Código Delphi [-]
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/show...ssword+ventana
http://www.clubdelphi.com/foros/show...ssword+ventana


La franja horaria es GMT +2. Ahora son las 03:17:52.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi