Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   evitar que un mdichlid se repita mas de 1 vez (https://www.clubdelphi.com/foros/showthread.php?t=73474)

granodetoro 25-04-2011 21:31:34

evitar que un mdichlid se repita mas de 1 vez
 
hola de nuevo se que puse este tema en c++ y perdon era aqui disculpen, bueno tengo un form1 con formstyle:MDIform y puse un menu principal y dentro de este menuprincipal ahy una opcion que dice formulario 1 y cuando damos clic , llama a otro formulario que es form2 con formstyle:MDIchild y resulta que si sigo dando clic se repite form2 y si damos clic denuevo sigue apareciendo...bueno quiero que solo pueda aparecer una vez ...ayuda

oscarac 25-04-2011 21:41:25

mmmm lo que yo hago es deshabilitar la opcion del menu cosa que ya no puedo escogerla de nuevo

En el create del formulario que llamo
mnuOpcion.Enable := False;

y al salir
mnuOpcion.Enable := True;

granodetoro 25-04-2011 21:44:00

no entiendo bien me puedes explicar mejor amigo

ecfisa 25-04-2011 21:55:45

Hola granodetoro.

Existen varias maneras de lograrlo, te pongo dos formas:
Código Delphi [-]
function TMDIForm.AssignedMDI(AName:String): boolean;
var
  i: integer;
begin
  Result:= False;
  for i:= 0 to MDIChildCount - 1 do
    if MDIChildren[i].Name = AName then Result:= True
end;

Llamada:
Código Delphi [-]
begin
 if AssignedMDI('MDIChild1') then
    MDIChild1.BringToFront
  else
    MDIChild1:= MDIChild1.Create(nil);
end;

Otro forma:
Código Delphi [-]
procedure TForm1.MostrarChild(AClass: TFormClass);
var
  i: Integer;
begin
  for i:= 0 to Screen.FormCount -1 do  
    if Screen.Forms[i] is AClass then  
    begin
      Screen.Forms[i].WindowState:= wsNormal; 
      Screen.Forms[i].BringToFront;           
      Exit;                                   
    end;
  with AClass.Create(Self) do Show;           
end;

Llamada:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  MostrarChild(TMDIChild1);
end;


Un saludo.

granodetoro 25-04-2011 22:00:52

muchas gracias si en esto se pudiera regalar puntos de mi parte tuvieras 1000
ecfisa
'great premium user'

beginner01 25-04-2011 22:03:35

saludos.

puedes preguntar por si tiene valor nil
Código Delphi [-]
 
if form2=nil then
begin
application.createform(tform2,Form2);
form2.show;
end;

granodetoro 25-04-2011 22:05:15

y donde pongo el codigo me olvide preguntar

granodetoro 25-04-2011 22:07:03

begginer oye muchisimas gracias tu ejemplo tambien me funciono

ecfisa 25-04-2011 22:49:30

Cita:

Empezado por granodetoro (Mensaje 397982)
y donde pongo el codigo me olvide preguntar

El código va en el MDIForm, que por supuesto debe incluir las unidades que definen las ventanas MDIChilds.



Otra opcion es que sea el propio MDIChild quién verifique su existencia, para eso debes usar métodos de clase.
Código Delphi [-]
unit Unit2;
....
type
  TMDIChild = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDestroy(Sender: TObject);
  private
  public
    class procedure MostrarChild;
  end;

var
  MDIChild: TMDIChild;

implementation 

class procedure TMDIChild.MostrarChild;
begin
  if not Assigned(MDIChild) then
     MDIChild:= TMDIChild.Create(nil);
  MDIChild.Show;
end;

procedure TMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action:= caFree;
end;

procedure TMDIChild.FormDestroy(Sender: TObject);
begin
  MDIChild:= nil; // necesario, evita repetir la creacion en MostrarChild
end;
end.

Y llamarlo desde el MDIForm de este modo:
Código Delphi [-]
uses Unit2;
....
begin
   TMDIChild.MostrarChild;
end;
En todos los casos tenés que quitar las ventanas hijas de auto-create forms.

Y otra, a mi gusto la mejor, es usar un patrón Singleton. Si buscas con ese término, hay mucho redactado al respecto .


Un saludo.

maeyanes 26-04-2011 03:15:42

Hola...

Solo para comentar que usar el método Show de un formulario con la propiedad FormStyle igual a fsMDIChild, es innecesario, ya que este tipo de formularios tiene su propiedad Visible en True, por lo que se muestra automáticamente al crearse.


Saludos...


La franja horaria es GMT +2. Ahora son las 04:33:49.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi