PDA

Ver la Versión Completa : Problemas con Activar MDIChid


ricardo_yah
31-10-2010, 02:19:08
hola amigos, saludos desde cancun y tengo dos años manejando visual fox pero fox creo que esta en sus ultimos dias y eliji delphi para crear mis aplicaciones pero como todo principiante, miren tengo un problema creo mi form pero supongamos que quiero crear otro en vez de que me lo cree quisiera que me active el form que antes cree he buscado la solucion en el manual y no habla nada al respecto, he buscado por la red pero nada espero que ustedes me pueddan ayudar. este es el codigo que uso

procedure TForm1.NuevaFactura1Click(Sender: TObject);
var MyChildForm: Tform2;
begin
if not Existe('Form2') then
begin
MyChildForm:=tform2.Create(self);
end else

aqui es donde quisiera que me maximizara mi form2 antes creado

end;

espero que me puedan ayudar
de antemano graciasss...

ecfisa
31-10-2010, 11:56:24
Hola ricardo_yah.

Una forma práctica de hacerlo es usando referencia de clase. La siguiente función crea el Form si no existe, o lo muestra si está creado:

procedure TForm1.MostrarChild(AClass: TFormClass);
var
i: Integer;
begin
for i:= 0 to Screen.FormCount -1 do // 0 hasta MDIChild abiertos
if Screen.Forms[i] is AClass then // Si está el que buscamos
begin
Screen.Forms[i].WindowState:= wsNormal; // a modo normal
Screen.Forms[i].BringToFront; // traerlo al frente
Exit; // encontrado, salir
end;
with AClass.Create(Self) do Show; // crearlo
end;


Ejemplo de llamada:

procedure TForm1.Button1Click(Sender: TObject);
begin
MostrarChild(TForm2);
// MostrarChild(TOtroForm);
// MostrarChild(...
end;


Saludos. :)

ricardo_yah
01-11-2010, 00:26:23
hola amigo gracias por responder
mira entiendo el proceso pero me marca un error en

procedure TForm1.MostrarChild(AClass: TFormClass);

me Tform1 no contiene un componene llamado mostrarchild


tambien me marca un error en

with AClass.Create(Self) do Show;

identificador (self) no declarado

no se si es por la version de delphi tengo xe

gracias y disculpa la molestia

ecfisa
01-11-2010, 01:40:56
Hola ricardo_yah.

Ese error surge por que te falta declarar la cabecera de la función MostrarChild en la Clase TForm1, o por que la clase del Form no se llama TForm1.

Te pongo el código completo el cuál acabo de probar para pegarte el ejemplo y funciona perfectamente:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure MostrarChild(AClass: TFormClass); // declaracion que te falta
public
end;

var
Form1: TForm1;

implementation {$R *.dfm}

uses Unit2; // unidad donde está declarado TForm2

procedure TForm1.MostrarChild(AClass: TFormClass);
var
i: Integer;
begin
for i:= 0 to Screen.FormCount -1 do // 0 hasta MDIChild abiertos
if Screen.Forms[i] is AClass then // Si está el que buscamos
begin
Screen.Forms[i].WindowState:= wsNormal; // a modo normal
Screen.Forms[i].BringToFront; // traerlo al frente
Exit; // encontrado, salir
end;
with AClass.Create(Self) do Show; // crearlo
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
MostrarChild(TForm2);
end;

end.


Por supuesto que TForm1 tiene que estar como fsMDIForm y Form2 como fsMDIChild respectivamente. Y si no se llamasen TForm1 y TForm2, cambiar los nombres por los que les hayas asignado.

Es conveniente (aunque no necesario) que quites el Form MDIChild de la creación automática de forms:
Project -> Options -> Forms -> Auto-create forms


Saludos. :)

ricardo_yah
01-11-2010, 03:44:14
gracias ecfisa y disculpa las molestias funciono perfectamente el codigo
y te agradesco la aclaracion ya que como mencione estoy empezando con delphi y ese tipo de aclaraciones me ayudara en lo sucesivo me ayudara.

Mil Gracias.................

ecfisa
01-11-2010, 03:51:30
De nada, me alegra haber podido ayudarte.

Saludos. :)