Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Login-Delphi (https://www.clubdelphi.com/foros/showthread.php?t=46990)

TKW04 15-08-2007 18:42:41

Login-Delphi
 
Buenas a todos se que pregunto mucho pero es que quiero aprender, estoy trabajando con un programita y se me ocurrio crear un login pero no se como hacer que el programa haga la relacion usuario, contraseña en la base de datos (uso Sql server 2000) y quiero dar prioridades a usarios por ejemplo si entra Usuario: Admin, Pass: bacalao se activen o desactiven algunas propiedades de los forms.

En si es como un control de usuario para dar restrinciones a ciertos usuarios. si alguien sabe como hacerlo que me esplique como o que me envie un pequeño ejemplo a mi correo thewolf04@gmail.com. Gracias por anticipado .....:):confused:

Caral 15-08-2007 19:23:33

Hola
Aqui hay un ejemplo sencillo:
http://www.clubdelphi.com/foros/showthread.php?t=44976
Saludos

TKW04 15-08-2007 19:30:28

Gracias
 
Lo voya chequear a ver si me sirve muchas gracias cualqueir cosa te escrivo ok??¿??:D

maeyanes 15-08-2007 19:47:21

Hola TKW04...

Agradeceríamos que cualquier otra duda que tengas sobre tu mismo problema la plasmes en este mismo hilo y no le mandes privados a Caral o cualquier otro que te conteste. Esto es por que lo que se te responda en este hilo le podría servir a alguien más para resolver un problema igual o similar...



Saludos...

TKW04 16-08-2007 00:04:40

No entiendo
 
Caral No he podido noner en marcha tu programa pero eh estdo viendo los forms y no ve ninguna que sea para login son todos de control de nomina.....:confused:

Caral 16-08-2007 00:08:39

Hola
Este?
http://www.clubdelphi.com/foros/showthread.php?t=46017
Saludos

TKW04 16-08-2007 00:20:19

perdon
 
Tengo que ser burro pero No entiendo en ese link que me diste es para la fabricacion de un sistema de facturacion... perdona per no tendras algo que simplemente me diga como hacer el login........por que es que realmente estoy desorientdo:confused:

Caral 16-08-2007 00:35:26

Hola
Este es un login:

Tabla, Usuarios.
Campos:
CodUsuario, texto(15)
Nombre, Texto(50)
Clave, Texto(50)

revisa el archivo zip.
Pero de todos modos lo voy a poner en ese link, ya que es una aplicacion completa.
Saludos

TKW04 16-08-2007 00:48:44

Gracias
 
Gracias..........disculpa tantas molestias....cualquier cosa que no entienda te puedo preguntar..__??:confused:

Chris 16-08-2007 00:49:04

Con respecto a lo de autenticar un usuario lo podes hacer con un código similar a este:
Código Delphi [-]
If miTabla_de_usuarios.FindKey([Nombre_de_Usuario.text]) Then
Begin
   if (miTabla_de_Usuarios.FieldByName('usuarioContrasena') = ContrasenaEdit.Text) Then
      {aquí puedes determinar accesos a los usuarios y mostrar tu ventana principal}
end;

con respecto a determinar los privilegios de los usuarios consulta este hilo escrito hace poco.
http://www.clubdelphi.com/foros/showthread.php?t=47004

ojala te sirva mi ayuda.

Caral 16-08-2007 00:50:24

Hola
No hay problema, por supuesto, con gusto.
Saludos

TKW04 16-08-2007 00:56:40

par aque se usa
 
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls;

Chris 16-08-2007 01:01:54

Cita:

Empezado por TKW04 (Mensaje 223426)
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls;

ubieras abierto otro hilo para preguntar eso. De todos modos voy aintentarte explicar.

cada nombre (separado por coma) se les llama unidades. Las unidades contienen codigo ya escrito por otras personas, código que te ayudará en mucho a crear tus programas y evitar que reinventes la rueda. Si hace click sobre el nombre de una unidad manteniendo la tecla CTRL presionada, delphi te abrirá esa unidad en una nueva pestaña, ahí podrás ver las miles de lineas que te nos han ahorrado la gente de borland.

