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 02-08-2006
grone35 grone35 is offline
Miembro
 
Registrado: jul 2006
Posts: 16
Poder: 0
grone35 Va por buen camino
Smile Aplicacion Multiformulario

Que tal Gente!

Lo que quiero hacer es una aplicacion en la cual yo pueda tener cualquier cantidad de formularios pero que no se me salgan de la ventana principal y ademas poder ordenar los formularios en cascada horizontal o verticalmente dentro de la misma ventana principal.

Espero se entienda lo que necesito!! Gracias al que me pueda colaborar.
Responder Con Cita
  #2  
Antiguo 02-08-2006
Sudamericano Sudamericano is offline
Miembro
 
Registrado: feb 2004
Posts: 41
Poder: 0
Sudamericano Va por buen camino
lo que tu necesitas es una aplicacion "MDI" para eso solo debes tener un formulario principal que sera el Frame al cual debes cambiar la propiedad "FormStyle = fsMDIForm" y a las ventanas que se crearan dentro de este marco tienes que asignarles la propiedad "FormStyle= fsMDIchild" prueba con eso hay muchas cosas mas que debes tomar en cuenta para este tipo de aplicacion,cualquier duda, no temas en preguntar.
saludos
Responder Con Cita
  #3  
Antiguo 02-08-2006
grone35 grone35 is offline
Miembro
 
Registrado: jul 2006
Posts: 16
Poder: 0
grone35 Va por buen camino
Smile Aplicacion MDI

Gracias Sudamericano, voy a intentar lo que propones y cualquier cosa te estoy comentando.
Responder Con Cita
  #4  
Antiguo 02-08-2006
grone35 grone35 is offline
Miembro
 
Registrado: jul 2006
Posts: 16
Poder: 0
grone35 Va por buen camino
Smile

Ya hice lo que sudamericano me aconsejo y realmente era lo que necesitaba. Pero encontre algunos inconvenientes.

Ya tengo los formularios secundarios (fsMDIForm) dentro del principal (fsMDIForm) pero quisiera saber como ocultar estos formularios y con que codigo o componente hago ordenamiento de ellos dentro del formulario principal (en cascada, horizontal o verticalmente).

Muchas gracias y espero que este tema sea de utilidad para todos.
Responder Con Cita
  #5  
Antiguo 02-08-2006
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
Los formularios MdiChild no pueden ocultarse. Normalmente debes destruirlos si no quieres que aparezcan y (re-)crearlos cuando vuelvas a necesitarlos.

El formulario padre tiene los métodos Cascade y Tile para poner las ventanas en cascada o mosaico y la propiedad TileMode del formulario padre controla si el mosaico es horizontal o vertical.

// Saludos
Responder Con Cita
  #6  
Antiguo 02-08-2006
Sick boy Sick boy is offline
Miembro
 
Registrado: may 2003
Ubicación: Cantabria
Posts: 245
Poder: 21
Sick boy Va por buen camino
Un pequeño apunte a lo dicho por Roman.
Los formularios hijos pueden minimizarse.
También puedes cargar un formulario maximizado "encima" del formulario que quieres ocultar, sin tener que destruir el formulario. Cuando lo necesites de nuevo, utiliza show para mostrarlo.

No se si es el efecto que buscas, si no lo es intenta explicar un poco más lo que quieres hacer.

saludos
Responder Con Cita
  #7  
Antiguo 02-08-2006
Sudamericano Sudamericano is offline
Miembro
 
Registrado: feb 2004
Posts: 41
Poder: 0
Sudamericano Va por buen camino
ok, te debes haber percatado que al ejecutar el proyecto se crean y se muestran todos los formularios, esto no es precisamente lo que uno espera, bueno, hay viene la solucion :
* lo primero que debes hace es ir al menu project/options; se cargara una ventana anda a la pestaña "Form" en el listview de la izquierda donde dice "auto-create form" quita todos los formularios menos el Principal

* segundo paso para pode rmostrar (crear) un formulario hijo debes poner el codigo siguiente :


Código Delphi [-]
procedure TFrmKey.ShowFrmCliente;
begin
if not Assigned( FrmCliente) then
FrmCliente:=TFrmCliente.Create(Application);
FrmCliente.ShowModal;
end;









Explicacion :

if not Assigned( FrmCliente) then = verificas que el formulario no este creado
"FrmCliente" = nombre del formulario
"Aplication" = propietario del formulario hijo
FrmCliente.ShowModal = Muestra el formulario


Ahora en el evento "Close" del formulario "FrmCliente" pones lo siguiente


Código Delphi [-]
procedure TFrmCliente.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := Cafree;
FrmCliente := nil;
end;

prueba estos pasos primero, cuando ya te funcione, avanzamos con las opciones de cascada, etc.. otras cosa que version de DELPHI USAS ?? saludos
Responder Con Cita
  #8  
Antiguo 02-08-2006
mierda mierda is offline
Miembro
 
Registrado: may 2006
Posts: 129
Poder: 18
mierda Va por buen camino
Una preguntilla

Hola, estaba probando con este tipo de ventanas, y resulta que si pongo un form como padre con un boton , y le digo que me cree otro form, sigo viendo el boton por debajo del form que acabo de crear, es normal esto?!

Un saludo y gracias.
Responder Con Cita
  #9  
Antiguo 02-08-2006
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
Normal, no lo sé. Vamos, supngo que sí pero el efecto es bastante feo. Realmente en las aplicaciones MDI lo único que "debería" haber en el área cliente del formulario padre son ventanas hijas y no controles propios. Nótese que digo área cliente, de manera que se pueden colocar paneles u otros controles alineados a uno de los extremos del formulario. Lo que sobra es el área cliente.

// Saludos
Responder Con Cita
  #10  
Antiguo 02-08-2006
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 Sudamericano
Código Delphi [-]
procedure TFrmKey.ShowFrmCliente;
begin
if not Assigned( FrmCliente) then
FrmCliente:=TFrmCliente.Create(Application);
FrmCliente.ShowModal;
end;
Esto es algo raro ¿no? Un formulario mdi hijo, al no poderse ocultar se muestra apenas se crea, de manera que no es necesario mostrarlo explícitamente. De hecho, si se llama a ShowModal se obtiene el error:

"Cannot make a visible window modal"

Pero aún suponiendo que se pueda, queda medio extraño una ventana hija modal ¿qué no?

// Saludos
Responder Con Cita
  #11  
Antiguo 02-08-2006
Sudamericano Sudamericano is offline
Miembro
 
Registrado: feb 2004
Posts: 41
Poder: 0
Sudamericano Va por buen camino
ok si es un error, solo se debe poner lo siguiente :
Código Delphi [-]
procedure TFrmKey.ShowFrmCliente;
begin
  if not  Assigned(FrmCliente) then
  FrmCliente:=TFrmCliente.Create(Application);
  FrmCliente.Show;
end;
;

lo hize de memoria, por eso me equivoque, sorry
Responder Con Cita
  #12  
Antiguo 02-08-2006
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
Esteee..., es que el FrmCliente.Show también sobra (no hace daño pero no es necesario). Y no pidas disculpas que no era regaño Si así lo pareció pido disculpas.

// Saludos
Responder Con Cita
  #13  
Antiguo 02-08-2006
Sudamericano Sudamericano is offline
Miembro
 
Registrado: feb 2004
Posts: 41
Poder: 0
Sudamericano Va por buen camino
te puedo asegurar que la linea no esta de mas, toma en cuenta que estoy creando y destruyendo los Form segun lo demanda,
Responder Con Cita
  #14  
Antiguo 02-08-2006
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
Haz la prueba. Yo te aseguro que sí está de más. En formularios normales sí que es necesaria pero los formularios MdiChild se hacen automáticamente visibles apenas se crean.

// Saludos
Responder Con Cita
  #15  
Antiguo 02-08-2006
grone35 grone35 is offline
Miembro
 
Registrado: jul 2006
Posts: 16
Poder: 0
grone35 Va por buen camino
Smile

