Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-02-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Aplicación MDI con LOGIN ( problema )

Buenas .. tengo que hacer un sistema de facturación y lo tenía bién y sin problemas hasta que decidí hacer la aplicación en MDI..

Bueno mi problema es que tengo esto antes de mostrar mi formPricipal.

1.- Un FormLoader -> que es el que se crea primero .. este tiene un ProgresBar y un timer algo para darle mas alegancia al programa además cumple la función de mostrar una imagén y el ProgresBar mientras se realiza la conexión con la Base de datos en MySQL .. luego de eso viene.

2.- un FormLogin -> este aparece luego de que termina de cargar el ProgresBar y es un sistema de login que da paso al FormPricipal..

3.- el FormPrincipal -> este es el que contiene todo el menú y el que contendrá TODOS los demás form de la aplicación..

Bueno antes lo tenía todo perfecto.. pero ahora con los MDI me da problemas.

Ahora lo que hice fué esto: hacer mi FormPrincipal la ventana "madre" y las demás que se abrirán en ella serán las "hijas" pero al momento de abrir una fentana "hija" me da este error Cannot create form. No MDI forms are currently active.

Por lo que leí en este foro que otros usuarios tuvieron este problema es que no se puede crear la ventana hija por que el Form que se crea primero .. en mi caso sería el FormLoader no tiene la propiedad "FormStyle" en : fsMDIform y es algo lógico que me de ese error... ahora el problema esta en que por mas que leí no logré entender como resolver este problema..
osea tener unos 2 forms antes del "fsMDIform"

Alguna idea ?? mas bién como podría hacer eso... ???
y si, ya miré el ejemplo de dec pero no logré entenderlo por que mis conocimientos son bajos en delphi

Bueno espero alguna respuesta con la manera de hacer lo que quiero de la forma "correcta"

saludos y gracias por leer semejante post xDD



PD cualquier duda me lo preguntan que estaré todo el día conectado xD
Responder Con Cita
  #2  
Antiguo 26-02-2007
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Bueno, hace tiempo hice una aplicación exactamente igual (en la estructura). El funcionamiento era el siguiente:

1º un FormLoader (yo los llamo SplashScreen), con su imagen y su barra de progreso (aunque eso del Timer pienso que es una chapucilla, te recomiendo que busques en el foro algo sobre las SplashScreen, que de eso ya se ha hablado mucho).
2º en segundo lugar se creaba el FormPrincipal, que contenía a todas las hijas. Pero con la propiedad Visible en False.
3º En el evento OnCreate del FormPrincipal hago la llamada a la ventana Login.
4º una vez el login es correcto se cierra la ventana login (que es Modal) y pongo la Visible del principal en True.

Eso además me ayudó a hacer cambios de usuario. Me explico: tras hacer el primer login el programa lo utilizas, pero si querías cambiar de usuario pulsabas el correspondiente menú, volvía a poner el visible en false y llamaba otra vez a la ventana Login de forma Modal. Pero no se te ocurra ponerle un botón "cancelar", sino uno "Cerrar programa".

Espero que te sirva de ayuda. Cuando lo hice tampoco tenía muchos conocimientos de programación.

Si no te aclaras, dílo, y pondré aquí el código necesario (me pondré a buscarlo).

Saludos a todo el foro
Responder Con Cita
  #3  
Antiguo 27-02-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Hola... gracias por tu respuesta tan rápida, pero!! tu aplicación era MDI ??
por que no me dijiste que cual era el form que se creaba primero.. tampoco cual era el form madre o padre creo xDD bueno.. ya havía pensado en poner el formPrincipal en INVISIBLE pero quisiera que me muestres el código para poder darme una mejor idea ya que no puedo avanzar con la aplicación por que no esta lista esta parte..

Bueno espero me respondas.. y me aclares la duda..

saludos y gracias

PD me gustaría mucho que me envies el código a koko [at] yashira.org o lowlifebob [at] gmail.com
por que creo que aquí no se puede adjuntar mucho

saludos


PD el form de splashScreem que dices era ventana padre ?? hija ?? el sistema de login lo mismo ??
no logro entendér eso.. por que creo que no sep uede crear una ventana hija si el PRIMER form en crearse es normal..
mejor mándame el ejemplo xD

Última edición por BlackDaemon fecha: 27-02-2007 a las 03:01:41.
Responder Con Cita
  #4  
Antiguo 27-02-2007
[pepon386] pepon386 is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Valencia
Posts: 68
Poder: 20
pepon386 Va por buen camino
Te adjunto un pequeño ejemplo de código fuente del proyecto:

Código Delphi [-]
  Application.Initialize;
  FSplashForm := TFSplashForm.Create(Application);
  FSplashForm.Show;
  // DMMain --> TDataModule que contiene la conexión a la base de datos
  Application.CreateForm(TDMMain, DMMain);
  // DMMain.Login --> Función que muestra una ventana para validar usuario
  // y contraseña
  if DMMain.Login then
  begin
    Application.CreateForm(TFMain, FMain);
  end;
  FSplashForm.Hide;
  FSplashForm.Free;
  Application.Run;
Responder Con Cita
  #5  
Antiguo 27-02-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
pepon386 lo siento pero no entendí nada tu ejemplo...
por que no dices que forms es el padre o cual los hijos.. además ahí por lo que veo no creas el form principal que contendrá a todos los hijos.. bueno soy nuevo en esto y tal véz por eso no entendí, de todas formas gracias

saludos y a ver si me ayudan que la verdad intento de todos modos pero nada... no puedo :S
Responder Con Cita
  #6  
Antiguo 27-02-2007
Alexis De la Cr Alexis De la Cr is offline
Miembro
 
Registrado: may 2006
Ubicación: Puebla
Posts: 124
Poder: 18
Alexis De la Cr Va por buen camino
Yo tengo una Aplicacion MDI con Login y me funciona Pefectamente.. Mis conocimientos son muy basicos pero bueno intentare aportarte algo...

tengo un form principal MDI madre y un monton de MDI Hijas... ahora bien... el form del login no es MDI, es del tipo normal, y lo muestro a traves del evento onshow del form principal.. No se si sea exactamente lo que andas buscando, pero creo que debe seguir el mismo procedimiento.

Saludos
Responder Con Cita
  #7  
Antiguo 27-02-2007
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Perdón si te causé confusión. El frmMain (FormPrincipal) es el MDI que contiene a las hijas, y no tiene nada que ver con el FLogin.


Aquí está el código. Es del archivo "frmMain.pas", que es donde se crea la SplashScreen (no en el DPR, como te había dicho; eso lo hago en otro programa), la ventana Login y se inicia el programa.

Código Delphi [-]
unit frmMain;
...
var
  FFondo: TFFondo;
  Usuario: String;
 
implementation
...
procedure TfrmMain.FormCreate(Sender: TObject);
begin
Usuario:='';
FSplash:=TFSplash.Create(Self);
FSplash.Show;
//EAccion es un TLabel que indica qué está haciendo el programa
//Barra es un TGauge que indica el porcentaje de la carga
FSplash.EAccion.Caption:='Inicializando...';
...
FSplash.Barra.Progress:=FSplash.barra.Progress+1;
FSplash.Repaint;
...
FSplash.EAccion.Caption:='Autorizando...';
FSplash.Barra.Progress:=FSplash.barra.Progress+1;
FSplash.Repaint;
FLogin:=TFLogin.Create(Self);
//Al pulsar el boton Aceptar hace las comprobaciones, y si usuario y contraseña
//son correctos asigna a ModalResult mrOk, sino sale un mensaje. Hay otro botón, que
//sirve para salir del programa
If FLogin.ShowModal=mrOk then
  begin
  Usuario:=FLogin.CUsuario.Text;
  ...
  end;
FLogin.Free;
FSplash.EAccion.Caption:='Leyendo datos...';
FSplash.Barra.Progress:=FSplash.Barra.Progress+1;
FSplash.Repaint;
...
FSplash.Free;
...
end;
...
Y una vez iniciado el programa, para cambiar de usuario:
Código Delphi [-]
Procedure TfrmMain.mCambiarUsuario(Sender: TObject);
begin
... //Guardar todos los datos
Visible:=False;
FLogin:=TFLogin.Create(Self);
FLogin.CUsuario.Text:=Usuario; //Un toque de elegancia, recuerda el último usuario
Usuario:=''; //Por si las moscas
FLogin.ShowModal;
If FLogin.ModalResult:=mrOk
  begin
  Usuario:=FLogin.CUsuario.Text;
  ...
  end;
end;


Espero que te sea de ayuda.

Salu2


P.D:
Cita:
Empezado por BlackDaemon
PD me gustaría mucho que me envies el código
Aquí preferimos poner el código para que todo el mundo lo vea. Además sería una tontería enviarte todo el código de mi programa, con el ejemplo que aquí te he puesto hay suficiente (pues en el proceso de carga hace muchísimas cosas).

Última edición por ixMike fecha: 27-02-2007 a las 21:27:32.
Responder Con Cita
  #8  
Antiguo 27-02-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Estaís hablando de MDI pero no soys muy específicos. Aclaremos las cosas, hablemos de la propiedad FormStyle de cada uno.


Hay que comentar un efecto que hace usar una filosofía u otra:

1- Quiero mostrar la ventana de login, y si no valida al usuario, que se salga del programa, si lo valida correctamente, después y solo después, se abra la forma principal:

Forma de hacerlo: (la forma de pepon386) Project -> View Source y modificarlo según gustes, el orden de creación y visualización será este:
El SplashScreen con barra de progreso, fsNormal
La ventana de login fsNormal
La ventana principal fsMDIFORM
Las ventanas hijas fsMdiChild

2- Quiero que primero se abra la ventana mdiform (la principal y madre) y después... dentro de esa ventana, que se muestre la de login.
Esto implica cambiar el orden de creación de las ventanas y su estilo:

La forma de hacerlo de ixMike:

El SplashScreen con barra de progreso, fsNormal
La ventana principal fsMDIFORM
La ventana de login fsMdiChild
Las ventanas hijas fsMdiChild

Personalmente me gusta más la forma 1, porque si el usuario no se valida, directamente cierras la aplicación y no se demora en crear más ventanas.

Normalmente las SplashScreen se muestran mientras se está creando las demás ventanas, ponerle un Timer para ver bonita una imagen y hacer esperar al usuario no me gusta nada (opinión personal, queda claro ¿no?), sobre todo si se trata de un programa serio (facturación, stock, etc...) Si es un Freeware... pues vale, que se fastidie viendo la imagen 3 segundos .

La ventana principal suele tener mucho código asociado, dependiendo del usuario que se conecte mostrar u ocultar menús, preparar la conexión con la base de datos, etc. Lo que quiero decir es que quizás sea la ventana que más tiempo tarde en crearse, por tanto, sería lógico mostrar el SplashScreen antes de empezar a crear dicha ventana y no hacerlo al revés.

De todas formas y como ya he dicho es mi opinión, y por supuesto el foro está para eso, aportemos todos nuestras ideas y que después cada uno use la que le guste más, que no quiere decir que sea peor o mejor, es simplemente su estilo propio .

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #9  
Antiguo 27-02-2007
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Cita:
Empezado por Lepe
La forma de hacerlo de ixMike:

El SplashScreen con barra de progreso, fsNormal
La ventana principal fsMDIFORM
La ventana de login fsMdiChild
Las ventanas hijas fsMdiChild
Saludos
Lo siento, Lepe, te has equivocado, mi forma es:
El SplashScreen con barra de progreso, fsNormal
La ventana principal fsMDIFORM
La ventana de login fsNormal
Las ventanas hijas fsMdiChild

Porque si no la ventana login no podría ser llamada de forma Modal (que yo sepa)

Cita:
Empezado por Lepe
La ventana principal suele tener mucho código asociado, dependiendo del usuario que se conecte mostrar u ocultar menús, preparar la conexión con la base de datos, etc. Lo que quiero decir es que quizás sea la ventana que más tiempo tarde en crearse, por tanto, sería lógico mostrar el SplashScreen antes de empezar a crear dicha ventana y no hacerlo al revés.
Tampoco es cierto. Si lo primero que hace la ventana principal es crear la Splash (como es el caso de mi ejemplo) primero se muestra la Splash y después se ejecuta todo el código asociado (comprobaciones, cargar bases de datos y archivos...) mientras el proceso se muestra en la Splash


En lo que sí tenías razón era en que no hemos sido muy específicos.

En mi ejemplo, las ventanas hijas se crean tras hacer un Login correcto (la demora es mínima). Y si se quiere cambiar de usuario, antes de mostrar otra vez el Login se cierran todas las ventanas hijas.
Responder Con Cita
  #10  
Antiguo 27-02-2007
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
El funcionamiento es este:

-Se crea la FormPrincipal (MDIForm) pero antes de que se muestre crea la SplasScreen (fsNormal) que sí se muestra.
-Cuando la Splash ya ha acabado (solo queda el paso de iniciar usuario) entonces se muestra la ventana Login (Modal, fsNormal), antes de que se muestre la FormPrincipal.
-Si el Login es correcto, se cierran la Splash y la Login, y se muestra la principal; si no es correcto, tan solo te avisa de que no es correcto con un ShowMessage y puedes seguir intentándolo. Si pulsas el botón "Salir del programa" se cierra la Login, la Splash (si está abierta) y (tras un parpadeo producido porque se muestra la FormPrincipal) el programa se cierra.

Si no queda claro (aún) colgaré un proyecto de prueba.

Salu2
Responder Con Cita
  #11  