TKW04 16-08-2007 01:14:52

ok
 
es como si fueran clases??:confused:

TKW04 16-08-2007 01:31:26

mmm D&W
 
Nome sale el .findkey

TKW04 16-08-2007 02:34:19

Adoquery
 
Ya lo tengo programado Nitido Gracias caral pero una cosa ahora me dice todo el tiempo que el usuario no existe, en el ejemplo que me posteaste ahi un parametro llamado nom, y en el sql tienes escrito Codigousario=nom........ cuando lo igualo de la misma forma me dice qeu la columna no existe.... por que??? que debo hacer para solucionar esto gracias......

Caral 17-08-2007 00:06:21

Hola
Este es el sql del adquery:
Código SQL [-]
SELECT CodUsuario, Nombre, Clave  FROM Usuarios WHERE
CodUsuario = nom
Y este es el que lee el parametro:
Código Delphi [-]
   ADLogin.Parameters.ParamByName('nom').Value:= EUsuario.Text;
   ADLogin.Active:= True;
   EUsuario.Text:= ADLogin.Fields[1].AsString;
No entiendo donde esta el problema, esto:
Cita:

Codigousario=nom.
No esta en ningun lado, revisalo.
Saludos

Chris 17-08-2007 00:19:34

¿No es?
CodigoUsuario=:Nom

TKW04 17-08-2007 01:32:18

Problema
 
SELECT CodUsuario, Nombre, Clave FROM Usuarios WHERE
CodUsuario = nom


que es el nom en esa sentencia por que cuando la pongo asi es decir claro la mia se ve asi

SELECT Codigo, Nombre, pass FROM USUARIOS WHERE
Codigo = nom

me dice invalid columm name 'nom'

Caral 17-08-2007 17:56:41

Hola
Código SQL [-]
SELECT Codigo, Nombre, Clave  FROM Usuarios WHERE
Codigo = nom
nom es un parametro y se busca asi:
Código Delphi [-]
   ADLogin.Parameters.ParamByName('nom').Value:= EUsuario.Text;
   ADLogin.Active:= True;
   EUsuario.Text:= ADLogin.Fields[1].AsString;
Aqui el parametro nom esta siendo analizado o comparado a EUsuario.Text
No le veo el problema.
Esto no lo entiendo:
Cita:

me dice invalid columm name 'nom'
Los parametros son nombres que se le dan a un campo determinado, igual lo puedes llamar Cod, o codigo o como sea, da igual, es un punto de comparacion, Campo-Componente u otro.
Saludos

TKW04 17-08-2007 20:12:57

dice
 
el adoquery si lo pongo active me dice eso
por eso es que no se que hacer...... te mando mi codigo para lo veas .... el el form....
:confused:

enecumene 20-08-2007 06:40:45

esta duda va para caral: hice este login para mi aplicacion de acuerdo a tus sugerencia y me ha quedado asi:

Código Delphi [-]
procedure TFLogin.BitBtn1Click(Sender: TObject);
begin
 LoginOK :=False;
   ADLogin.Active:= True;
   ADLogin.Parameters.ParamByName('cod').Value:= EUsuario.Text;
    If ADLogin.RecordCount < 1 then
    Begin
       Cuenta := Cuenta + 1;
       MessageDlg('Usuario no encontrado',mtError, [mbOK], 0);
       EUsuario.Text := '';
       EClave.Text := '';
       ADLogin.Active := False;
       If Cuenta = 3 then Close;
    end
   else
       If ADLoginpass.AsString = EClave.Text then
        Begin
           LoginOk := True;
           Usuario := ADLoginusername.AsString;
           Nombre := ADLoginnom_user.AsString;
           ADLogin.Active := False;
           Close;
        end
     else
         Begin
           Cuenta := Cuenta + 1;
           MessageDlg('Clave Inválida',mtError, [mbOK], 0);
           EClave.Text := '';
           ADLogin.Active := False;
           If Cuenta = 3 then Close;
         end;
end;

pero me sale el siguiente error al clickear el boton:

Cita:

---------------------------
Debugger Exception Notification
---------------------------
Project Sigesped.exe raised exception class EDatabaseError with message 'Missing Connection or ConnectionString'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
he tratado de dar con el problema y pues me ha roto la cabeza, existe la posibilidad de que el form principal sea MDI? trabajo con ado.

saludos...

Caral 20-08-2007 15:44:41

Hola
Si se llama al login desde el form principal, hay que ir a projects, option y pasar al form login a available forms.
Si es el primer form, hay que colocarlo en main form.
Con esto ya se elimina el problema.
Saludos

enecumene 20-08-2007 17:49:32

Caral, precisamente lo tengo asi, el login en forma alvailable y el main en auto-create form y el error persiste todavia :confused::confused::confused:

Caral 20-08-2007 17:53:59

Hola
Te as fijado que en uses del login este el datamodule?
No va a tener conexion si no lo incluye.
Revisalo, no se me ocurre nada.
Saludos

enecumene 20-08-2007 18:01:45

efectivamente esta incluido en el uses del form

Caral 20-08-2007 18:09:25

Hola
Este es el codigo del login:
Código Delphi [-]
unit UFLogin;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls;

type
  TFLogin = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    EUsuario: TEdit;
    EClave: TEdit;
    BtnOk: TButton;
    BtnCancel: TButton;
    ADLogin: TADOQuery;
    ADLoginCodUsuario: TWideStringField;
    ADLoginNombre: TWideStringField;
    ADLoginClave: TWideStringField;
    procedure FormCreate(Sender: TObject);
    procedure BtnOkClick(Sender: TObject);
    procedure BtnCancelClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FLogin: TFLogin;
  Cuenta : integer;
  Usuario, Nombre : String;
  LoginOK : boolean;
    
implementation

uses UFClientes; // este es el fom que se conecta, revisarlo.

{$R *.dfm}

procedure TFLogin.FormCreate(Sender: TObject);
begin
    Cuenta := 0;
   Usuario := '';
   Nombre := '';
end;

procedure TFLogin.BtnOkClick(Sender: TObject);
begin
   LoginOK := False;
   ADLogin.Parameters.ParamByName('nom').Value:= EUsuario.Text;
   ADLogin.Active:= True;
   EUsuario.Text:= ADLogin.Fields[1].AsString;
   If ADLogin.RecordCount < 1 then
    Begin
       Cuenta := Cuenta + 1;
       MessageDlg('Usuario no encontrado',mtError, [mbOK], 0);
       EUsuario.Text := '';
       EClave.Text := '';
       ADLogin.Active := False;
       If Cuenta = 3 then Close;
    end
   else
       If ADLoginClave.AsString = EClave.Text then
        Begin
           LoginOk := True;
           Nombre := ADLoginNombre.AsString;
           ADLogin.Active := False;
           FClientes:=TFClientes.Create(self);
           try
           FLogin.Visible:= False;
           FClientes.ShowModal;
           finally
           FClientes.Free;
           end;
           Close;
        end
     else
         Begin
           Cuenta := Cuenta + 1;
           MessageDlg('Clave Inválida',mtError, [mbOK], 0);
           EClave.Text := '';
           ADLogin.Active := False;
           If Cuenta = 3 then Close;
         end;

end;

procedure TFLogin.BtnCancelClick(Sender: TObject);
begin
  LoginOK :=False;
   Close;
end;

end.
En projets, el login esta en main form.
Me dejas mal parado, no entiendo el problema.
Saludos

cHackAll 20-08-2007 18:31:31

Cita:

Empezado por Caral
Código Delphi [-]
       If ADLoginClave.AsString = EClave.Text then

Como comentario para el hilo, la clave es algo "sagrado".
Alguien mal intencionado podría utilizar la API GetWindowText(Edit1.Handle, Buffer); para obtener la clave del TEdit, lo que significa que PasswordChar no oculta completamente la contraseña. Por lo que aconsejo utilizar un código parecido a éste:


Código Delphi [-]
var Clave: string;
 
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var Temp: string;
begin
 if Key = #8 then
  begin
   if Length(Clave) <> 0 then
    SetLength(Clave, Length(Clave) - 1);
  end
 else
  if Key in ['0'..'9', 'a'..'z', 'A'..'Z'{etc}] then
   begin
    Clave := Clave + Key;
    Key := Edit1.PasswordChar;
   end
  else
   Key := #0;  
end;

Lo que le da un nivel mayor a la seguridad de la aplicación.
Es muy importante tambien NO realizar comparaciones directas con la clave; alguien puede lograr abrir la BD y ver las contraseñas. Lo óptimo es siempre encriptarla o en su defecto se puede sacar la CRC o Hash de la contraseña y guardar ése valor en ves de la contraseña como tal.

Saludos.

enecumene 20-08-2007 18:41:24

caral, resolvi el problema del error en vez poner en connection en la propiedad del adoquery el form donde esta la base de datos que es un datamodule lo conecte directamente a la base de dato a traves del connectionstring, pero ahora sucede otro problema, al poner el user y el pass le doy click al boton y lo que hace es que me limpia los edits, al no poner una clave o una clave erronea la clave real me aparece en el edit de user... que puede estar pasando?:confused::confused::confused: y gracias po tu tiempo caral..

saludos..

Caral 20-08-2007 18:45:36

Hola
Que dificil, ni idea.
Coloca el codigo, a ver que esta pasando.
Saludos

enecumene 20-08-2007 18:50:40

Aqui esta el codigo Caral:

Código Delphi [-]
unit Login;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, DB, ADODB;