Gracias Sudamericano, creo que vamos avanzando positivamente con este tema! Tambien gracias a roman por sus aportes y si tiene razon en cuanto al aporte sobre la aparicion del formulario tipo modal

(FrmCliente.ShowModal;)

pues presento el error que el menciona, pero pues si suprimimos esta linea el codigo funciona.

Continuando con el tema mientras aplicaba evento "Close" del formulario "FrmCliente" tuve el problema que no podia volver a abrir el formulario. De casualidad se me ocurrio adicionar una linea en el codigo de creacion del formulario hijo de esta manera :


procedure TFrmKey.ShowFrmCliente;
begin
FrmCliente := nil;
if not Assigned( FrmCliente) then
FrmCliente:=TFrmCliente.Create(Application);
FrmCliente.ShowModal;
end;


Y con esto pude solucionar el invonveniente, pero no se que problemas pueda traer y pues quiesiera saber que significa el "nil".

Sudamericano, yo estoy usando Delphi 7 y pues creo que podemos ir avanzando en lo del ordenamiento de los formularios secundarios (cascada,..)


Muchas Gracias!
Responder Con Cita
  #16  
Antiguo 02-08-2006
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
Además de que en el código que pegas sigues usando el ShowModal, el problema es que al poner FrmCliente := nil, la sdiguiente condición siempre va a ser cierta así que siempre vas a crear la ventana, exista previamente o no. El nil significa simplemente que la variable FrmCliente no apunta a nada, que no tiene ninguna referencia.

// Saludos
Responder Con Cita
  #17  
Antiguo 02-08-2006
Sudamericano Sudamericano is offline
Miembro
 
Registrado: feb 2004
Posts: 41
Poder: 0
Sudamericano Va por buen camino
Como primer punto quiero aclarar porque pongo
Código Delphi [-]
Frmcliente.Show;



primer caso :si no existe; se crea y se muestra
segundo caso : si si hubiran varios form hijos lo que logra la linea mencionada es que el formulario "FrmCliente" se muestre por encima de todos.


otro punto es que en el evento close debes destruir el formulario,

Código Delphi [-]
 
procedure TFrmCliente.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := Cafree;
 FrmCliente := nil;
end;


con eso te aseguraas de destruir el frmcliente

saludos
Responder Con Cita
  #18  
Antiguo 02-08-2006
grone35 grone35 is offline
Miembro
 
Registrado: jul 2006
Posts: 16
Poder: 0
grone35 Va por buen camino
Smile

Gracias Roman, que pena lo de la ultima linea se me paso lo del ShowModal ya lo he entendido. Y pues entiendo lo que me quieres decir con respecto al "nil". Entonces como se prodria resolver el problema que despues de cerrar el formulario lo pueda volver a abrir.

Saludos
Responder Con Cita
  #19  
Antiguo 02-08-2006
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
Código Delphi [-]
if not Assigned(FrmCliente) then
  FrmCliente := TfrmCliente.Create(Application)
else
  FrmCliente.Show;

Sólo es necesario usar Show si ya está creado para ponerlo al frente (equivale a poner BringToFront) pues el Create automáticamente hará el Show y pondrá el formulario al frente.

// Saludos
Responder Con Cita
  #20  
Antiguo 02-08-2006
Sudamericano Sudamericano is offline
Miembro
 
Registrado: feb 2004
Posts: 41
Poder: 0
Sudamericano Va por buen camino
codigo roman = 4 lineas
Código Delphi [-]
 
if not Assigned(FrmCliente) then  FrmCliente := TfrmCliente.Create(Application)else  FrmCliente.Show;

Mi codigo = 3 lineas

Código Delphi [-]
 
 if not Assigned(FrmCliente) then  FrmCliente := TfrmCliente.Create(Application)  FrmCliente.Show;

ambos codigos son equivalentes
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Diferencia entre aplicacion Clx y aplicación normal??? JorgeBec Varios 1 27-10-2004 17:30:49
aplicacion vertical? aplicacion horizontal? maruenda Varios 3 28-02-2004 23:23:20


La franja horaria es GMT +2. Ahora son las 18:33:31.


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