Antiguo 28-02-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Cita:
Empezado por ixMike
Porque si no la ventana login no podría ser llamada de forma Modal (que yo sepa)
Cierto, muy cierto. Además hay otro error, si la ventana de login es mdiChild, se podría acceder al menú del MDIFORM, así como a las posibles barras de herramientas, y deshabilitarlo todo es un engorro, es mejor como has dicho.

Cita:
Empezado por ixMike
Tampoco es cierto. Si lo primero que hace la ventana principal es crear la Splash (como es el caso de mi ejemplo) primero se muestra la Splash y después se ejecuta todo el código asociado (comprobaciones, cargar bases de datos y archivos...) mientras el proceso se muestra en la Splash
Ok. En realidad el evento Oncreate ocurre después que la ventana se haya creado al completo, menús, actionList, etc... aunque... bien pensado... estoy poniendo pegas simplemente por ponerlas .

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #12  
Antiguo 28-02-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Bueno como dice Lepe nunca hablaron de cuales form con hijas y cuales padres.. y es lo que yo necesitaba :S
con el post de Lepe me aclaró un poco el problema que tengo y como el dice la 1ra opción me gusta mas y la veo mejor.. perooooo!! Hay un problema.. que ya intenté hacerlo así y tampoco pude, osea modificar el fichero del proyecto, bueno pero lo que tengo en este monento es esto.
( el orden que pongo es el orden en que se crean los form )

1.- FrmSplash --> fsNormal
2.- DataModule --> contiene los componetes para conectarse a la Base de Datos y hacer los querys para el login
3.- FrmLogin --> fsNormal
4.- FrmPrincipal --> fsMDIform
5.- FrmHija --> fsMDIChild

Bueno ahora solo me queda modificar mi PROYECTO pero no se como .. lo intenté de várias formas como indican aquí en este foro pero con malos resultados.. y así decidí mantenerlo como esta ahora para que me puedan dar mejores ideas..

Este es mi Proyecto.-


Código Delphi [-]
program ConStock;

uses
  Forms,
  Splash in 'Splash.pas' {FrmSplash},
  DataModule in 'DataModule.pas' {DM: TDataModule},
  Login in 'Login.pas' {FrmLogin},
  Principal in 'Principal.pas' {FrmPrincipal},
  Hija in 'Hija.pas' {FrmHija};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TFrmSplash, FrmSplash);
  Application.CreateForm(TDM, DM);
  Application.CreateForm(TFrmLogin, FrmLogin);
  Application.CreateForm(TFrmPrincipal, FrmPrincipal);
  Application.Run;
end.

BUeno ahora solo necesito saber como modificar mi PROYECTO y luego que codigo poner en cada evento del Form necesario
ahhh y mi FrmLogin tiene 2 botones.. uno ACEPTAR que valida el user y pass con la Base de Datos y el otro CERRAR que cierra la aplicación

saludos y gracias por las ayudas

Última edición por BlackDaemon fecha: 28-02-2007 a las 03:45:02.
Responder Con Cita
  #13  
Antiguo 28-02-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Aqui se trata el mismo tema.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #14  
Antiguo 02-03-2007
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Bueno, aquí va el programa de prueba (no tiene DataModule, pero si lo tuviera, pues después del Splash y antes del Login).
Archivos Adjuntos
Tipo de Archivo: zip MDIlogin.zip (5,7 KB, 55 visitas)
Responder Con Cita
  #15  
Antiguo 03-03-2007
Avatar de Wonni
Wonni Wonni is offline
Miembro
 
Registrado: abr 2006
Posts: 261
Poder: 18
Wonni Va por buen camino
ixMike, se te escapo una linea de codigo sin la cual el programa desaparece a lo David Copperfield . Se te olvido hacer Visible := TRUE al cambiar de usuario.

Aqui está corregido:
Archivos Adjuntos
Tipo de Archivo: zip MDIlogin.zip (6,1 KB, 89 visitas)
Responder Con Cita
  #16  
Antiguo 07-03-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Bueno gracias a todos los que respondieron
a Lepe que siempre me aclara las dúdas y a ixMike por adjuntar su ejemplo que a mas de uno le servirá de mucha ayuda y al otro amigo por corregirlo

saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
problema con el icono de la aplicacion Choclito Varios 3 29-07-2006 21:22:09
Problema con Aplicacion MDI Thales OOP 7 19-08-2005 16:31:07
Problema con mi aplicación JerS Varios 2 18-07-2005 17:33:51
Aplicacion Antes Del Login De Windows omardelahoz Varios 2 22-06-2004 17:29:48
Problema con aplicacion MDI wallesis OOP 5 03-01-2004 12:17:28


La franja horaria es GMT +2. Ahora son las 23:06:45.


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