Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-07-2008
Avatar de BuRtOn
BuRtOn BuRtOn is offline
Miembro
 
Registrado: ene 2008
Ubicación: Bucaramanga
Posts: 215
Poder: 17
BuRtOn Va por buen camino
Mostrar Formulario solo 1 vez y destruirlo

Saludos amigos, es que tengo una gran pregunta, estoy haciendo la parte de seguridad de mi aplicacion para que nadie la piratee, pero estoy haciendo algo muy basico, pero tengo el siguiente problema, y voy a escribir todo lo que tengo para que se den cuenta del problema:

tengo la siguiente funcion, que me captura el Id del disco duro del pc donde voy a instalar mi aplicacion:

Código Delphi [-]
function GetVolumeID(DriveChar: Char): String;
  var
    MaxFileNameLength, VolFlags, SerNum: DWord;
  begin
    if GetVolumeInformation(PChar(DriveChar + ':\'), nil, 0,
       @SerNum, MaxFileNameLength, VolFlags, nil, 0)
    then
    begin
      Result := IntToHex(SerNum,8);
      Insert('-', Result, 5);
    end
    else
        Result := '';
  end;


entonces mi formulario de seguridad quedaria algo asi:

[] = son los edits o dbedits
{} = son botones.


Ingresa tu Id: [ xxxxx ] {id}

ingresa tu serial [xxxxx]

.................................................................{siguiente}


bueno como ven el boton id contiene el siguiente codigo:

Código Delphi [-]
procedure TfrmSerial.Button1Click(Sender: TObject);
begin
edtID.Text:= GetVolumeID('C');
end;

aqui lo que hago es extraer el Id del disco del pc y pasarlo a dbedit.

por el otro lado en el edit del serial, es un codigo que ya esta predeterminado por nostros, este es el codigo para que me entiendan mejor, y esta almacenado en el boton siguiente:

Código Delphi [-]
procedure TfrmSerial.BitBtn1Click(Sender: TObject);
begin
if edtSerial.Text = '64703706571782' then
begin
   ShowMessage('El serial es correcto');
  end
else
  begin
   ShowMessage('El serial es incorrecto');
  end;
end;

es un codigo que yo mismo genero y siempre va a ser el mismo, como se pueden dar cuenta.


el problema radica en lo siguiente, necesito que ese formulario donde me pide el serial y el id, solo salga una sola vez , es algo asi como cuando vas a registrar algun producto legal, el te pide el serial y te salen las casillas para ingresar el serial, si esta bien nunca jamas volvera a salir ese formulario de registrarce, eso es lo que necesito...teniendo en cuenta que cada vez que el usuario ingrese el formulario no sale pero si me tiene que ejecutar siempre una consulta donde diga que el ID del disco duro es el mismo que esta almacenado en la tabla SEGURIDAD para permitirle al usuario utilizar la aplicacion, si ese ID llega a cambiar, pues obviamente se tendra que bloquear la aplicacion....

lo que quiero hacer con la consulta del ID es algo asi:


Funcion idvolumen('C') : este es el id que extrae la funcion.

Id : este es un campo almacenado en una tabla paradox de tipo Alpha.


Código Delphi [-]
 
if funcion idvolumen('C') = id then
begin
//el id del disco es correcto puede ejecutarce la aplicacion.
end
 
else
begin
//el id es incorrecto bloquear aplicacion;
end;

esa es la condicion que la aplicaicon siempre tiene que ejecutar sin necesidad del formulario....para que quede al estilo de Microsoft Office 2007 JEJE, que ingresas el serial una solo vez y ya....pare de contar, nunca jamas vuelve a salir el formulario....


por favor si alguien sabe como hacer esto, por favor espero una ayuda...


ya muestro anteriormente como extraigo el ID del disco duro, y tener en cuenta que ese ID lo guardo en una tabla en paradox.....

por favor agradeceria su ayuda y aportes.....
Responder Con Cita
  #2  
Antiguo 12-07-2008
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Generalmente, los formularios en que se solicita el "registro" a un usuario, se muestran de forma "modal": no permiten hacer nada en el resto de la aplicación, obligando al usuario a hacer "algo" con el formulario que le presentamos. El asunto podría quedar tal que así:

Código Delphi [-]
begin
  with TfrmUserRegistry.Create(nil) do
  try
    if (ShowModal() = mrOk) then
    begin
      // El usuario "aceptó"
    end else begin
      // El usuario "canceló"
    end;
  finally
    Free(); // Liberamos el formulario
  end;
end;

El código anterior crea, muestra y comprueba el resultado de mostrar el formulario "modalmente". Acto seguido, y, en cualquier caso, libera el formulario en cuestión. Ahora bien, tal como yo lo veo, tú deberías comprobar si el usuario proporcionó datos correctos en "El usuario aceptó". Y no hacer "nada" si "El usuario canceló".

Si el usuario "aceptó" comprobarías que los datos que ha proporcionado son válidos. Si lo son... y no quieres que dicho usuario vuelva a ver el formulario, la cosa creo que pasaría por guardar dichos datos en algún sitio. Tú mismo mencionas la base de datos de tu aplicación. Entonces, nos queda que, antes de mostrar el formulario, deberíamos comprobar si el usuario ya se "registró" antes. Algo como:

Código Delphi [-]
begin
  if not UserHaveRegistryData() then
  begin
    with TfrmUserRegistry.Create(nil) do
    try
      if (ShowModal() = mrOk) then
      begin
        // El usuario "aceptó"
      end else begin
        // El usuario "canceló"
      end;
    finally
      Free(); // Liberamos el formulario
    end;
  end;
end;

La idea es que la función (o método) "UserHaveRegistryData()" compruebe que existe información en la base de datos (por ejemplo) que confirme que el usuario ya "registró" la aplicación. Si no lo ha hecho, le mostraremos el formulario para que lo pueda hacer, y, si lo ha hecho... no le mostramos formulario alguno.

Pero, igual es que me he perdido algo, porque, yo creo que esto que digo tú ya lo sabes... ¿No?
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 12-07-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
hola, un comentario tansolo : guardas los datos en una tabla llamada SEGURIDAD? no es algo demasiado evidente
Responder Con Cita
  #4  
Antiguo 12-07-2008
Avatar de BuRtOn
BuRtOn BuRtOn is offline
Miembro
 
Registrado: ene 2008
Ubicación: Bucaramanga
Posts: 215
Poder: 17
BuRtOn Va por buen camino
Saludos david, muchisimas gracias brother, ya tengo la idea, y no , no sabia lo que me estas explicando, pero la pregunta es, tu savez que yo almaceno el ID del disco duro en una base de datos, como hago para comprobar que ese ID que tengo grabado en mi base de datos nunca va a cambiar, como dije anteriormente lo que hago es si das click en el boton serial el te extrae el ID del disco y lo almacena en una tabla y cuando el usuario ejecuta la aplicacion por segunda vez , como te dije el formulario no debe salir, por que se supone que el usuario esta registrado, y si no se registro como tu dices que no deje ejecutar la aplicacion....pero me confundi por algo, que diferencia tiene el primer codigo con el segundo ?? es que nunca habia hecho algo asi, solo hasta ahora, y pues como vez no es que sea un experto en el tema....y donde colocas el comentario de //El usuario ''acepto'', El usuario ''cancelo'' y //Liberar formulario, como es la sintaxis de estos comentarios, con un simple showmodal , osea se colocaria si acepta el usuario Principal.showmodal, o estoy equivocado, y en el que dices liberar formulario?, por favor te agradeceria que me colaboraras David eres el unico que se a hacertado a lo que necesito.....y Muchas gracias por tu tiempo amigo.
Responder Con Cita
  #5  
Antiguo 12-07-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Hola BuRtOn,
por lo que estoy comprendiendo del tema, tu problema es como determinar si el usuario es registrado o no. Tu problema es del tipo lógico/diseño.

Lo más natural es que al momento en que se ejecuta el aplicativo se dispare una función que se encargue de ello.

Por simplicidad asumamos una función UsuarioRegistrado() que devuelve un boleano:

Código Delphi [-]
function UsuarioRegistrado: boolean;
begin
   // lo que haya que hacer para determinar si está registrado
   // en ocasiones basta con hacer una consulta del tipo:
   // select top 1 ID_REGISTRO from TABLA_REGISTRO
   // Tal vez result vendría a tener una forma como esta:
  result := query1.RecordCount = 1
end;

Bueno, esa función de ejemplo lo que hace es emitir una consulta contra la base de datos en busca de un registro en particular (un ID_Registro).
El algoritmo está diseñado para que siempre y cuando exista un y solo un registro en la tabla TABLA_REGISTRO se de por válido que el usuario se registró.

¿Cuando se ejecuta esta función?
Lo más obvio (y sencillo) podría sugerir en el OnCreate de la forma principal. Se podría hacer algo como esto:

procedure FrmMainOnCreate(Sender: TObject);
begin
UserValido := UsuarioRegistrado;
end;

Siendo UserValido una propiedad, o variable.

Y bueno, nos resta ahora solamente el tema de operar en base a este resultado. Lo más sencillo de hacer es como señala Dec:

Código Delphi [-]
if NOT UserValido
  then begin
           try  
             with TfrmRegistro.Create(nil) do
             ...   
           finally
             TfrmRegistro.Free; 
           end; 
         end;

Ahora bien, ¿que se necesita para que ejecute normalmente la función UsuarioRegistrado? Que haya una conexión establecida.... por tanto, antes de ejecutar dicha función deberá asegurarse de esto.

Que quiero hacerte notar, que tu problema es del tipo lógico. Sugiero que realices una búsqueda en los foros, porque este tema se ha tratado en otras ocasiones.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #6  
Antiguo 12-07-2008
Avatar de BuRtOn
BuRtOn BuRtOn is offline
Miembro
 
Registrado: ene 2008
Ubicación: Bucaramanga
Posts: 215
Poder: 17
BuRtOn Va por buen camino
Saludos delphius....gracias por tu tiempo...pues en si mi problema es como hago, para mostrar el formulario de seguridad solo una vez y listo, que no saliera mas despues que el usuario se registre.....eso es todo....y que siempre haga la comsulta que el ID que esta en la base de datos corresponda al ID de la maquina donde se instalo la aplicacion.....Gracias por tu tiempo prestado Delphius....
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Abrir un formulario hijo solo una vez Walterdf Varios 5 08-04-2008 17:15:01
dll + mostrar formulario albertoP OOP 1 04-12-2006 08:21:20
mostrar sólo 5 caracteres de un varchar(75) Giniromero Firebird e Interbase 4 19-09-2006 12:37:41
mostrar solo dos decimales clanmilano Varios 1 15-11-2005 23:31:52
mostrar SOLO cliente de los que tengo un sólo registro Giniromero SQL 15 11-06-2004 12:33:19


La franja horaria es GMT +2. Ahora son las 13:02:22.


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
Copyright 1996-2007 Club Delphi