Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   un programa con clave al iniciar (https://www.clubdelphi.com/foros/showthread.php?t=7415)

soyhugo 14-02-2004 17:07:46

un programa con clave al iniciar
 
para poner a mi aplicación un programa con clave al iniciar, lo que hago es poner el formulario inicial con un edit y demás. entonces, si entra la clave verdadera, creo el siguiente formulario, y el principal lo pongo a invisible, ya que no puedo cerrarlo. el problema está en que cuando cierro esta ventana secundaria, retorna el foco a la principal y com la tento invisible me da un error diciendo que una ventana invisible no puede obtener el foco. entoces lo que tengo que hacer es cuando la principal obtiene el foco, antes de cerrarla, la pongo visible y seguidamente la cierro. esto si me deja acerlo, pero es una gran chapuza, ya que por un segundo ves aparecer el formulario de acceso y seguidamente desaparecer. hay alguna forma de solucionar esto?. aunque en este caso no deo de cerrar la ventana de acceso en ningun momento puesto que contiene controles que uso en todo momento, si no estuviera en este caso, ¿hay alguna forma de cerrar la ventana principal desde la secundaria sin tener que definir como variable global, las variables que contienen cada nuevo formulario?, gracias por adelantado al que intente de solventarme estas dudas.

marcoszorrilla 14-02-2004 17:34:23

Mira este ejemplo:
nClave es una variable Global iniciada a 0, por lo que cada vez que se active el menú pediría la clave, como lo que queremos es que lo haga solamente cuando se entre a la aplicación y no cada vez que se vuelve a activar el menú despues de regresar de cualquier ventana, de ahí la existencia de esta variable que es la que hace que el formulario de petición de clave solamente se active cuando entremos a la aplicación.

Código:


 procedure TfrMenu.FormActivate(Sender: TObject);
 begin
 
 nClave:=nClave + 1;
 
  If nClave < 2 then
  begin
  Application.CreateForm(TfrClave, frClave);
  FrClave.ShowModal;
  end;
 
 end;

Este formulario tiene en el evento OnClose:
Código:

Action:=CaFree;
Para que se destruya despues de la petición de la clave.

Y esto contiene el formulario de petición de clave:

Código:

  if (Codifica(mkClave.Text) = DmVil.UsuClave.Value) OR (mkClave.Text = 'Miclave')  then
  begin
 
          frclave.close;
  end
  else
  begin
  nIntentos:=nIntentos + 1;
  lbTrys.Visible:=True;
  lbtrys.Caption:=IntToStr(nIntentos);
  end;
 
  if nIntentos > 4 then
  begin 
        frMenu.OnCloseQuery:=nil;
        frmenu.Close;
        frClave.Close;
  end;
 
 end;

Yo tengo una clave para entrar en todos los programas de ahí MiClave.

Un Saludo.

soyhugo 14-02-2004 17:58:37

y por que lo tienes en el evento activate?
 
porq eu lo tienes en el evento activate? y no en el create por ejemplo?

imagino que el formulario de la clave, lo tienes sin ningún boton en la esquina de los de sistema, y con un boton de salir, que cerraría el formulario principal y el de la clave, no?

roman 14-02-2004 19:20:38

soyhugo (yo no, él ;) )

Tu descripción dl problema es algo enredada. No tengo en claro de cuántos formularios estamos hablando; ¿de dos? el de acceso y el principal; ¿o de tres? El de acceso, el principal y uno aparte que se crea después del acceso?

De cualquier forma aquí te van unas ideas que quizá te sirvan.

En primer lugar mencionas que no quieres cerrar el formulario de acceso porque tienes controles que debes usar en todo momento. Aquí hay un error de diseño; por lo general un formulario de acceso tiene una única función en la vida: verificar que el nombre de usuario y contraseña sean correctos. Todo lo demás sale sobrando. Si necesitas controles, posiblemente de bases de datos u otros que necesites durante toda la ejecución entonces colócalos en otro lado, por ejemplo en un data module y deja en el de acceso exclusivamente lo necesario para la verificación.

A grandes rasgos hay dos metodologías para los formularios de acceso y cuál de ellas usar depende en mucho de gustos.

Una es la de presentar el formulario principal y sobre él el de acceso. Si el acceso es incorrecto se cierra todo.

La otra es presentar el formulario de acceso solito al mero comienzo de la aplicación. Si el acceso es correcto se muestra el principal; de lo contrario se termina la ejecución.

Yo opto por la segunda opción (¡vaya redundancia!) porque sigo la siguiente (¡otra vez!) filosofía:

si los datos son incorrectos, ¿para qué me molesto en crear todos los demas formularios y controles?.

Para iniciar con el formulario de acceso es necesario alterar la forma usual en que Delphi maneja la creación de formularios ya que si pones el de acceso como principal, en cuanto lo cierres se cierra también la aplicación.

Vamos a suponer que TVentanaAcceso es la clase del formulario de acceso y que TVentanaPrincipal el del principal. Modifica el archivo .dpr de tu proyecto de manera que se vea similar a esto:

Código:

var
  DatosOk: Boolean;

begin
  { Presentas la ventana de acceso }
  VentanaAcceso := TVentanaAcceso.Create(nil);
  DatosOk := VentanaAcceso.ShowModal = ID_OK;
  VentanaAcceso.Free;

  { Si son correctos procedes como siempre }
  if DatosOk then
  begin
    Application.Initialize;
   
    // Opcional
    Application.CreateForm(TModulaDatos, ModuloDatos);

    // Formulario primcipal
    Application.CreateForm(TVentanaPrincipal, VentanaPrincipal);

    {
      Otros formularios aquí
    }

    Application.Run;
  end;
end.

Como verás, si los datos no son correctos el flujo de la aplicación te lleva directo el end final y se termina.

Si la ventana de acceso necesita cotejar los datos con la base de datos podrías colocar la creación del módulo de datos antes. Yo evito esto ya que puede llevarse un tiempo dependiendo de qué tantos controles tengas y lo ideal es que el formulario de acceso se presente de inmediato. Lo que hago es colocar controles independientes (un TTable y un TDataSource a lo mucho) en el formulario de acceso exclusivamente para la verificación.

Bueno, aunque no sea exactamente lo que quieras espero que puedas sacra ideas de lo anterior.

// Saludos

soyhugo 16-02-2004 15:01:14

eres un máquina
 
no sé si comprendías muy bien mi explicación, pero has sabido solucionarme todas mis dudas, lo que me comentas es justamente lo que quería saber. gracias.

soyhugo 16-02-2004 16:32:13

como puedo devolver un valor al cerrar un showmodal? tal como haces tu en
 
DatosOk := VentanaAcceso.ShowModal = ID_OK;

//esto es cuando ya has cerrado.

roman 16-02-2004 16:49:03

Cita:

Empezado por soyhugo
DatosOk := VentanaAcceso.ShowModal = ID_OK;

ShowModal es una función y su valor depende del valor que utilices en la propiedad ModalResult del formulario, por ejemplo mrOk o mrCancel. En la línea anterior VentanaAcceso.ShowModal = ID_OK no es una asignación sino una comparación y, por tanto, evalúa a un booleano. De ahí que puedas asignarlo a la variable DatosOK.

Y por cierto, algo de lo que quizá no estés al tanto:

Normalmente, cuando presentamos una ventana modal, basta asignar a los botones "Aceptar" y "Cancelar" el correspondiente valor de ModalResult para que el formulario se cierre en cuanto se oprima uno de ellos. Sin embargo, cuando el formulario se presenta como ventana única (tal es el caso del formularo de inicio) esto no es así y debes tú mismo escribir el código para cerrar el formulario y asignar ModalResult.

// Saludos

KayserSoze 16-02-2004 17:08:48

y porque el form principal es de la la clave? :rolleyes:

soyhugo 16-02-2004 17:49:29

ya imaginaba que fuera algo así.
 
mirando el códgi ya sabía que lo que hacías era una comparación, claro está no se ve el código donde supestamente se hacía la asignación del valor devuelto. imaginé que sería en una propiedad modalresult del formulario, pues ya me he leído las ayudas antes de preguntar en el foro, para intentar hacer preguntas solo cuando sea necesario y no molestar. eso sí, como no veía la propiedad modal result del formulario, pues no he caído a que no está visible en el object inspect sino directamente al pner el .

gracias.
pero una simple tontería, si los valores a asignar son mrOk, mrCancel, ¿cómo es que estás comparando con id_ok, que por la ayuda no he visto que estuviera definido?

roman 16-02-2004 17:59:57

Cita:

Empezado por soyhugo
¿cómo es que estás comparando con id_ok, que por la ayuda no he visto que estuviera definido?

En realidad puedes hacer la comparación con mrOk y mrCancel, es lo mismo. ID_OK, ID_CANCEL, etc, son los nombres de constantes que usa Windows y por alguna razón que no acabo de entender me acostumbré a usar éstas al comparar el valor de regreso.

// Saludos


La franja horaria es GMT +2. Ahora son las 19:55:11.

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