Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Mostrar Formulario solo 1 vez y destruirlo (https://www.clubdelphi.com/foros/showthread.php?t=58215)

BuRtOn 12-07-2008 07:07:17

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.....

dec 12-07-2008 07:52:50

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? ;)

coso 12-07-2008 13:27:21

hola, un comentario tansolo : guardas los datos en una tabla llamada SEGURIDAD? no es algo demasiado evidente

BuRtOn 12-07-2008 14:43:16

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.

Delphius 12-07-2008 15:43:13

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,

BuRtOn 12-07-2008 15:50:33

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....

Delphius 12-07-2008 16:07:49

Cita:

Empezado por BuRtOn (Mensaje 299773)
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....

A ver BuRtOn,
Sería oportuno que nos respondas a estas preguntas:
1. ¿Todas tus formas están en Auto-Create o por el contrario la creas por demanda?
2. ¿Es un diseño MDI?
3. ¿En que consiste y como está diseñada la tabla en donde se registrará el ID?
4. ¿Quien crea a quien?
5. ¿Quien libera a quien?
6. ¿Por casualidad haces usos de datamodules?

Sería muy útil que nos detallases mejor tu situación. Dependiendo de como estés estructurando tu diseño se deberá darte alternativas para resolver tus problemas.

No veo donde está el problema BuRtOn. La solución por lo general se lleva haciendo esto:
1. Al momento de ejecutar la aplicación se chequea si el usuario es registrado
2. Si no está regitrado
2.1. "Mostrar" la forma de registro
2.2. En otro caso (si esta registrado) se habilitan el trabajo normalmente.

¿Cuál creo que es tu problema? Que no estás repartiendo bien la lógica:
¿Quien determina si el usuario es registrado? El form principal
¿Quien se encarga de llamar al form de registro? El form principal
¿Quien se encarga de registrar al usuario adecuadamente? El form de registro

Una vez que el usuario ha sido registrado el form se libera. La cuestión es que el form de registro sea crea y/o muestra sólo cuando se comprueba que en la base de datos no existe dicho registro.
Existe (y debería existir) un sólo punto en donde se comprueba la validez de la registración: al momento de crearse el form principal. Y en base a esto, el diseño que tienes debería ser capaz de determinar que hacer.

Como he dicho antes, tu problema es de diseño como de lógica.
Lamentablemente necesitamos que nos detalles mejor tu situación porque asi no te podremos ser de ayuda.

Saludos,

coso 12-07-2008 16:36:07

como dice Delphius, creo que es un problema de diseño

1.- iniciar aplicación
2.- comprobar si tenemos algun registro de id de disco duro / usuario
2.1.- si no lo tenemos: creamos la form de registro y lo registramos con un user y con el ID de disco duro
2.1.- si lo tenemos, pero es invalido, avisar y salir (posible reinstalación en otro pc)
2.2.- si lo tenemos, y es valido, continuar...
...

creo que esta es tu idea. Siguiendo esta idea, si te fijas, solo habra un único registro, y por lo tanto un único usuario, por lo que no tiene mucho sentido crear un registro de usuarios. Lo mejor seria simplemente, olvidarse del 'usuario'y del form del registro, que es lo que te esta creando confusión pues son innecesarias, y registrar la aplicación con el ID del disco duro.

1.- iniciar aplicación
2.- comprobar si tenemos el id del disco duro (por ejemplo, en un fichero, grabado en un recurso o bien en el registro como indicaba dec)
3.- si no lo tenemos, lo leemos y lo grabamos en nuestro programa (o registro, fichero, etc...)
3.- si lo tenemos, lo recogemos y comparamos con el del disco duro
3.1 - fallo : avisamos y salimos
3.2 - no fallo : se continua...
....

PD: si por el contrario aun quieres que se registren los usuarios (varios de ellos) entonces forzosamente te tiene que aparecer el form de registro o login al principio de la aplicación para comprobarlo con tu base de datos.

PDD : aun, si quieres q tu aplicación corra en varias maquinas, un usuario por maquina, deberia ser algo asi
1.- iniciar aplicación
2.- leer id de disco duro
3.- comprobar en base de datos si existe ese id
3.1 - si no existe : posible nueva instalación. Se abre el form de registro, pidiendo user y el id, y se graba en base de datos
3.2 - si existe se continua

como ves, este ultimo ejemplo registraria una nueva instalación con un nuevo usuario, pero si te fijas no sirve absolutamente de nada, al menos como protección de copia, pues si lo reinstalas en otro pc simplemente te pediria un nuevo usuario y continuaria. si por el contrario la lista de usuarios ya te es conocida, entonces lo mejor seria:

1.- iniciar aplicación
2.- pedir usuario
3.- comprobar usuario en base de datos
3.1.- existe : pedir id
3.1.1.- leer id de disco duro y comparar con la entregada
3.1.1.1.- fallo : aviso y salir
3.1.1.2.- no fallo : continuar normalmente
3.2.- no existe : pedir nuevo usuario o bien avisar y salir

