Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problemas crear MDIchild (https://www.clubdelphi.com/foros/showthread.php?t=30013)

bbjb 07-02-2006 09:18:09

Problemas crear MDIchild
 
Antes de nadar confirmar que he estado consultado por el foro antes de colocar este post, pero no encuentro solución a lo que voy a explicar:

Tengo una aplicación con un formulario fsMDIForm, que al pulsar una opción de menu genera un formulario fsMDIChild a través del siguiente código

Código Delphi [-]
If Fchild = NIl Then 
Begin
    Application.CreateForm(TFdevol_cobros,FChild);
    FChild.FreeNotification(Self); 
    FChild.Show; 
    FChild.Free; 
 End;

Pués no me crea el formulario auxiliar, sólo lo hace si previamente a la linea Application.Create... coloco esta otra:

Fchild := TFdevol_cobros.Create(Self);

Algo también curioso es que cuando me muestra el formulario hijo, lo hace con unas dimensiones distintas a las establecidas en tiempo de diseño, algo extraño verdad?
He comprobado que el formulario principal está definido como fsMDIForm y el auxiliar como fsMDIChild.
Me podeís ayudar????,gracias.

delphi.com.ar 07-02-2006 13:47:40

Cita:

Empezado por bbjb
Tengo una aplicación con un formulario fsMDIForm, que al pulsar una opción de menu genera un formulario fsMDIChild a través del siguiente código

Código Delphi [-]
If Fchild = NIl Then 
Begin
    Application.CreateForm(TFdevol_cobros,FChild);
    FChild.FreeNotification(Self); 
    FChild.Show; 
    FChild.Free; 
 End;

Si lo crea, pero lo destruye inmediatamente. Recuerda que si el formulario no es modal, el hilo de ejecución no se detiene en el show. Reemplaza todo tu código por:
Código Delphi [-]
If Fchild = nil Then 
begin
  Application.CreateForm(TFdevol_cobros,FChild);
end;


Cita:

Empezado por bbjb
Pués no me crea el formulario auxiliar, sólo lo hace si previamente a la linea Application.Create... coloco esta otra:

Fchild := TFdevol_cobros.Create(Self);

En este caso te queda un form porque estas creando dos instancias de la clase y liberando solo una.

Cita:

Empezado por bbjb
Algo también curioso es que cuando me muestra el formulario hijo, lo hace con unas dimensiones distintas a las establecidas en tiempo de diseño, algo extraño verdad?

No, no es extraño es así. Los MDIChild tiene un default size, que es el tamaño que ves cada vez que se crea uno, si queres que tu TForm no adopte ese tamaño y mantenga el de diseño, puedes cambiar el valor de la propiedad Position, por ejemplo ponerlo en poDefaultPosOnly para que mantenga el tamaño de diseño pero no la posición.

Saludos!

bbjb 07-02-2006 16:09:26

Chapó para delphi.com.ar

De todas formas, si hago lo siguiente:

Cita:

If Fchild = nil Then
begin
Application.CreateForm(TFdevol_cobros,FChild);
end;
Consigo ver en pantalla el formulario, pero si añado más linea de código continuará ejecutándose.
Entonces, y si no es mucho pedir, ¿como haces tú para continuar con el programa?, no se si me explico, lo que quiero saber es como hacer la llamada al formulario para que se ejecute y mantenga en pantalla y no continue con la programación que pueda haber posterior.

Si no me explico me lo decís, gracias.

delphi.com.ar 07-02-2006 16:44:39

Cita:

Empezado por bbjb
Chapó para delphi.com.ar

Traducción para eso por favor :D

Cita:

Empezado por bbjb
Consigo ver en pantalla el formulario, pero si añado más linea de código continuará ejecutándose.
Entonces, y si no es mucho pedir, ¿como haces tú para continuar con el programa?, no se si me explico, lo que quiero saber es como hacer la llamada al formulario para que se ejecute y mantenga en pantalla y no continue con la programación que pueda haber posterior.

¿No necesitaras que el formulario sea modal? (Ver método ShowModal)
Por ejemplo... ¿Qué código quieres agregar despues que se destruye el form?

bbjb 07-02-2006 17:12:50

Cita:

chapó.
1. interj. U. para expresar admiración por algo o por alguien.
Seguro que me he equivocado en el planteamiento del programa. Quería tener un programa recogido donde en un formulario principal (MDIForm) se mostrase el menú y poder seleccionar las distintas opciones disponibles.

Estas opciones se abrirían dentro del formulario principal a través de form.auxiliares (MDIChild) y serían pantallas con filtros donde permitirían al usuario sacar listados.
Dicho esto, lo que quiero es sacar una pantalla interactiva con el usuario y que cuando este decida salir de ella, obtener los datos introducidos por este.

Por lo que veo, mi idea estaba muy mal planteada

roman 07-02-2006 17:33:31

¿Muy mal planteada? Pues no estaría tan seguro. Quizá (digo quizá porque no entiendo del todo lo que deseas) tu problema está sólo en querer destruir el formulario tan sólo lo muestras. Si lo que te preocupas es cúando lo destruyes pues tienes varias opciones. Una es crear el formulario tal como te dice Federico y omitir la llamada a Free. Al crearlo de esa forma, el objeto Application será el dueño del formulario y por tanto se encargará de destruirlo cuando él mismo se destruya- cuando termine la aplicación. También puedes manipular el evento OnClose del formulario y poner Action := caFree con lo que el formulario se destruirá tan pronto se cierre.

// Saludos

bbjb 07-02-2006 18:05:02

Cita:

¿Muy mal planteada? Pues no estaría tan seguro.....
Exacto, eso es lo he probado a hacer nada más mandar el correo y creo que es el camino que debo coger para continuar con la aplicación. He aclarado las ideas (gran parte de culpa la tienen ustedes) y he visto la salida al "problema"

Gracias por vuestra ayuda.

bbjb 07-02-2006 23:58:33

Perdonad de nuevo, pero cuendo creía tenerlo resuelto me surge un problema y seguro que es una chorrada pero llevo un buen rato con el y no consigo solucionarlo.

Estoy definiendo el form.principal como MDIForm, el auxiliar como MDIChild y cuando ejecuto el siguiente código no muestra el form.auxiliar:

Código Delphi [-]
 If Fchild = nil Then
 begin
    Application.CreateForm(TFdevol_cobros,FChild);
 end;

Donde estoy cometiendo el error, puede tratarse de una propiedad que estoy olvidando???
Gracias por la ayuda.

delphi.com.ar 08-02-2006 13:08:21

Mmmm....
Seguro que TFdevol_cobros es MDIChild???..

bbjb 08-02-2006 13:27:33

Cita:

Mmmm....
Seguro que TFdevol_cobros es MDIChild???..
Tan seguro como que el futbolista de tu avatar es Maradona :)

