Ver Mensaje Individual
  #2  
Antiguo 12-07-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Reputación: 27
delphi.com.ar Va por buen camino
Tienes que pensar que un formulario es un objeto como cualquier otro, ¿Cómo harías para que un objeto no cree mas de una vez?

La primer solución básica es usando banderas, simplemente teniendo una bandera para saber si creamos un objeto o no, pero si este objeto se lo asignamos a una variable... ¿Para que vamos a tener otra?, por eso podríamos extender este concepto, y podríamos preguntar si la variable donde vamos a cargar este formulario esta asignada o no, y en este caso tenemos que tener la precaución que al liberarse limpiar el contenido de la variable.
Código Delphi [-]
procedure TfrmMDI.Menu1Click(Sender: TObject);
begin
  if frmChild = Nil Then
    frmChild := TfrmChild.Create(Self);
end;
Código Delphi [-]
procedure TfrmChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  frmChild := Nil;
end;

Ahora, muchos programadores no utilizamos la variable global que nos crea automáticamente el IDE al crear un TForm, simplemente porque podríamos tener mas de una instancia del formulario (que este no es el caso), o porque no vamos a darle utilidad porque nunca haremos referencia al formulario desde fuera de la implementación de la clase, o simplemente por cuestión de gustos. En este caso podríamos implementar otras soluciones, de las cuales te voy a comentar dos, la primera es desactivar el control que usa el usuario para crear el formulario, simplemente:
Código Delphi [-]
procedure TfrmMDI.Menu1Click(Sender: TObject);
begin
  TfrmChild.Create(Self);
  Menu1.Enabled := False;
end;
Código Delphi [-]
procedure TfrmChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  frmMDI.Menu1.Enabled := True;
end;

Otra opción, puede ser, buscar si nuestro formulario ha sido creado previamente en la colección de formularios del objeto Screen:

Código Delphi [-]
function CheckForm(AFormClass: TFormClass): boolean;
var
  i: Integer;
begin
  Result := False;
  for i := 0 to Screen.FormCount -1 do
    if Screen.Forms[i] is AFormClass Then
    begin
      Result := True;
      Screen.Forms[i].BringToFront;
      Break;
    end;
end;

procedure TfrmMDI.Menu1Click(Sender: TObject);
begin
  if not CheckForm(TfrmChild) then
    TfrmChild.Create(Self);
end;

¿Has visto algo nuevo?… ¿no es simplemente el mismo trato que se le da a cualquier objeto?

Saludos!, espero que te sea de utilidad
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita