Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Maximizar MDIChild (https://www.clubdelphi.com/foros/showthread.php?t=78656)

ramonibk 07-05-2012 20:41:48

Maximizar MDIChild
 
Buenas de nuevo.

Otra pregunta sobre los From hijos.

El caso es que para controlar si mi Form-Hijo se encuentra abierto he creado una variable global la cual pongo a true o false segun este abierto o cerrado.

por lo que en el boton de llamada pondria
Código Delphi [-]
// ArticuloFrm seria la bariable global
Var
 Articulo : TfrmArticulos;
begin
 If ArticuloFrm = False Then
  Begin
   Articulo := TfrmArticulos.Create(Self);
   ArticuloFrm := True;
  End else
  // ***???***
end;

La cosa es como puedo hacer para que en caso de que el form se encuentra abierto.
Bien lo maximice si se encuentra minimizado
Bien lo pase a primer plano si se encontrara en segundo plano.

ecfisa 07-05-2012 20:49:33

Hola ramonibk.

Cita:

La cosa es como puedo hacer para que en caso de que el form se encuentra abierto.
Bien lo maximice si se encuentra minimizado
Bien lo pase a primer plano si se encontrara en segundo plano.
Código Delphi [-]
  if Form2.WindowState = wsMinimized then // esta minimizado ?
    Form2.WindowState:= wsMaximized;      // maximizar;
  Form2.BringToFront;   // traer al frente

Saludos.

maeyanes 07-05-2012 20:52:40

Hola...

Verifica el valor de la propiedad WindowState.

Código Delphi [-]
if Artitulo.WindowState = wsMinimized then
  Articulo.WindowState = wsNormal;  // Con esto restauramos la ventana...
Articulo.BringToFront // Aquí traemos la ventana al frente...


Saludos...

ramonibk 07-05-2012 22:19:51

He probado diferentes opciones sobre este código. Poco mas o menos
pero siempre de de acceso violation.

Código Delphi [-]
procedure TForm1.SpeedButton1Click(Sender: TObject);
Var
 Articulo : TfrmArticulos;
begin
 If ArticuloFrm = True Then
  Begin
   if frmArticulos.WindowState = wsNormal Then
     Begin
      frmArticulos.BringToFront;
     End;
   if frmArticulos.WindowState = wsMinimized then
     Begin
      frmArticulos.WindowState := wsNormal;  
     End;
  End;
 If ArticuloFrm = False Then
  Begin
   Articulo := TfrmArticulos.Create(Self);
   ArticuloFrm := True;
  End;
end;

maeyanes 07-05-2012 22:33:38

Hola...

Tienes el error por que estas tratando de usar una variable a un objeto que no ha sido creado (frmArticulos).

Otra cosa, la variable Articulo es local al método SpeedButton1Click, por lo tanto, esta se elimina al salir de mismo, lo que dificulta que puedas acceder de nuevo al objeto creado (el formulario sigue accesible desde la propiedad MDIChildren del formulario principal de la aplicación).

Verifica bien estos detalles para que puedas corregir el error que obtienes.



Saludos...

ecfisa 07-05-2012 22:39:28

Hola ramonibk.

Probá de este modo:
Código Delphi [-]
...
procedure TForm1.TraerFormAlFrente(AName: string);
var
  i: Integer;
begin
  for i:= MDIChildCount-1 downto 0 do
    if MDIChildren[i].Name = AName then
    begin
      if MDIChildren[i].WindowState = wsMinimized then
        MDIChildren[i].WindowState:= wsMaximized;
      MDIChildren[i].BringToFront;
    end;
end;

Ejemplo llamada:
Código Delphi [-]
   TraerFormAlFrente('Form5');
No te dará el error ya que no invocará una ventana no creada (ni la mostrará), pero como bién dice maeyanes, el error sigue estando... :)

Saludos.

ramonibk 08-05-2012 08:10:11

Buenos dias.
Como dices maeyanes
Cita:

Tienes el error por que estas tratando de usar una variable a un objeto que no ha sido creado (frmArticulos).

Otra cosa, la variable Articulo es local al método SpeedButton1Click, por lo tanto, esta se elimina al salir de mismo, lo que dificulta que puedas acceder de nuevo al objeto creado (el formulario sigue accesible desde la propiedad MDIChildren del formulario principal de la aplicación).

Verifica bien estos detalles para que puedas corregir el error que obtienes.
la variable Articulos es de tipo boolean, como variable global y esta definida dentro del Form principal (fsMDIForm) y se inicializa en el create del form

ecfisa 08-05-2012 10:09:20

Hola ramonibk.

No entiendo cuál es el problema ahora, pero tomando en cuenta lo que mencionas en el primer mensaje:
Cita:

La cosa es como puedo hacer para que en caso de que el form se encuentra abierto.
Bien lo maximice si se encuentra minimizado
Bien lo pase a primer plano si se encontrara en segundo plano.
Y viendo que en el código del mensaje #4 intentas la creación sin lograrlo, creo que con este procedimiento vas a dar solución al problema:
Código Delphi [-]
...
(* Crear MDIChild  *)
procedure TForm1.AbrirMDIChild(AClass: TFormClass);
var
  i: Integer;
begin
  for i:= MDIChildCount-1 downto 0 do
    if MDIChildren[i] is AClass then //  ¿ Se encontro ?
    begin
      if MDIChildren[i].WindowState = wsMinimized then // Si, ¿ Minimizado ?
        MDIChildren[i].WindowState:= wsMaximized;  // => Maximizar
      MDIChildren[i].BringToFront;  // traer al frente
      Exit; // nada mas que hacer aquí...
    end;
   with AClass.Create(Self) do // no se encontró => Crearlo
    BringToFront; // traer al frente
end;

(* Ejemplo de llamada *)
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  AbrirMDIChild(TMDIChild1);
end;

Saludos.

ramonibk 08-05-2012 11:25:32

Buenas de nuevo.

La creación del Form si la hago correctamente.
el problema me surge cuando este esta ya creado. Para controlar si esta creado o no uso la bariable Articulo cuando creo el form la pongo a true y al cerrar el form la pongo a false.

el problema me surge si cuando el for fa esta creado deseo ponerlo en primer plano (se puede encontrar en segundo plano o minimizado. y abría que ponerlo en primer plano en modo normal.)
ecfisa todavía no he podido probar el código que me comentas pero en cuanto lo pueda hacer os comento los resultados.

ecfisa 08-05-2012 12:52:06

Hola ramonibk.

Cita:

La creación del Form si la hago correctamente.
el problema me surge cuando este esta ya creado.
Si, la verdad me expresé mál :o, debí decir: "intentas mostrarlo o crearlo recibiendo errores de access violation como nos comentas en el mensaje #4". Pero del modo que te indico no vas a tener ese inconveniente.

Aprovecho para decirte algo que no sé si dejé bién claro en el mensaje anterior. Como argumento del procedimiento tenes que pasar la clase del form ,no la instancia. Ej.: TForm1 y no Form1.

Saludos.

maeyanes 08-05-2012 15:36:31

Hola...

Cita:

Empezado por ramonibk (Mensaje 432078)
la variable Articulos es de tipo boolean, como variable global y esta definida dentro del Form principal (fsMDIForm) y se inicializa en el create del form

Según el código que publicaste, la variable Articulos es del tipo TfrmArticulos y es local al método.

Código Delphi [-]
Var
 Articulo : TfrmArticulos;

y la variable (entiendo que global) ArticuloFrm es la que es de tipo Boolean. A menos que haya sido un error tuyo al momento de publicar tu código.


Saludos...

ramonibk 08-05-2012 16:33:26

Ok ecfisa ya he probado el código que me distes y funciona correctamente ahora solo me queda ver que es lo que yo estaba haciendo mal.

y si maeyanes efectivamente me he equivocado al comentar antes las variables. la variable Articulos es de tipo local y ArticuloFrm es de tipo global.
Gracias por el apunte.


La franja horaria es GMT +2. Ahora son las 02:49:56.

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