delphi.com.ar 08-02-2006 14:09:59

Cita:

Empezado por bbjb
Tan seguro como que el futbolista de tu avatar es Maradona :)

Yo creí que se trataba de Eber Ludueña :D
Algo tiene que estar mal, si tiene sun MDI en cuanto creas un MDIChild (que su propiedad Visible obligatoriamente tiene que ser True), este se tiene que mostrar dentro del MDI!
¿Puedes subirnos algo de código?

bbjb 08-02-2006 18:31:58

Cita:

Yo creí que se trataba de Eber Ludueña
Jejeje :D , por un momento he llegado a dudar, hasta que he visito la página del personaje en cuestión, todo un fenómeno.

He simplificado el máximo el código, y por supuesto comprobado que el formulario principal sea MDIForm y el auxiliar MDIChild. El valor de la propiedad Visible en el auxiliar es True, y ¿existe alguna otra propiedad que deba tener en cuenta?
Os muestro el código de llamada al formulario auxiliar, por si estuviera utilizando algo mal.

Código Delphi [-]
Procedure TFmenu.pide_datos;
Var Faux :TForm;
Begin
        Application.CreateForm(TForm1,Faux); 
End;

El formulario auxiliar que crea es una chorradilla donde he puesto a modo de comprobación en el evento OnCreate que muestre un mensaje en pantalla.
Pués el mensaje lo muestra pero es lo único que hace porque no aparece el formulario en si.
Para volverse loco!!!!

bbjb 09-02-2006 08:49:22

He encontrado el problema .
Resulta que el formulario principal contiene un Tpanel con la propiedad "Align=AlCliente" que impide mostrar cualquier Formulario Auxiliar :eek: :eek: :eek:
Este Tpanel lo utilizaba para mostrar en él una imagen que debía aumentar o disminuir de tamaño conforme lo hiciese el formulario.

¿Alguna vez os habeís encontrado un caso similar???


La franja horaria es GMT +2. Ahora son las 06:04:17.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi