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 14-02-2004
soyhugo soyhugo is offline
Miembro
 
Registrado: ene 2004
Posts: 66
Poder: 21
soyhugo Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 14-02-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 14-02-2004
soyhugo soyhugo is offline
Miembro
 
Registrado: ene 2004
Posts: 66
Poder: 21
soyhugo Va por buen camino
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?
Responder Con Cita
  #4  
Antiguo 14-02-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #5  
Antiguo 16-02-2004
soyhugo soyhugo is offline
Miembro
 
Registrado: ene 2004
Posts: 66
Poder: 21
soyhugo Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 16-02-2004
soyhugo soyhugo is offline
Miembro
 
Registrado: ene 2004
Posts: 66
Poder: 21
soyhugo Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 16-02-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #8  
Antiguo 16-02-2004
KayserSoze KayserSoze is offline
Miembro
 
Registrado: ene 2004
Posts: 33
Poder: 0
KayserSoze Va por buen camino
y porque el form principal es de la la clave?
Responder Con Cita
  #9  
Antiguo 16-02-2004
soyhugo soyhugo is offline
Miembro
 
Registrado: ene 2004
Posts: 66
Poder: 21
soyhugo Va por buen camino
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?
Responder Con Cita
  #10  
Antiguo 16-02-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
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


La franja horaria es GMT +2. Ahora son las 23:33:46.


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