Ir al contenido


Foto

Problema con función en una Clase


  • Por favor identifícate para responder
2 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 01 julio 2012 - 07:56

Holas a todos, como había comentado anteriormente, estoy empezando a programar con clases y he aquí mi primer problema, estoy creando una función simple de login del usuario, aquí el código:

La clase User:



delphi
  1. type
  2.   TUser = class
  3.     UserName: String[30];
  4.     Password: String[30];
  5.     NameOfUser: String[50];
  6.     UserGroup: Integer;
  7.     GroupName: String[30];
  8.     Permisos: Array of String;
  9.     PermisosCount: Integer;
  10.  
  11.     constructor Create;
  12.     function Login(User,Pass: String; DataBase: TIBDatabase): boolean;
  13.   End;
  14.  
  15. implementation
  16.  
  17. constructor TUser.Create;
  18. begin
  19.   UserName := '';
  20.   Password := '';
  21.   NameOfUser := '';
  22.   UserGroup := 0;
  23.   GroupName := '';
  24.   Permisos := nil;
  25.   PermisosCount := 0;
  26. end;
  27.  
  28. function TUser.Login(User: string; Pass: string; DataBase: TIBDatabase): boolean;
  29. var Query: TIBQuery;
  30. begin
  31.   Query := TIBQuery.Create(Application);
  32.   Query.Database := DataBase;
  33.   Query.Close;
  34.   Query.SQL.Text := 'SELECT * FROM USERS WHERE USUARIO = ' + User + ' AND CLAVE = ' + Pass;
  35.  
  36.   try
  37.     Query.Open;
  38.   except
  39.     raise Exception.Create('No se pudo conectar a la Base de datos ó abrir la tabla. ' + #13 + #13 + 'Consulte con el administrador del sistema.');
  40.   end;
  41.  
  42.   if Query.RecordCount > 0 then
  43.     result := True
  44.   else result := False;
  45.  
  46.   Query.Free;
  47. end;



Como verán la función Login sirve para loguearse, la uso de esta forma:



delphi
  1. procedure TFLogin.btnEntrarClick(Sender: TObject);
  2. begin
  3.   Usuario := TUser.Create;
  4.  
  5.   if not Usuario.Login(edUser.Text, edClave.Text, Datos.IBData) then begin
  6.     ShowMessage('Usuario no existe!.' + #13 + 'Por favor escriba correctamente e intente de nuevo.');
  7.     Abort;
  8.   end else begin
  9.     Close;
  10.   end;
  11. end;



Al ejecutar el procedimiento me muestra el siguiente error:



delphi
  1. ---------------------------
  2. Debugger Exception Notification
  3. ---------------------------
  4. Project ControlNotas.exe raised exception class $C0000005 with message 'access violation at 0x00596de2: read of address 0x00000060'.
  5. ---------------------------
  6. Break  Continue  Help 
  7. ---------------------------



Se coloca en la línea:



delphi
  1.   if not Usuario.Login(edUser.Text, edClave.Text, Datos.IBData) then begin



Pues aquí me he estancado. :(

Saludos.

  • 0

#2 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 01 julio 2012 - 08:34

¿Que es Datos.IBData? Comprueba que existe y esta creado.

Por cierto, eso de crear objetos y no usar un bloque Try finally para eliminarlos te puede dar problemas. Por ejemplo si durente el login no puedes conectar a la base de datos no liberaras el objeto "Query" y en ningún momento libera el objeto "Usuario". Recuerda que delphi no tiene un "garbage collector" y tienes que ser tu el encargado de gestionar la destrucción de todo.
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 01 julio 2012 - 09:18

Muchas gracias seoane por la aclaración, ya pude resolver el problema, era muy simple, lo que pasaba era que creaba el datamodule donde estaba la BD de último por eso no encontraba el parámetro DataBase de la función, también agregué la liberación de la clase luego de utilizada.

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.