Jump to content


Photo

Problema con función en una Clase


  • Please log in to reply
2 replies to this topic

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 01 July 2012 - 07:56 AM

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
  • 1259 posts
  • LocationEspaña

Posted 01 July 2012 - 08:34 AM

¿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
  • 7419 posts
  • LocationRepública Dominicana

Posted 01 July 2012 - 09:18 AM

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.