Ir al contenido


Foto

onMinimize & onRestore


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

#1 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 418 mensajes
  • LocationLa Ceiba-Atlantida-Honduras

Escrito 27 agosto 2010 - 09:30

hola, tengo un form MDI el cual tiene varios childs, lo que quiero es detectar el evento onMin. y onRes. de los childs pero no me sale, hay un componente que se llama AppEvents el cual me permite trabajar con estos eventos pero lo hace con el form main, lo que yo quiero es agregarle ese evento a cada uno de mis forms hijos. ¿alguien me hecha una mano?

saludos!
  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 28 agosto 2010 - 11:18

He decidido crear un minitutorial para novatos de como hacer que nuestra aplicación MDI funcione bien, haciendo uso de la Herencia.

He agregado una "chapuza" (debidamente comentada) para lograr lo que el amigo Look quiere, esta se implementa haciendo una triangulación creando una Unit de nombre UGlobal que servira de pivot (para evitar las referencias circulares entre el Form principal y los hijos) en donde declaramos 2 variables de tipo string (Aform y Accion) que recogerán los eventos de los Forms hijos, para luego transmitirlos a 2 TEdits del form principal.



delphi
  1. unit UGlobal;
  2.  
  3. interface
  4.  
  5. procedure Informar;
  6.  
  7. var
  8. Aform, Accion :String;
  9.  
  10. implementation
  11.  
  12.  
  13. uses UPpal;
  14.  
  15. procedure Informar ;
  16. begin
  17. Ppal.edAccion.Text := Accion;
  18. PPal.edForm.Text := Aform;
  19. end;
  20.  
  21. end.



Iniciamos creando nuestro form Principal al cual como es obvio configuramos su propiedad  FormStyle a fsMDIForm, a este agregamos un  TActionList, al que a su vez agreamos las acciones standar de la categoría Window, que son las que nos van a ayudar a manejar las ventanas MDI.  Luego agregamos al form principal un TMainMenu, en este agregamos un MenuItem cuyo Caption sea "Ventana" y su nombre miVentana , debajo de ventana agregamos tantos MenuItems como Acciones de la categoría Window del TActionList hayan, a cada MenuItem creado le vamos asignando en su propiedad Action cada una de las acciones del TActionList.

Posteriormente a la propiedad WindowMenu del Form principal asignamos miVentana (creado anteriormente).

Próximo post : Crear un form que sirva de base para todos los Forms hijos.
PD: En el proximo post agregaré el código fuente del ejemplo.
  • 0

#3 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 28 agosto 2010 - 11:34

Para esto creamos un nuevo formulario en nuestro proyecto al cual le daremos por nombre Padre y su respectiva Unit UPadre.

En la sección public de nuestro form vamos a agregar dos métodos de clase en este caso dos funciones, una de nombre Instancia que devuelve un form de la clase TPadre (que es la que estamos trabajando), esta función nos ayudará a saber si ya hay creada una Instancia de un determinado Formulario hijo. La segunda función tiene el nombre Mostrar y también devuelve un TPadre, pero además comprueba si existe un específico form hijo, en caso de existir lo activa y lo trae al frente de lo contrario lo crea y obviamente lo muestra.

Configuramos su propiedad FormStyle a fsMDIChild y en su evento OnClose colocamos (Action := caFree).

Las otras acciones que hay en Onclose, OnResize y OnCreate, son solo para cumplir los requerimientos (chapuza) del amigo Look y no hacen parte de lo fundamental para este tipo de aplicación.



delphi
  1. unit UPadre;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs;
  8.  
  9. type
  10.   TPadre = class(TForm)
  11.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  12.     procedure FormCreate(Sender: TObject);
  13.     procedure FormResize(Sender: TObject);
  14.   private
  15.   public
  16.     class function Instancia: TPadre;
  17.     class function Mostrar: TPadre;
  18.     { Public declarations }
  19.   end;
  20.  
  21. implementation
  22.  
  23. uses UGlobal; //Chapuza
  24.  
  25. {$R *.dfm}
  26. { TPadre }
  27.  
  28.  
  29. class function TPadre.Instancia: TPadre;
  30. { Esta función nos ayuda a comprobar si un form específico de la clase
  31.   TPadre está abierto }
  32. var
  33.   I: Integer;
  34. begin
  35.   for I := Screen.FormCount - 1 downto 0 do
  36.   begin
  37.     TForm(Result) := Screen.Forms[I];
  38.     if Result.ClassType = Self then
  39.       Exit;
  40.   end;
  41.   Result := nil;
  42. end;
  43.  
  44. class function TPadre.Mostrar: TPadre;
  45. { Esta función nos devuelve un form de la clase TPadre, si es necesario crea
  46.   una instancia, luego comprueba su propiedad WindowsState para finalmente
  47.   traerlo al frente }
  48. begin
  49.   Result := Instancia;
  50.   LockWindowUpdate(Application.MainForm.ClientHandle);
  51.   // Evita un molesto efecto
  52.   // a la hora de mostrarlo ante todo en WinXP
  53.   try
  54.     if Assigned(Result) then // Comprueba si existe una instancia
  55.     begin
  56.       if Result.WindowState = wsMinimized then
  57.         ShowWindow(Result.Handle, SW_RESTORE);
  58.       Result.BringToFront; // lo trae al frente
  59.     end
  60.     else
  61.     begin
  62.       Result := Create(Application.MainForm); // Crea una instancia(sinó existe)
  63.       Result.Show;
  64.     end;
  65.   finally
  66.     LockWindowUpdate(0);
  67.   end;
  68. end;
  69.  
  70.  
  71. procedure TPadre.FormClose(Sender: TObject; var Action: TCloseAction);
  72. begin
  73.   Action := caFree;
  74.  
  75.   //Inicio de chapuza
  76.   Aform := Self.Name;
  77.   Accion := 'Cerrado';
  78.   Informar;
  79.   //Fin de chapuza
  80. end;
  81.  
  82. procedure TPadre.FormCreate(Sender: TObject);
  83. begin
  84. //Inicio de chapuza
  85.   Aform := Self.Name;
  86.   Accion := 'Creado';
  87.   Informar;
  88.   //Fin de chapuza
  89. end;
  90.  
  91. procedure TPadre.FormResize(Sender: TObject);
  92. begin
  93. //Inicio de chapuza
  94.   Self.UpdateWindowState;
  95.   Aform := Self.Name;
  96.   if Self.WindowState = wsMinimized then
  97.     Accion := 'Minimizado'
  98.   else
  99.     Accion := 'Restaurado';
  100.   Informar
  101.   //Fin de chapuza
  102. end;
  103.  
  104. end.


  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 28 agosto 2010 - 11:50

