PDA

Ver la Versión Completa : Maximizar MDIChild


ramonibk
07-05-2012, 20:41:48
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

// 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.


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.



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.


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.


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:

...
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:

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
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:

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:

...
(* 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.

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...


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.


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.