Ir al contenido


Foto

[RESUELTO] ¿Como detener o interceptar el Show de un MDI?


  • Por favor identifícate para responder
15 respuestas en este tema

#1 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 10 febrero 2010 - 06:53

Saludos.

Tengo un inconveniente muy grande, por lo menos para mí.

Este es el escenario, lo pondré lo más simple posible, dos formularios (Main y Child) uno fsMDIForm y otro fsMDIChild; desde el Main con este código basta para crear y mostrar el Child.


delphi
  1. procedure TMain.Button2Click(Sender: TObject);
  2. var
  3.   AForm : TChild;
  4. begin
  5.   AForm := TChild.Create(Self);
  6. end;



Se crea y se muestra con el código anterior, entonces, necesito poder interceptar o detener el Show para poder asignarles una series de valores a propiedades del Child y poder hacer uso de la instancia del objeto previo al Show.

Siendo estos valores útiles desde el Evento OnShow del Child.  Ya intente con class properties que al final lo que hace uso es de Class Function y Class Procedure, con esto se soluciona parte, pero se me daña la patineta es cuando necesito la instancia del Objeto desde Main antes del Show.

Espero haber sido claro, ahora bien, si tienen otra idea mejor, bienvenida sea!
  • 0

#2 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 10 febrero 2010 - 07:02



delphi
  1. procedure TMain.Button2Click(Sender: TObject);
  2. var
  3.   AForm : TChild;
  4. begin
  5.   AForm := TChild.Create(Self);
  6. end;



Inmediatamente después de la creación de AForm, podría quedar algo así... (los colores no los toma muy bien, pero lo intentaré):


delphi
  1. procedure TMain.Button2Click(Sender: TObject);
  2. var
  3.   AForm : TChild;
  4. begin
  5.   AForm := TChild.Create(Self);
  6.   aform.variable := svalor;
  7.   aform.funcion(svalor);
  8.   aform.procedimiento;
  9.   aform.Show;
  10. end;


  • 0

#3 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 10 febrero 2010 - 07:22

Saludos.

Gracias TiammatMX, pero con el código que puse, el formulario se muestra, osea hace un Show sólito sin hacer la llamada.

Es ahí donde me rompe las p......, necesito la instancia del Objeto una vez creado para asignar valores y desde el Evento OnShow utilizar dichos valores.

Gracias nuevamente.
  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 10 febrero 2010 - 07:34

Y no puedes utilizar el evento OnCreate de la forma heredada ?

algo así



delphi
  1. // TChild
  2.  
  3. procedure TChild.FormCreate(Sender: TObject);
  4. begin
  5.   Form1.Mensaje := 'Evento Crear';
  6.   ShowMessage(form1.mensaje);
  7. end;





delphi
  1. // Main
  2.  
  3. type
  4.   TForm1 = class(TForm)
  5.     Button1: TButton;
  6.     procedure Button1Click(Sender: TObject);
  7.   private
  8.     { Private declarations }
  9.   public
  10.     { Public declarations }
  11.     Mensaje: string;
  12.   end;
  13.  
  14. var
  15.   Form1: TForm1;
  16.  
  17. implementation
  18.  
  19. uses Unit2;
  20.  
  21. {$R *.DFM}
  22.  
  23. procedure TForm1.Button1Click(Sender: TObject);
  24. var
  25.   AForm : TChild;
  26. begin
  27.   AForm := TChild.Create(Self);
  28. end;



Salud OS
  • 0

#5 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 10 febrero 2010 - 07:39

Saludos.

Al parecer no me he dado a entender.

Con el código que puse en el mensaje anterior el formulario Child se crea y se muestra, hasta aquí, por así decirlo, no hay problemas.

Mi inconveniente resulta en que debo de utilizar la instancia de Child creada en Main y desde Main poder realizar esto Child.Propiedad := Valor.

Entonces en el Child utilizar el valor de Propiedad desde su evento OnShow para realizar un par de sentencias.

Espero haber sido más claro.

  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 10 febrero 2010 - 07:55

Si, te entiendo perfectamente, lo que pasa es que no puedes asignar ninguna propiedad hasta que la forma es creada, sea Child o Normal.

Esto lo puedes hacer de esta forma



delphi
  1. // MDIChild
  2.  
  3. procedure TChild.FormCreate(Sender: TObject);
  4. begin
  5.   Align := Form1.pAlign;
  6.   Caption := Form1.pCaption;
  7. end;





delphi
  1. // Main
  2.  
  3. type
  4.   TForm1 = class(TForm)
  5.     Button1: TButton;
  6.     procedure Button1Click(Sender: TObject);
  7.   private
  8.     { Private declarations }
  9.   public
  10.     { Public declarations }
  11.     pAlign: TAlign;
  12.     pCaption: String;
  13.   end;
  14.  
  15. var
  16.   Form1: TForm1;
  17.  
  18. implementation
  19.  
  20. uses Unit2;
  21.  
  22. {$R *.DFM}
  23.  
  24. procedure TForm1.Button1Click(Sender: TObject);
  25. var
  26.   AForm : TChild;
  27. begin
  28.   pAlign := alLeft;
  29.   pCaption := 'Prueba de Propiedades en MDIChild';
  30.   AForm := TChild.Create(Self);
  31. end;
  32.  
  33. end.



Salud OS
  • 0

#7 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 10 febrero 2010 - 08:03

Saludos.

Es excelente solución siempre y cuando el Child y Main se conozcan, estén en uso sus unidades, pero en mi caso los formularios no se conocen ni deben, porque me rompería la estructura de mi "FrameWork".

Este es un ejemplo de dos formularios, pero en la realidad son varios formularios distintos que son creados por el Main sin conocer a sus Childs y viceversa.
  • 0

#8 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 10 febrero 2010 - 08:15

Ahora si que la pones mas complicada mi estimado Rolphy, de alguna forma debes de 'conectar' los formularios, por ejemplo a través de archivos externos.

Salud OS
  • 0

#9 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 10 febrero 2010 - 08:18

Ahora si que la pones mas complicada mi estimado Rolphy, de alguna forma debes de 'conectar' los formularios, por ejemplo a través de archivos externos.

Salud OS


Realmente es a través de acciones, he construido mis propias acciones y vaya que resulta cómodo para estos asuntos de crear formularios y pasar parámetros y demás.

Pero me he quedado corto en esta parte y ando como loco llevo un buen rato buscando solución a esto.
  • 0

#10 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 10 febrero 2010 - 08:23

Pues yo me quedo igual corto, no doy para mas :$

Salud OS
  • 0

#11 kafastoforman

kafastoforman

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 277 mensajes
  • LocationMexico D.F.

Escrito 10 febrero 2010 - 08:53

Se me ocurre algo como esto:



delphi
  1. .
  2. .
  3. .
  4. begin
  5.  
  6. with TChild.Create(self) do
  7. try
  8.   PAlign:= alNone;
  9.   pCaption:= 'something';
  10.   Show;
  11. finally
  12.   free;
  13. end;
  14.  
  15. end;




Eso lo hago con formularios normales y hasta que se ejecuta el show o showmodal se muestra la pantalla, lo que no se, es que si se puede hacer con formularios del tipo child.

Saludos

Kafastoforman
  • 0

#12 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 10 febrero 2010 - 08:59

Se me ocurre algo como esto:



delphi
  1. .
  2. .
  3. .
  4. begin
  5.  
  6. with TChild.Create(self) do
  7. try
  8.   PAlign:= alNone;
  9.   pCaption:= 'something';
  10.   Show;
  11. finally
  12.   free;
  13. end;
  14.  
  15. end;




Eso lo hago con formularios normales y hasta que se ejecuta el show o showmodal se muestra la pantalla, lo que no se, es que si se puede hacer con formularios del tipo child.

Saludos

Kafastoforman


Gracias, pero sigue igual.
  • 0

#13 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 10 febrero 2010 - 09:00

Propongo otro enfoque

En lugar de interceptar el evento OnShow, lo que se puede hacer es crear un evento nuevo llamado AfterCreate y en este evento recibes la instancia del formulario recién creado.

Aquí un poco de código:

En el formulario Child creamos el nuevo evento sobrecargando el constructor



delphi
  1. unit CHILDWIN;
  2.  
  3. interface
  4.  
  5. uses Windows, Classes, Graphics, Forms, Controls, StdCtrls, Dialogs;
  6.  
  7. type
  8.   TMDIChild = class;
  9.   // Definimos la estructura de nuestro evento que recibe la instancia recién creada
  10.   TAfterCreateEvent = procedure (Sender:TMDIChild)of object;
  11.   TMDIChild = class(TForm)
  12.     Memo1: TMemo;
  13.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  14.     procedure FormShow(Sender: TObject);
  15.   private
  16.     FProp1: String;
  17.     { Private declarations }
  18.   public
  19.     { Public declarations }
  20.     //Escribimos un nuevo constructor
  21.     constructor NuevoConstructor(AOwner:TComponent;Event:TAfterCreateEvent);
  22.   //Una nueva propiedad para hacer pruebas
  23.     property Propiedad1:String read FProp1 write FProp1;
  24.   end;
  25.  
  26. implementation
  27.  
  28. {$R *.dfm}
  29.  
  30. procedure TMDIChild.FormShow(Sender: TObject);
  31. begin
  32.   ShowMessage(Propiedad1);
  33. end;
  34.  
  35. constructor TMDIChild.NuevoConstructor(AOwner: TComponent; Event: TAfterCreateEvent);
  36. begin
  37.   inherited Create(AOwner); // Llamamos al constructor por default
  38.   // Aquí llamamos nuestro evento AfterCreate
  39.   // y le enviamos la instancia recién creada
  40.   if Assigned(Event) then
  41.   Event(Self);
  42. end;
  43.  
  44. procedure TMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);
  45. begin
  46.   Action := caFree;
  47. end;
  48.  
  49. end.




Ahora en el formulario principal creamos el procedimiento que será llamado justo después de creado el  child y luego llamamos al nuevo constructor



delphi
  1. unit MAIN;
  2.  
  3. interface
  4.  
  5. uses Windows, SysUtils, Classes, Graphics, Forms, Controls, Menus,
  6.   StdCtrls, Dialogs, Buttons, Messages, ExtCtrls, ComCtrls, StdActns,
  7.   ActnList, ToolWin, ImgList,CHILDWIN;
  8.  
  9. type
  10.   TMainForm = class(TForm)
  11. .
  12. .
  13. .
  14. .
  15.     procedure AfterCreate(Sender:TMDIChild);
  16.   private
  17.     { Private declarations }
  18.     procedure CreateMDIChild(const Name: string);
  19.   public
  20.     { Public declarations }
  21.   end;
  22.  
  23. var
  24.   MainForm: TMainForm;
  25.  
  26. implementation
  27.  
  28. {$R *.dfm}
  29.  
  30. //En este evento podemos asignarle valores a las propiedades del child
  31. procedure TMainForm.AfterCreate(Sender: TMDIChild);
  32. begin
  33.   Sender.Propiedad1:='Hola';
  34. end;
  35.  
  36. procedure TMainForm.CreateMDIChild(const Name: string);
  37. var
  38.   Child: TMDIChild;
  39. begin
  40.   { creaamos un nuevo MDI child y le asignamos el evento que vamos a disparar}
  41.   Child := TMDIChild.NuevoConstructor(Application,AfterCreate);
  42. end;
  43. .
  44. .
  45. .
  46. .
  47. .
  48. etc...




De esta forma tenemos un evento que se dispara justo después de crear la instancia y para cuando se dispara el evento OnShow del formulario las propiedades ya tienen sus valores.

Saludos

P.D. Adjunto el ejemplo

Archivos adjuntos


  • 0

#14 kafastoforman

kafastoforman

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 277 mensajes
  • LocationMexico D.F.

Escrito 10 febrero 2010 - 09:25


Se me ocurre algo como esto:



delphi
  1. .
  2. .
  3. .
  4. begin
  5.  
  6. with TChild.Create(self) do
  7. try
  8.   PAlign:= alNone;
  9.   pCaption:= 'something';
  10.   Show;
  11. finally
  12.   free;
  13. end;
  14.  
  15. end;




Eso lo hago con formularios normales y hasta que se ejecuta el show o showmodal se muestra la pantalla, lo que no se, es que si se puede hacer con formularios del tipo child.

Saludos

Kafastoforman


Gracias, pero sigue igual.


no, ¿en serio?, lo que creo que pasa, es que en el codigo que te di, solo actualiza las variables, pero si en vez de eso le modificas directamente el align y el caption de la forma deberia resultar, por que si no le pones showmodal o show entre el try y el finally tu formulario no deberia aparecer. intenta quietarselo para ver si tengo o no la razon.

Saludos.

Kafastoforman
  • 0

#15 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 10 febrero 2010 - 09:31

Gracias a todos.

Kafastoforman, el problema seguirá latente mientras la ventana sea MDIChild, puesto que al crear el formulario el mismo dispara el Show.  Y como estoy necesitando la instancia del objeto pasara igual con cualquier código parecido.

Me quedo con la solución de Héctor Randolph, es un nuevo enfoque, veré como lo adapto a lo que tengo sin tener muchos rompimientos de código.  Por cierto, Héctor mucho tiempo sin verte, saludos compañero.

Mientras pasare el hilo como resuelto.
  • 0

#16 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 10 febrero 2010 - 09:53

Ah vaya que bien, llegó quien si sabe de esto, ya tengo algo que estudiar y aplicar :)

Salud OS
  • 0




IP.Board spam blocked by CleanTalk.