Ahora ya podemos empezar a crear cuantos descendinetes de TPadre necesitemos, para esto hacemos lo siguiente:

En D7 vamos a Flie > New > Other > (Buscamos el Tab con el nombre de nuestro proyecto) entonces hacemos dobleclick en Padre.

En D2010 Flie > New > Other > Inheritable Items > entonces hacemos dobleclick en Padre.

Nuestros nuevos forms serán del tipo TPadre y heredarán todas sus propiedades y métodos.

Podemos remover la parte de la interface que dice var Padre1: TPadre1; como también debemos quitarlo de la creación automática de forms: Project > Options > Forms

Próximo Post :  Llamando a los descendientes de TPadre y código completo del ejemplo.
  • 0

#5 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 28 agosto 2010 - 12:04

Para esto en la clusula uses de la implementación de nuestro form principal agregamos las Units  de los forms hijos que hayamos creado, agregamos los botones  correspondientes y entonces; para llamar a un Form descendiente de TPadre de nombre Hijo1 entoneces solo tecleamos en el evento OnClick del botón:

THijo1.Mostrar  y así con todos los demás, al cerrarlos ellos se librerarán autoáticamente puesto que en en el evento OnClose de su Padre ya previamente definimos action := caFree.



delphi
  1. unit UPpal;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, Menus, StdCtrls, ExtCtrls, StdActns, ActnList;
  8.  
  9. type
  10.   TPpal = class(TForm)
  11.     MainMenu: TMainMenu;
  12.     miVentana: TMenuItem;
  13.     miArchivo: TMenuItem;
  14.     MiCerrar: TMenuItem;
  15.     ActionList: TActionList;
  16.     WindowClose: TWindowClose;
  17.     WindowCascade: TWindowCascade;
  18.     miCascade: TMenuItem;
  19.     MiClose: TMenuItem;
  20.     Panel1: TPanel;
  21.     bnHijo1: TButton;
  22.     bnOtroHijo: TButton;
  23.     Label1: TLabel;
  24.     edForm: TEdit;
  25.     edAccion: TEdit;
  26.     procedure MiCerrarClick(Sender: TObject);
  27.     procedure bnHijo1Click(Sender: TObject);
  28.     procedure bnOtroHijoClick(Sender: TObject);
  29.     procedure edFormChange(Sender: TObject);
  30.   private
  31.     { Private declarations }
  32.   public
  33.     { Public declarations }
  34.   end;
  35.  
  36. var
  37.   Ppal: TPpal;
  38.  
  39. implementation
  40.  
  41. uses UHijo1, UOtroHijo;
  42.  
  43. {$R *.dfm}
  44.  
  45. procedure TPpal.MiCerrarClick(Sender: TObject);
  46. begin
  47. Close;
  48. end;
  49.  
  50. procedure TPpal.bnHijo1Click(Sender: TObject);
  51. begin
  52. THijo1.Mostrar;
  53. end;
  54.  
  55. procedure TPpal.bnOtroHijoClick(Sender: TObject);
  56. begin
  57. TOtroHijo.Mostrar;
  58. end;
  59.  
  60. procedure TPpal.edFormChange(Sender: TObject);
  61. begin
  62. //Lo que quieras
  63. end;
  64.  
  65. end.





Lo siguiente es solo para Look:

Finalmente en el evento OnChange del TEdit edForm podrías manejar lo que necesites, porque es allí en donde se capturan los eventos OnResize de todos los hijos, por ejemplo:



delphi
  1. if (edForm.Text = 'Hijo1') and (edAccion.Text = 'Minimizado') then
  2. //HacerCosas

Archivos adjuntos


  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 28 agosto 2010 - 12:07

Muchas gracias Wilson, excelente explicación (y)

Salud OS
  • 0

#7 esocrates

esocrates

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 102 mensajes
  • LocationArgentina

Escrito 28 agosto 2010 - 01:19

Este tutorial me viene muy bien.
¡Muchas gracias Wilson!
Un saludo
  • 0

#8 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 418 mensajes
  • LocationLa Ceiba-Atlantida-Honduras

Escrito 30 agosto 2010 - 12:23

hola, muchas gracias compañero!....
saludos!
  • 0




IP.Board spam blocked by CleanTalk.