type
  TFLogin = class(TForm)
    Label1: TLabel;
    EUsuario: TEdit;
    Label2: TLabel;
    EClave: TEdit;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    ADLogin: TADOQuery;
    ADLoginusername: TWideStringField;
    ADLoginpass: TWideStringField;
    ADLoginnom_user: TWideStringField;
    procedure FormCreate(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FLogin: TFLogin;
  Cuenta : integer;
  Usuario, Nombre : String;
  LoginOK : boolean;

implementation

uses Datos, inicio;

{$R *.dfm}

procedure TFLogin.FormCreate(Sender: TObject);
begin
   Cuenta := 0;
   Usuario := '';
   Nombre := '';
end;

procedure TFLogin.BitBtn1Click(Sender: TObject);
begin
 LoginOK := False;
   ADLogin.Parameters.ParamByName('cod').Value:= EUsuario.Text;
   ADLogin.Active:= True;
   EUsuario.Text:= ADLogin.Fields[1].AsString;
   If ADLogin.RecordCount < 1 then
    Begin
       Cuenta := Cuenta + 1;
       MessageDlg('Usuario no encontrado',mtError, [mbOK], 0);
       EUsuario.Text := '';
       EClave.Text := '';
       ADLogin.Active := False;
       If Cuenta = 3 then Close;
    end
   else
       If ADLoginpass.AsString = EClave.Text then
        Begin
           LoginOk := True;
           Nombre := ADLoginnom_user.AsString;
           ADLogin.Active := False;
           incio:=Tincio.Create(self);
           try
           FLogin.Visible:= False;
           incio.ShowModal;
           finally
           incio.Free;
           end;
           Close;
        end
     else
         Begin
           Cuenta := Cuenta + 1;
           MessageDlg('Clave Inválida',mtError, [mbOK], 0);
           EClave.Text := '';
           ADLogin.Active := False;
           If Cuenta = 3 then Close;
         end;
end;

end.

Caral 20-08-2007 18:55:26

Hola
Cual es el codigo del sql strimgs del query?
Lo pone para verlo?
Lo que necesito es ver la relacion.
Saludos

enecumene 20-08-2007 18:59:59

aqui está:

Código SQL [-]
SELECT username, pass, nom_user FROM users WHERE username = cod

Caral 20-08-2007 23:39:23

Hola
Acabo de probar tu codigo tal cual lo pusiste y me funciona perfectamente.
hay que tener en cuenta que segun los parametros que pusiste va asi:
username = EUsuario.Text
pass = EClave.Text
Dale click a parameters del query en Value ponle 0
Dale doble click al query, raton derecho, add, y coloca todos los campos en la pantallita.
Tiene que funcionar, a mi me funciona.
Saludos

enecumene 20-08-2007 23:46:13

ok Caral ahora mismo ire a probar...luego te comento

enecumene 21-08-2007 00:12:27

Hola Caral, ya resolvi el problema!!!, gracias a ti por tu tiempo, tuve que hacer un pequeñito cambio, originalmente esta parte del codigo era asi:

Código Delphi [-]
If ADLoginpass.AsString = EClave.Text then
Begin
LoginOk := True;
Nombre := ADLoginnom_user.AsString;
ADLogin.Active := False;
incio:=Tincio.Create(self);
try
FLogin.Visible:= False;
incio.ShowModal;
finally
incio.Free;
end;
Close;
End


ahora lo puse asi:

Código Delphi [-]
If ADLoginpass.AsString = EClave.Text then
Begin
LoginOk := True;
Nombre := ADLoginnom_user.AsString;
ADLogin.Active := False;
FLogin.Visible:= False;
incio.Show;
Close;
end


en este cambio le elimine el try...finally, el free y el showmodal porque solo funciona solo si el form a llamar es fsNormal
pero el mio es tipo MDIform por eso que al digitar la clave se quedaba en el login y se limpiaban los edits.

ahora tengo este otro problemita que persiste y es cuando se digita una clave erronea la clave aparece en el edit de usuarios..

saludos.

enecumene 21-08-2007 00:27:50

Bueno ya resolvi el ultimo problema que era muy sencillo lo puse asi:

Código Delphi [-]
Begin
           Cuenta := Cuenta + 1;
           EUsuario.Text := '';
           MessageDlg('Clave Inválida',mtError, [mbOK], 0);
           EClave.Text := '';
           ADLogin.Active := False;
           If Cuenta = 3 then Close;
         end;

de Nuevo gracias caral por tu tiempo, te lo agradezco, que dios te bendiga. ah y otra cosita, donde defino los privilegios? en el login o en el main?.

Saludos...

enecumene 22-08-2007 03:15:57

Hola de nuevo, continuando con el mismo hilo, quisiera saber como defino los privilegios de los usuarios? ejemplo:

la tabla de usuario contiene esos campos tipo "Yes/No" que son los botones y menus a restringir el acceso:

backup
findped
findtra
instra
insped
settings
reports
findsupli
inssupli
stats

con el mismo codigo del login como defino los accesos por ejemplo:
si se loguea pedro y el tiene estos privilegios:

backup->No
findped->Yes
findtra->Yes
instra->Yes
insped->Yes
settings->No
reports->Yes
findsupli->Yes
inssupli->Yes
stats->No

al momento de pedro loguearse los menus y botones correspondientes se pongan false o true dependiendo del Yes o No.

quise hacerlo asi pero no me funciona:

Código Delphi [-]
var
BackUp: string;
Begin
BackUp:=ADLoginbackup.Dataset.DatasetField.Value;
if BackUp = 'No' then
Begin
incio.BackUpdatos1.Enabled:=False;
end
else
Begin
incio.BackUpdatos1.Enabled:=True;
end;
end;

Caral 22-08-2007 04:33:40

Hola
Te voy a explicar como lo hago yo:
Creo un campo (permiso) este campo es numerico, defino los permisos en base a la numeracion, 1, 2, 3
1= acceso a todo
2= acceso a x parte o botones
3= acceso a otros botones
asi se pueden tener tantos accesos o permisos como se quiera.
Agrego el campo a la tabla, esta quedara en tercer lugar, 0-1-2-3
el codigo que uso es este:
Lo reconoceras, facilmente:
Código Delphi [-]
  LoginOK :=False;
   AdoQuery1.Parameters.ParamByName('Cod').Value:= Edit1.Text;
   AdoQuery1.Active:= True;
  If AdoQuery1.Fields[3].AsString = '1' then
     // todo
   begin
  // todo
   end;
   If AdoQuery1.Fields[3].AsString = '2' then
   // bodega
   begin
     FmainForm.BitBtn3.Enabled := False;
     FmainForm.BitBtn17.Enabled := False;
     FmainForm.BitBtn18.Enabled := False;
     FmainForm.BitBtn19.Enabled := False;
     FmainForm.BitBtn6.Enabled := False;
     FmainForm.BitBtn1.Enabled := False;
     FmainForm.BitBtn2.Enabled := False;
     FmainForm.BitBtn15.Enabled := False;
     FmainForm.BitBtn14.Enabled := True;
     FmainForm.BitBtn8.Enabled := True;
     FmainForm.BitBtn23.Enabled := False;
     FmainForm.BitBtn24.Enabled := False;
     FmainForm.Timer2.Enabled := False;
     FmainForm.PopupMenu7.Items[3].Enabled:= False;
     FmainForm.PopupMenu7.Items[4].Enabled:= False;
     FmainForm.PopupMenu7.Items[5].Enabled:= False;
     FmainForm.PopupMenu7.Items[6].Enabled:= False;
     FmainForm.PopupMenu7.Items[7].Enabled:= False;
     FmainForm.PopupMenu7.Items[8].Enabled:= False;
     FmainForm.PopupMenu7.Items[20].Enabled:= False;
     FmainForm.PopupMenu7.Items[21].Enabled:= False;
     FmainForm.PopupMenu7.Items[23].Enabled:= False;
     FmainForm.PopupMenu7.Items[24].Enabled:= False;

   end;
    If AdoQuery1.Fields[3].AsString = '3' then
   // produccion, acabado
   begin
     FmainForm.BitBtn2.Enabled := False;
     FmainForm.BitBtn3.Enabled := False;
     FmainForm.BitBtn17.Enabled := False;
     FmainForm.BitBtn18.Enabled := False;
     FmainForm.BitBtn19.Enabled := False;
     FmainForm.BitBtn16.Enabled := False;
     FmainForm.BitBtn5.Enabled := False;
     FmainForm.BitBtn6.Enabled := False;
     FmainForm.BitBtn7.Enabled := False;
     FmainForm.BitBtn1.Enabled := False;
     FmainForm.BitBtn15.Enabled := False;
     FmainForm.BitBtn13.Enabled := False;
     FmainForm.BitBtn4.Enabled := False;
     FmainForm.BitBtn14.Enabled := False;
     FmainForm.BitBtn8.Enabled := False;
     FmainForm.BitBtn27.Enabled := False;
     FmainForm.BitBtn21.Enabled := False;
     FmainForm.BitBtn22.Enabled := False;
     FmainForm.BitBtn23.Enabled := False;
     FmainForm.BitBtn24.Enabled := False;
     FmainForm.BitBtn25.Enabled := False;
     FmainForm.Timer2.Enabled := False;
     FmainForm.PopupMenu7.Items[1].Enabled:= False;
     FmainForm.PopupMenu7.Items[2].Enabled:= False;
     FmainForm.PopupMenu7.Items[3].Enabled:= False;
     FmainForm.PopupMenu7.Items[4].Enabled:= False;
      end;
 If AdoQuery1.RecordCount < 1 then
    Begin
       Cuenta := Cuenta + 1;
       MessageDlg('Usuario no encontrado',mtError, [mbOK], 0);
       Edit1.Text := '';
       Edit2.Text := '';
       AdoQuery1.Active := False;
       If Cuenta = 3 then Close;
    end
   else
       If AdoQuery1Clave.AsString = Edit2.Text then
        Begin
           LoginOk := True;
           Usuario := AdoQuery1CodUsuario.AsString;
           Nombre := AdoQuery1Nombre.AsString;
           AdoQuery1.Active := False;
           Close;
        end
     else
         Begin
           Cuenta := Cuenta + 1;
           MessageDlg('Clave Inválida',mtError, [mbOK], 0);
           Edit2.Text := '';
           AdoQuery1.Active := False;
           If Cuenta = 3 then Close;
         end;
espero te sirva.
Saludos

enecumene 22-08-2007 05:08:55

Gracias Caral ahora mismo intentare implementarlo, luego te comento. Gracias.


La franja horaria es GMT +2. Ahora son las 22:20:59.

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