FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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.
|
#2
|
||||
|
||||
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; Código:
Action:=CaFree; 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; Un Saludo.
__________________
Guía de Estilo de los Foros Cita:
|
#3
|
|||
|
|||
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? |
#4
|
||||
|
||||
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. 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 |
#5
|
|||
|
|||
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.
|
#6
|
|||
|
|||
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. |
#7
|
||||
|
||||
Cita:
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 |
#8
|
|||
|
|||
y porque el form principal es de la la clave?
|
#9
|
|||
|
|||
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? |
#10
|
||||
|
||||
Cita:
// Saludos |
|
|
|