este ultimo caso seria para proteger 'cada pc', para que usuarios que no sean el habitual no tengan acceso (aunque claro esta conociendo el usuario, ya se entraria, por lo que no es tampoco demasiado eficiente).

Creo q lo mejor es que nos digas de q quieres proteger el programa : de copia digamos ilegal o de acceso de usuarios invalidos.

coso 12-07-2008 17:07:04

un ejemplo (aunque es casi lo mismo que puso dec)

Código Delphi [-]
procedure Form1.FormCreate(sender : TObject);
begin
     Mirar_numero_intentos_fallidos;
     if not Programa_registrado() then 
       if registro.ShowModal <> mrOk then Application.Terminate;
     ....
end;
 
procedure Mirar_numero_intentos_fallidos;
var 
     v : integer;
begin
     v := Leer_intentos;
     if v > 5 then begin Aviso(); application.Terminate; end;
end;
 
procedure Registro.Registrar;
var 
     id : string;
begin 
     if Edit2.Text <> 'clave' then 
     begin
         ShowMessage('clave incorrecta');
         Application.Terminate;
 { aqui tambien puedes grabar, en algun lado del pc (registro, fichero, base de datos,...) los intentos fallidos }
     end;
 
     id := CogerIddeDiscoDuro;
     // Por ejemplo, se registra insertando en base de datos
    qsec.Insert;
    qsec.FieldValues['id'] := id;
    qsec.FieldValues['clave'] := Edit2.Text;
    qsec.Post;
    // o creando un fichero con el id, clave 
    CreateFile(...)
    // o en el registro
    CreateRegistryKey(...)
end;
 
function Form1.Programa_registrado() : boolean;
var 
    id : string;
begin
    id := CogerIddeDiscoDuro;
    // Aqui puedes comprobarlo de varias maneras, segun este guardado
   Programa_registrado := fileexists(...) // si se registra creando un fichero...
   Programa_registrado := qsec.Locate('id',id,[]);    // si se inserto en una tabla...
   Programa_registrado := GetRegistryKey(...) // si se guardo en registro...
end;

no se... creo que poco mas se puede decir :(

a ver si te sirve entre todos :D saludos

BuRtOn 13-07-2008 06:41:42

Saludos amigos, muchisimas gracias Coso por colaborarme en el codigo, y ati delphius como siempre me ayudas, jeje, miren lo que yo quiero, es proteger mi aplicacion de lo siguiente:

Vendi mi aplicacion a un Gimnasio, le di el instalador y listo, el instalo el .exe de mi aplicacion en su pc y las bases de datos correspondientes, ...pero hay un problema si el dueño del Gimnasio coje y copia mi aplicacion o simplemente coje el Cd de instalacion que yo le di, e instala mi aplicacion en otro pc, o mejor dicho vende mi aplicacion a otro Gimnasio....entonces necesito seguridad de que si otra persona va a instalar mi aplicacion no pueda...que la aplicacion solo corra en los Gimnasios autorizados, osea los que me compran la aplicacion....y que una vez este instalada la aplicacion y el le de copiar al .exe y a las bases de datos y los pase a otro pc no pueda...pues ahi es donde emepieza a funcionar el Id del disco duro.....entonces miren lo que estoy tratando de hacer:


1. Para evitar que los Gimnasios que tengan mi cd de instalacion y traten de instalarlo no puedan, pues facil, siempre que vendemos la aplicacion y se instala ella genera el formulario que les digo que es el formulario de seguridad....este Formulario contiene lo siguiente:

* Serial: el serial es un codigo standar que nostros grabamos, para que se pueda instalar la aplicacion....ejemplo de lo que estoy explicando:

Código Delphi [-]
procedure TfrmSerial.Button2Click(Sender: TObject);
begin
if edtSerial.Text='xxxxxx' then
begin
ShowMessage('Bienvenidos a SISGYM');
end
else
begin
ShowMessage('Por favor no trate de crackear esta aplicacion');
end;
end;

como se pueden dar cuenta el serial esta predefinido en tiempo de programacion y el codigo seria es xxxxxx, entonces ese codigo siempre lo colocamos nostros apenas instalemos la aplicacion, por que eso es lo bueno, que nostros mismos vamos e instalamos nuestra aplicacion....asi que ese codigo solo lo sabemos mi compañero y yo...por ese lado evitaria que me copien la aplicacion desde el cd de instalacion que yo doy...


* Id: el Id del disco duro lo que me ayudaria a evitar es que me copien la aplicacion despues de instalarla en el pc del Gimnasio obtenga la aplicacion....ejemplo de lo que digo: Me compran la aplicaicon, la instalo en el pc del gimanasio, el dueño le da copiar a mi .exe y a las bases de datos, y le da pegar en otro pc, y listo queda de una mi aplicacion en otro pc, entonces si tengo el Id del disco duro, en una Base de datos o un archivo, como sea mas facil, pues simplemente que me genere la consulta siempre que se ejecute la aplicacion que si el Id es <> no me deje ejecutar la aplicacion.

Pero una de las cosas que quiero hacer y a lo mejor no me explique es lo que mencione anteriormente lo del Serial y el Id, ya saben por que el serial y por que el Id, lo que deseo es pues cuando la aplicacion se ejecute por primera vez me arroje el formulario de Seguridad e inmediatamente proceda a insertar los datos de Serial e Id...y se ejecute la consulta respectvia si los datos son correctos permita continuar con la aplicacion si no, pues simplemente emitir un shomessage('Datos de registros incorrectos'); y cierre la aplicacion, a eso se le puede agregar lo que decia coso, que si el numero de intentos es > 5 cierre la aplicacion---, lo otro es que una vez registrado el cliente no vuelva a salir el formulario, pero que siempre que se ejecute la aplicacion se ejecute la consulta de que si el Id es correcto....y si algun caso el Id no llega a ser correcto eso indica que la aplicacion esta en otro pc.... e inmediatamente vuelva a generar el formulario de ingrese Serial e Id....:D....eso es lo que nesecito....y Coso, por archivos me parece como mas facil, segun tu codigo, pero no soy tan avanzado como tu, me gustaria que me pasaras un tutorial de archivos, pues tu das una buena opcion de almacenar el Id en un archivo pero no tengo ni idea como crearlo...no se como es la sintaxis, ni los parametros del archivo que mencionas, en fin espero que me puedas explicar con plastilina, jejeje, es que el tiempo apremia me toca entregar la aplicacion este martes, y necesito eso para que no me la roben, ya basta que aqui en Colombia, piratean todo...hay que tener cuidado con eso...les agradesco que me puedan colaborar....y espero que esta vez me hallan entendido mas....me demore mucho planteando bien mi pregunta...ha y por ultimo, esta es la funcion que tengo para extraer el Id:

Código Delphi [-]
//Funcion de seguridad
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;

Posdata: Tengo una aplicacion aparte que me extrae y me muestra por pantalla el Id del pc, entonces solo es insertar el Id de mi aplicacion en mi formulario de seguridad y comprobar si ese Id corresponde al del Pc...Gracias amigos por todo su tiempo prestado...

coso 13-07-2008 11:05:26

Hola, me da la impresion que el problema no es que te demores planteando la pregunta, sino que no escuchas las respuestas :( si tienes otro programa donde coger la id, personalmente usaria este para 'marcar' tu aplicación con el id del disco duro (comprobando el serial) y luego al cargar la aplicación que se leyera directamente de ella misma y comprobase que es la misma.

Para grabar en un archivo, te dejo este link

Hoy es domingo, pero si tengo tiempo ya preparare un ejemplo (yo de ti por eso, no me esperaria :D) Saludos.

BuRtOn 13-07-2008 15:54:00

Saludos Coso, jajaj, brother a cuando digo que tengo un programita aparte para sacar el Id es para no incluirlo dentro del formulario de seguridad...pero en lo que estoy confundido, es en como hago para que el formulario solo aparezca una vez, osea apenas se ejecute la aplicacion por primera vez, y que genere la consulta de que si los datos son correctos continue la aplicacion si son incorrectos termine la aplicacion, y que no vuelva a salir nunca mas....excepto si la aplicacion la intentan ejecutar desde otro pc, que vuelva a salir el formulario de seguridad.....


En pocas palabras que el formulario salga la primera vez de ejecucion pida datos y listo, no vuelva a salir, pero que siempre que se ejecute la aplicacion el haga internamente la consulta de que el Id que esta guardado en el archivo es = al Id que el esta extrayendo....y cuando el Id sea <> que vuelva a salir el formulario...que copdigo se utiliza ??, y no tanto el codigo si no en que evento lo ubico ??? gracias Coso has sido de gran ayuda hombre....

coso 13-07-2008 15:55:00

si vamos, lo que ya te han respondido 5 veces seguidas...si lo que quieres es que te hagamos la faena, creo que estas en el sitio equivocado

BuRtOn 13-07-2008 16:01:38

mmm...solo necesito saber en que evento del formulario ubico el codigo que me han dado, para lo que aparezca solo una vez y ya...eso es todo...por eso dije que no me importa tanto el codigo....y sabes Coso, no me gusta que me hagan las cosas, es que cuando llebas como 4 o 5 meses programando apenas con Delphi y solo te enseñan lo mas basico de este mundo, es un poco duro aprender solo....pero hay voy entonces por favor no diga que yo quiero que me hagan mi trabajo, por que no soy parasito brother, y gracias....

coso 13-07-2008 16:03:07

si hubiese usted leido las respuestas anteriores, ya sabria en que evento colocarlo. saludos y adios.

egostar 13-07-2008 16:06:57

Cita:

Empezado por BuRtOn (Mensaje 299992)
Saludos Coso, jajaj, brother a cuando digo que tengo un programita aparte para sacar el Id es para no incluirlo dentro del formulario de seguridad...pero en lo que estoy confundido, es en como hago para que el formulario solo aparezca una vez, osea apenas se ejecute la aplicacion por primera vez, y que genere la consulta de que si los datos son correctos continue la aplicacion si son incorrectos termine la aplicacion, y que no vuelva a salir nunca mas....excepto si la aplicacion la intentan ejecutar desde otro pc, que vuelva a salir el formulario de seguridad.....


En pocas palabras que el formulario salga la primera vez de ejecucion pida datos y listo, no vuelva a salir, pero que siempre que se ejecute la aplicacion el haga internamente la consulta de que el Id que esta guardado en el archivo es = al Id que el esta extrayendo....y cuando el Id sea <> que vuelva a salir el formulario...que copdigo se utiliza ??, y no tanto el codigo si no en que evento lo ubico ??? gracias Coso has sido de gran ayuda hombre....

Cita:

Empezado por coso (Mensaje 299994)
si vamos, lo que ya te han respondido 5 veces seguidas...si lo que quieres es que te hagamos la faena, creo que estas en el sitio equivocado

He estado leyendo este hilo y francamente me ha desesperado un poco el hecho de que no quieras o no puedas comprender lo que te han dicho hasta ahora.

Mira, esto es cuestión de lógica :rolleyes:

Cita:

Si no existe registro entonces muestro pantalla de registro
en caso contrario entro a la aplicación
Traducelo al código y verás que es muy simple,no te ahogues en un vaso de agua, ya has perdido demasiado tiempo con esto y puede que en este momento estén instalando una copia mas de tu programa.

Solo hay algo que no me checa de todo esto

Cita:

Empezado por BuRtOn
Vendi mi aplicacion a un Gimnasio, le di el instalador y listo, el instalo el .exe de mi aplicacion en su pc y las bases de datos correspondientes

Lo que hagas a partir de ahora nada tendrá efecto si tu cliente ya se hizo de una copia del instalador anterior con las intenciones que has comentado :eek::confused::rolleyes::cool:

Salud OS

Delphius 13-07-2008 16:12:54

Hola BuRtOn,
Dime, sin ofender ¿Estoy hablando en chino?:confused:

Porque no comprendo que no te hayas dado cuenta de lo que coso y yo te hemos estado diciendo.

¿Tanto cuesta hacer que cuando se crea la ventana principal hacer el chequeo de si está registrado el usuario y en base a ello decidir si se debe mostrar la ventana de registración o sino dar por válido la copia del ejecutable?

Veamos esto bajo la lupa:

1. En el evento OnCreate de tu form principal debes tener algo como esto:
Código Delphi [-]
RegistroValido := VerificarRegistro;
if NOT RegistroValido
   then begin
            // el sistema no ha sido registrado
            ShowMessage('Hey amigo... tienes una copia ilegal del sistema');
            MostrarVentanaDeRegistracion;
          end
   else begin
            // el sistema ya habia sido registrado
           ShowMessage('Gracias amigo por usar una copia legal');
           HacerAlgunaOperacionNecesaria;
         end;

VerificarRegistro es una función que cumple con el propósito de hacer la "consulta" y determinar si el usuario tiene una copia registrada. Ya sea que deba consultar a una base de datos, mirar en un archivo oculto, en el regitro de windows, no importa... Lo que interesa es que VerificarUsuario tiene la capacidad de saber si el sistema fue registrado apropiadamente.

Y bueno, se pregunta si esta todo en orden (debidamente registrado), si no lo está se muestra el form de registración y si está en orden simplemente se deja continuar con el trabajo: se habilitan los menues, se lanza el cuadro de login si es necesario, etc (eso ya depende de tu sistema).

¡Y listo! ¿Que más simple que esto?
¿Que sucede? He aqui una explicación del tema:

1. En la primera vez que se inicia el ejecutable, VerificarRegistro devuelve FALSE. Por tanto, habilitará el form de registro y mostrará el cartelito necesario.
2. El usuario por tanto se ve obligado a registrar el software. Si no lo registra, el sistema seguirá arrojando el cartelito y el form de registro.

No está demás decir que el sistema debe diseñarse para que esta form de registro sea en forma modal y que las opciones de menu y otras cosas estén inhabilitadas a excepción de las que permiten llevar al form de registro. Aunque todo esto dependerá de como esté hecho el sistema.

3. Una vez que el usuario registra apropiadamente el software, VerificarRegistro devolverá TRUE, por tanto seguirá el curso normal de trabajo.

BuRtOn, ¿Se entiende ahora?
Por cierto, yo que tu reemplazaría esos ShowMessage() por Application.MessageBox(), es mucho más estético y profesional.

Saludos,

BuRtOn 13-07-2008 16:15:45

Saludos Egostar, jaja no brother, que voy a vender mi aplicacion el martes, absolutamente nadie tiene la aplicacion aun, ni el instalador, jajajajaja, Dios ya me ubieran copiado mi aplicacion hace hufffff...pero no ho,bre estoy elaborando la parte de seguridad para que no les quede tan facil hacer copia de mi aplicacion.....y Egostar, si se que la logica es muy simple, solo que no se en que evento coloco el codigo de la logica, para que el formulario solo se muestre una sola vez, y siga ejecutando internamente la consulta de que el Id es correcto....sin mostrar formulario, y cuando sea incorrecto esa informacion que lo muestre....eso es todo, en que evento programo esooooooo....jejeje creo que eso es todo lo que necesito, ya estoy leyendo como crear archivos...para guardar el Id en un archivo....Gracias por todo, y si me ha servido el codigo que me han dejado, ahi estoy programandolo haber que sucede...pero el evento por favoorrr....Gracias por su tiempo prestado...

BuRtOn 13-07-2008 16:20:35

Saludos Delphius-....haaa ok, eso era lo que necesitaba saber el evento....ya entendi...jejeje gracias, al tiro me pongo a terminar ese codigo...Gracias por tu tiempo prestado...

coso 13-07-2008 16:22:20

jajajjajaa

Delphius 13-07-2008 16:35:44

BuRtOn, yo ya antes te había dado una pequeña reprimenda. No te enojes si te doy otra:

Cuando uno viene aqui a pedir ayuda, lo mínimo que esperamos de dicha persona es que:
1. Lea atentamente lo que le proponemos.
2. Analice su situación y que exprese claramente sus inquietudes, aportando los detalles necesarios para quienes puedan y se ofrezcan a ayudar sepan entender y diagnosticar la situación.
3. La prisa y urgencias no vienen. Por tanto omitirlas, o en su defecto, venir con más tiempo.
4. Responda a las preguntas que te hacen.

Mira el hilo que se formó y todo para que: para un simple OnCreate

Te voy a pedir que para la próxima, leas con mayor atención lo que te decimos. Y por cierto BuRtOn... duerme un poquito, cuando la cabeza no funciona, lo mejor es descansar un poco.

Saludos,

egostar 13-07-2008 16:37:25

Cita:

Empezado por BuRtOn (Mensaje 300005)
Saludos Delphius-....haaa ok, eso era lo que necesitaba saber el evento....ya entendi...jejeje gracias, al tiro me pongo a terminar ese codigo...Gracias por tu tiempo prestado...

Cita:

Empezado por coso (Mensaje 300007)
jajajjajaa

Changos, creo que los que se ahogaban en un vaso de agua eramos otros :D:D:D

Salud OS

coso 13-07-2008 16:39:33

no no egostar, era ironia. Realmente en los ejemplos esta el evento OnCreate. pero bueno, bien esta lo que bien acaba ... :D

egostar 13-07-2008 16:41:24

Cita:

Empezado por coso (Mensaje 300018)
no no egostar, era ironia. Realmente en los ejemplos esta el evento OnCreate. pero bueno, bien esta lo que bien acaba ... :D

Si amigo coso, entendí la ironia por eso mi comentario :)

Salud OS

coso 13-07-2008 16:43:44

ah,vale....lo dicho, bien esta...:D saludos

BuRtOn 13-07-2008 16:51:55

mmmm....no es ironia....por que me toco empezar a leer como hacer archivos, y pues en el codigo que me paso Coso, lo estoy utilizando, solo que da la opcion mas facil de crear un archivo y mirar si existe....no se pero no veo nada etico burlarse de los demas :(, supongo que ustedes alguna vez empesaron desde 0 o a lo mejor tuvieron los mismosporblemas que yo, en fin eso no entra al caso de mi problema actual de mi aplicacion, de todas formas gracias por sus aportes....

coso 13-07-2008 16:58:40

de nada :D saludos y adios

BuRtOn 13-07-2008 17:02:27

Coso a mi me late que res un excelente programador, pero como persona te hace falta crecer mucho aun....no lo tomes a mal, crece en cuanto tu conocimiento y tu forma de ser con los demas....veras el cambio...y es enserio en fin...Gracias por que me aportaste codigo....y trataste de ayudarme, solo que, que mal que te allas puesto a burlarte de mi...en fin...see you later.....:D....

coso 13-07-2008 17:04:26

de nada :D saludos y adios (3ª vez, usted es duro de oido no?)

coso 13-07-2008 17:29:30

burton, antes de dar consejos de vida, mirese a si mismo. Todos hemos empezado desde cero : curas de humildad por no saber lo que nos querian decir, romperse la cabeza con la cosa mas absurda, investigar, preguntar, compañeros que se querian aprovechar de nuestro trabajo...etc... no se lo tome a mal, pero sigo creyendo que esa era su intencion desde el principio. si me dice que no, pues le creere, no me quedara otra. no me burlo de su ignorancia, me burlo de su 'yo soy mas listo que estos', pues se le ha girado en su contra...en fin...ya nos veremos por aqui

BuRtOn 13-07-2008 17:34:58

mmm...Coso, no vi en ninguna parte de este hilo, donde yo ,me crea superior a alguien, si lees con atencion siempre les dije que solo llevo com 5 meses con delphi, y todos lo saben, si acudo al foro es por que los necesito, y estoy hasta ahora aprendiendo......en fin hombre te agardezco que me allas ayudado...y ya nada de broncas...:)

coso 13-07-2008 17:40:03

es cierto, no lo pone en ningun lado...ok, ningun problema. de nada :D saludos y adios.

BuRtOn 15-07-2008 18:01:57

Bueno ya trabaje toda la logica de seguridad....pero aun no entiendo algo...miren si compruebo lo siguiente:

Todo este codigo lo genero en el evento OnClick del boton aceptar del formulario Serial.

El IdArchivo: Se genera con una aplicacion aparte, y creo el archivo donde instalo la aplicacion, para que pueda llamar el archivo y hacer la comparacion con el IdPc que extrajo la funcion....


Código Delphi [-]
   
  if IdArchivo = IdPc (Este Id se extrae por medio de una funcion) then
    begin
      MessageDlg('Bienvenido, Registro Satisfactorio',mtInformation,[mbOK],0);
      frmSerial.Visible:=False;
      //Que nunca vuelva a salir el formulario de Seriales ya que el usuario esta registrado.
 
    end
 else
   begin
     MessageDlg('Datos Incorrectos',mtInformation,[mbOK],0);
     Application.Terminate;
   end;


Esto se genera en el Formulario Serial es simple....Apenas se ejecute la condicion que si el IdArchivo = IDPc es verdadero, inmediatamente se vuelve Invisible el FormSerial, y aparece el Formulario de Seguridad de la aplicacion, que es el que contiene lo basico de un modulo de seguridad, El Tipo de usuario, el loggin y el password, y un boton que es aceptar y otro botn que es salir de la aplicacion....Bueno aqui va la segunda parte de lo que hice:

Si el usuario ingresa el loggin, tipo, y password correctos da click en Aceptar, 'Se genera de nuevo la misma consulta que se hace en el frmSerial pero es interna, siempre que le de click al boton de aceptar para iniciar session de usuario normal el genera la consulta interna, pregunta que si el Id que esta extrayendo internamente es diferente al del archivo, emita un mensaje de que la aplicacion fue instalada en otro pc, ya que la funcion de extraer el Id esta en el Boton de aceptar del frmSeguridad, y el valor de la funcion lo paso a un Edit, para hacer la comparacion entre el Id que extrajo automaticamente la funcion, con el archivo que nostros generamos....el archivo que generamos como mencione anteriormente se genera con una aplicacion aparte....y si no es igual la comparacion, pues me tiene que volver a aparecer el frmSeriales'.


El problema es es, que mi formulario frmSerial , solo tiene que ser visible la primera vez que genere la aplicacion, y que sea visible de nuevo cuando la consulta interna que hice en el formulario frmSeguridad no sea igual y me indique que la aplicacion esta en otro pc diferente al que se instalo inicialmente.....

se que me dijeron que en el evento OnCreate...y pues solo supongo que con un condicional If....pues me guie mas o menos por el codigo que me facilito mi amigo Dec....Entonces esta vez ya la logica esta construida, solo quiero que me muestre el formulario frmSerial, en los casos que estoy nombrando anteriormente....por favor cualquier ayuda se los agardezco...es lo unico que me hace falta......Gracias.....



Posdata: Tambien supongo que hay que hacer un contador de registros, que si el registro esta hecho una vez, no vuelva a salir el formulario frmSerial... bueno la logica ya esta, pero no se como hacer que mi formulario solo salga en las ocasiones que indico anteriormente...gracias...

egostar 15-07-2008 18:17:19

Yo no entiendo algo:confused:

Cita:

Empezado por BuRtOn
Esto se genera en el Formulario Serial es simple....Apenas se ejecute la condicion que si el IdArchivo = IDPc es verdadero, inmediatamente se vuelve Invisible el FormSerial, y aparece el Formulario de Seguridad de la aplicacion, que es el que contiene lo basico de un modulo de seguridad, El Tipo de usuario, el loggin y el password, y un boton que es aceptar y otro botn que es salir de la aplicacion....Bueno aqui va la segunda parte de lo que hice:

Porque haces esa comparación en el Formulario frmSerial, no sería mas conveniente hacerlo en el proyecto principal?

Yo lo haría en el evento OnShow del form principal, hablitando (si existe) el menú o deshabilitando el menu (si existe) dependiendo de si está o no registrado.:rolleyes:

Código Delphi [-]
if IdArchivo = IdPc then begin
   MessageDlg('Bienvenido',mtInformation,[mbOK],0);
   HabilitaMenu;
end
else begin
       MessageDlg('No se ha registrado el sistema, favor de registrar',mtInformation,[mbOK],0);
       frmSerial.ShowModal;
       if frmSerial.ExistoRegistro then begin
          HabilitaMenu;
       end
       else begin
              ShowMessage('sistema no registrado satisfactoriamente');
              DesHabilitaMenu;
       end;
end;

Es decir solo cuando no está registrado el sistema muestras la pantalla de registro, si está registrado ya no se muestra nunca.

Salud OS

BuRtOn 15-07-2008 18:28:20

Hola Egostar....coloco esa consulta en el formulario frmSerial, por que cuando instale por primera vez la aplicacion es el primero formulario que saldra, y pues ingreso los datos, y le doy en aceptar, si son correctos, me pasara al formulario de seguridad que es el principal.....por eso lo hice...y pues cuando la consulta interna que hago en el formulario principal, me devuelve falso, osea los datos no corrsponden, pues llamo de nuevo el formulario frmSerial...y de nuevo tengo que volver a ingresarle los datos...por eso lo hice asi....


Me gustaria saber que hace el evento OnShow ??? y esa propiedad de Habiltarmenu, nunca la he utilizado....pero segun como me dijiste que lo hiciera se ve muy sencillo...es que me habian dado mucho codigo, y que todo se tenia que hacer en el evento OnCreate....y pues me confundi....Gracias Egostar, jejeje ayer tambien me salvaste la vida....gracias de nuevo...

BuRtOn 15-07-2008 18:31:15

Oh lo olvidaba, Egostar, si tengo que hacer algun contador, o algo asi ??? para analisar si la persona ya esta registrada, y que no vuelva a salir el fmrSerial ????...se me pasaba eso...Gracias....

egostar 15-07-2008 18:45:29

Cita:

Empezado por BuRtOn (Mensaje 300613)
Hola Egostar....coloco esa consulta en el formulario frmSerial, por que cuando instale por primera vez la aplicacion es el primero formulario que saldra, y pues ingreso los datos, y le doy en aceptar, si son correctos, me pasara al formulario de seguridad que es el principal.....por eso lo hice...y pues cuando la consulta interna que hago en el formulario principal, me devuelve falso, osea los datos no corrsponden, pues llamo de nuevo el formulario frmSerial...y de nuevo tengo que volver a ingresarle los datos...por eso lo hice asi....


Me gustaria saber que hace el evento OnShow ??? y esa propiedad de Habiltarmenu, nunca la he utilizado....pero segun como me dijiste que lo hiciera se ve muy sencillo...es que me habian dado mucho codigo, y que todo se tenia que hacer en el evento OnCreate....y pues me confundi....Gracias Egostar, jejeje ayer tambien me salvaste la vida....gracias de nuevo...

:D, bueno, el evento OnShow a diferencia del OnCreate se ejecuta cada vez que muestras la forma, personalmente no me gusta mucho el evento OnCreate porque solo lo hace una vez (cuando es creada la forma) pero hay situaciones que requieren que se hagan cada vez que se muestra una forma (por ejemplo, inicializar alguna variable), pero como te digo es una cuestión meramente personal, tu puedes usar el OnCreate si te causa confusión.

Referente al HabilitaMenu/DesHabilitaMenu :), pues no son propiedades, es una función que se me ocurrio por el ejemplo que te he dado, quise decir que si está registrado sigues con el proceso normal del sistema, si no está registrado, no le permites continuar.

En cuanto a la parte de la validación que estas haciendo, precisamente he puesto

Código Delphi [-]
       if frmSerial.ExistoRegistro then begin
          HabilitaMenu;
       end

Ya que efectivamente, debes validar que lo que se ha ingresado es correcto, si no, debes de actuar en consecuencia, frmSerial.ExistoRegistro también es una variable que se me ocurrio para validar que se ha registrado correctamente el sistema.

Cita:

Empezado por BuRtOn (Mensaje 300614)
Oh lo olvidaba, Egostar, si tengo que hacer algun contador, o algo asi ??? para analisar si la persona ya esta registrada, y que no vuelva a salir el fmrSerial ????...se me pasaba eso...Gracias....

Analiza lo que te he mostrado, no necesitas ningún contador, la lógica que te muestro me parece que te ayuda a resolverlo.

Salud OS.

BuRtOn 15-07-2008 18:54:49

Haaaa ok ok Egostar, al tiro empiezo a programar...osea que con el evento OnShow, se ejecuta el formulario frmSerial cuando cumpla con las condiciones que yo le programe ??...wao...claro es muy facil....lo voy a hacer....el hecho es que como hago, para que solo me lo ejecute la primera vez, ????,osea cuando recien instalo mi aplicacion a otro pc, y ya que despues que ejecute de neuvo mi aplicacion no vuelva a salir el formulario Serial, hasta que no se cumplan las condiciones..??... obviamente entendi que con el evento OnShow se ejecuta el formulario cuando no se cumplan ciertas condiciones....

egostar 15-07-2008 18:57:46

Cita:

Empezado por BuRtOn (Mensaje 300618)
Haaaa ok ok Egostar, al tiro empiezo a programar...osea que con el evento OnShow, se ejecuta el formulario frmSerial cuando cumpla con las condiciones que yo le programe ??...wao...claro es muy facil....lo voy a hacer....el hecho es que como hago, para que solo me lo ejecute la primera vez, ????,osea cuando recien instalo mi aplicacion a otro pc, y ya que despues que ejecute de neuvo mi aplicacion no vuelva a salir el formulario Serial, hasta que no se cumplan las condiciones..??... obviamente entendi que con el evento OnShow se ejecuta el formulario cuando no se cumplan ciertas condiciones....

Hola BuRtOn, precisamente al hacer esto que te comento, solo se mostrará la forma del Serial cuando no coincida o no exista, por eso es que es importante que analices y comprendas la lógica que te muestro.

Salud OS

Edito: Y no, nada tiene que ver el evento OnShow, es igual si lo haces en el evento OnCreate.

AzidRain 15-07-2008 19:45:29

Me permito hacerte algunas observaciones Burton y las baso en experiencia propia y la de muchos otros:

Cuando empezamos a programar y descubrimos que tenemos cierta facilidad para hacerlo, inmediatamente pensamos que podemos comernos al mundo de la programación. Cuando nos contratan para nuestro primer proyecto nos sentimos auténticos Dioses, sobre todo por la forma como nuestros clientes nos ven. Muchas de estas veces vamos desarrollando cosas e imaginando otras tantas. Hace años cuando internet no estaba tan diseminado, era fácil pensar que un rascuachito programa contable era el mejor del mundo y que todas las empresas morirían por tenerlo.

Desgraciadamente seguimos cayendo en el error muchos de nosotros y nos empecinamos en desarrollar el esquema de protección "non plus ultra" puesto que creemos que nuestras aplicaciones no tienen parangón alguno. Craso error. A más de uno nos ha pasado que cuando felices damos el último teclazo a una cierta aplicación, rutina o función especial, al día siguiente San Google nos desilusiona con la triste realidad: ya hay mínimo tres aplicaciones que hacen lo mismo y a veces hasta mejor.

Los esquemas de "protección" está visto que no sirven para nada, puesto que hasta los más sofisticados han sido rotos con la mayor facilidad, y cabe mencionar que estos esquemas fueron desarrollados por equipos muy grandes de programadores, diseñadores e ingenieros con mucha mayor experiencia que nosotros. ¿¿Si ellos no han podido, que nos hace pensar que nosotros sí??

Ante tal panorama, las claves y demás cosas, salen simplemente sobrando ya que al menos en hispanoamérica lo que los clientes buscan es soporte, atención y confianza. Muchas empresas aún pudiéndose piratear tal o cual software prefieren contratar a quien lo hizo por todas las ventajas que esto da.

Por si fuera poco, desarrollar un esquema de protección requiere muchas horas-hombre que obviamente no son gratis por lo que a la larga es un costo inútil que se le carga a tu aplicación ya que en algún momento algún chistoso encontrará como burlarla, y eso solo si tu aplicación de verdad vale la pena.

Ante esto, no veo para que invertir tiempo valioso en eso pudiendo hacerlo en mayor promoción para tu producto, mayor personalización y adecuación a la solución de problemas de tus clientes y mayor investigación sobre técnicas avanzadas.

Por último, un esquema muy simple pero a la vez efectivo: personalizar hasta el copete cuanta cosa se pueda en cada programa de manera que aunque se lo puedan piratear por todos lados salgan datos del cliente original. Un ejemplo: las facturas, si en una factura imprimes si o si, el nombre del cliente, en automático no le sirve a cualquier otro.
Dirás, "pero es que quiero venderle a miles en todo e mundo"...momento, ¿Cuantos ya vendiste en tu ciudad?, ¿En tu estado (departamento)?, ¿En tu país?...

Sin ánimo de ofender y si de que no caigas en lo mismo que muchas a veces caemos.


La franja horaria es GMT +2. Ahora son las 22:58:30.

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