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 07-12-2007
citlalliDgp citlalliDgp is offline
Miembro
 
Registrado: oct 2007
Posts: 38
Poder: 0
citlalliDgp Va por buen camino
Arrow Llamar forms MDI

Hola, tengo un problema.

El problema es el siguiente, estoy trabajando con forms MDI. En mi aplicacion tengo un form principal fsMDIForm (Form1), desde el cual invoco algunos forms hijos que tuve que convertirlos en fsNormal para poder trabajar el MODAL. Pero desde estos últimos, tengo un TBitBtn mediante el cual trato de invocar otro form fsMDIChild, pero no logro hacerlo, pues me arroja un error. Alguien podría ayudarme con esto, por favor.

Aqui pongo el código donde, el Form4 tiene la propiedad FormStyle en fsNormal, y el Form5 es un form hijo (fsMDIChild) que trato de invocar para que me aparezca maximizado en el form padre (form1). Pero no funciona.

Código Delphi [-]
procedure TForm4.SpeedButton5Click(Sender: TObject);begin Form5 := TForm5.Create(Application);end;
que puedo hacer ???
Responder Con Cita
  #2  
Antiguo 07-12-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Hola citlalliDgp,
Por favor no repitas hilos!

Con respecto a tu pregunta... ¿Podrías explicarte mejor? No logro entenderte... estás hablando de MDI, de Modal... ¿Veamos... dices que tiene un MDiForm que mediante algún botón, menú o lo que sea "llama" a un form Modal y de éste a un form hijo?

Por favor te pido que redactes mejor tu problema porque de veras no te entiendo.

También te pido amablemente que indiques el error.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #3  
Antiguo 07-12-2007
citlalliDgp citlalliDgp is offline
Miembro
 
Registrado: oct 2007
Posts: 38
Poder: 0
citlalliDgp Va por buen camino
Lo que sucede es que, estoy creando una aplicación donde hago uso de forms del tipo MDI.

Ahora, estuve pidiendo ayuda en este foro para poder llamar, desde un form padre, otros forms fsMDIChild (hijos). Después de la ayuda de un amigo del foro, lo logré. Pero después surgió un problema.

Cuando mi aplicación corre, el form principal es el Form2 y tiene la propiedad FormStyle en fsMDIForm. Entonces, dentro de este form, tengo un TMainMenu mediante el cual puedo invocar otros forms hijos del tipo fsMDIChild. Hasta aqui, todo funcionaba correctamente. Sin embargo, surge la necesidad de que, en el momento de invocar un form hijo, éste quede en primer plano y el form padre este inhabilitado (algo similar a lo que sucede cuando invocas un form con ShowModal). Para lograr esto fue necesario, cambiar los forms de fsMDIChild a fsNormal y al invocarlos hacer lo siguiente:

Código Delphi [-]
procedure TForm2.Proveedores1Click(Sender: TObject);
begin
form4 := TForm4.Create(Application);
Form4.ShowModal();
Form4.Free;
end;

Y efectivamente resultó. Pero, retomando el ejemplo del código anterior. Dentro del Form4 puse un SpeedButton con el cual trato de invocar otro Form del tipo fsMDIChild y es éste específicamente el problema por que me arroja un error. Lo que pongo en el SpeedButton es:

Código Delphi [-]
procedure TForm4.SpeedButton5Click(Sender: TObject);
begin
Form5 := TForm5.Create(Application);
end;

Y el error que aparece es "Acces violation at address....".

Podrías ayudarme por favor.
Responder Con Cita
  #4  
Antiguo 07-12-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
El problema creo es de diseño.

Estas mostrando un Form de tipo Modal, inhabilitando la aplicación completa hasta que se cierre el Form4. Al crear una ventana de tipo mdichild desde Form4, la nueva ventana debería estar por detrás de Form4 pero con el foco, y esto es, aplicando la lógica, imposible.

Si desde Form4 (abierto como modal) quieres abrir una nueva ventana, ésta debe ser modal también.

Si nos explicas la lógica del programa, quizás podamos darte nuevas ideas. Obviamente tú sabes mejor que nosotros lo que estas haciendo, quizás pensando un rato puedas solucionarlo.

Ejemplo: Tform4 es la ventana de facturas, desde allí abro TForm5 para elegir el cliente de la factura y ahora quiero desde esta ventana abrir otra que me permita elegir.... lo que sea.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 09-12-2007
citlalliDgp citlalliDgp is offline
Miembro
 
Registrado: oct 2007
Posts: 38
Poder: 0
citlalliDgp Va por buen camino
Hola Lepe, gracias por tu atencion. Te explicaré lo que pretendo hacer...

Lo que sucede es que tengo un form principal (maximizado) que es mi menu principal, desde el cual puedo llamar llamar otros forms, por ejemplo, pueo elegir la opcion productos, y me muestra un form desde el cual puedo registrar productos, pero en este mismo form tambien tengo la opción BUSCAR, con la cual quiero invocar otro form donde me muestre todos los productos registrados (una consulta general). Pero es en este ultimo paso donde me encuentro con el problema. Espero me hayas entendido.
Responder Con Cita
  #6  
Antiguo 09-12-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Creo entenderte, pero como lo dijo Lepe, tu error es de diseño de las ventanas.
O todas son fsMDIChild o todas son Normales. Cuando tu impones que una de tus ventanas sea Modal, y ésta debe llamar a otra venta, obligadamente está última ventana debe ser modal.

Por ejemplo: la ventana de productos es fsChild, bueno. Si esta llama a una ventana buscar que actua modalmente, el foco no volverá a la ventana anterior hasta que se cierre dicha ventana. Si desde Buscar es necesario llamar a otra ventana, esta deberá ser modal

Una ventana modal está diseñada para que se exija al usuario recibir una orden, una confirmación. Impide al usuario seguir con otra ventana, hasta que valida o no la operación necesaria.

Esto se soluciona asi:
FormPrincipal -> fsMDIForm
FormProducto -> fsMDIChild
FormBuscar -> fsMDIChild. Si debe ser Modal, asegúrate de que:

1. No habra ninguna ventana. O bien,
2. Que habra una ventana en forma Modal.

Cuando se cierre las ventanas modales, recién se volverá a tener control de
FrmProducto

No se si se entiende el concepto.
Todo se trata de un error de diseño.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #7  
Antiguo 10-12-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Yo en estos casos actúo así:
Código Delphi [-]

type TBuscar = (bCliente, bFactura);

Function Buscar( BuscarEn:TBuscar; InternalOpen :Boolean):integer;
begin

Result := -1;
case BuscarEn of
   bCliente : 
     with TFrmbusca.Create(nil) do
     try
       if ShowModal = mrOk then 
         // en la ventana de busqueda se seleccionó un cliente válido
         Result := ValorSeleccionadoEnTFrmBusca;
     finally
         Free;
     end;
end;

if (InternalOpen) then
  if Result <> -1 then  // si no elige nada en la ventana de búsqueda, Result tendrá el valor -1.
   AbrirVentana(BuscarEn, Result); 
// abrirá la ventana mdichild
// con el valor que tenga Result, obviamente será clave primaria de la tabla cliente.
end;

Desde cualquier sitio de la aplicación, llamo a la función buscar:

- Si InternalOpen es false, me devuelve el 'id' de esa tabla, es decir, el cliente que ha seleccionado el usuario en la ventana de búsqueda, por tanto, me sirve dicha rutina como un LookUp (cuando el usuario necesita buscar un valor).
- Si InternalOpen es true, ejecutará AbrirVentana y allí buscará si hay abierta una ventana de tipo cliente, la trae al frente y hace visualizar el cliente elegido en la búsqueda.

Como ves, la propia ventana modal no abre la mdiChild, sino que primero se cierra la modal y la rutina Busca es la que se encarga de abrir o no la mdiChild.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 10-12-2007 a las 01:06:26.
Responder Con Cita
  #8  
Antiguo 10-12-2007
citlalliDgp citlalliDgp is offline
Miembro
 
Registrado: oct 2007
Posts: 38
Poder: 0
citlalliDgp Va por buen camino
Hola amigos, gracias por su ayuda. He logrado solucionar mi problema. Sin embargo, quisiera hacer una consulta mas con ustedes. Como les explicaba anteriormente, tengo un form principal del tipo fsMDIForm desde el cual invoco otros forms, por ejemplo el form productos que es fsMDIChild. Pero si desde el form principal invoco el form productos, y luego me regreso al principal puedo volver a invocar el form productos y cuantas veces repita esta operación, se esta creando un nuevo form productos. Y lo que quiero es impedir que esto suceda. Podrían ayudarme ???
Responder Con Cita
  #9  
Antiguo 10-12-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Este hilo te ayudará.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
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
llamar a ocx rzf1983 Varios 2 07-11-2007 02:37:38
Llamar exe de fox kvtm Varios 2 14-08-2006 01:34:08
Llamar Dll mcarazas Varios 0 06-07-2006 01:18:28
Llamar Forms desde un ejecutable????? subzero Varios 5 27-12-2005 21:02:52
llamar a un formulario Michel OOP 3 27-08-2003 07:41:32


La franja horaria es GMT +2. Ahora son las 11:39:54.


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