Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Evitar formularios duplicados (https://www.clubdelphi.com/foros/showthread.php?t=96287)

Angel.Matilla 03-07-2023 11:08:54

Evitar formularios duplicados
 
Tengo una aplicación en BCB6 en la que varios de los formularios están definidos como fsMDIChild. Lo que me está pasando, que no se me había ocurrido, es que se puede abrir cada uno de estos formularios más de una vez y no se me ocurre como evitarlo. En el lanzador de la aplicación, para evitar que se lance dos veces, tengo definido este código:
Código:

AnsiString cVersion = "GesInt v. 1.5." + FileDateToDateTime(FileAge(Application->ExeName)).FormatString("yy") + FormatFloat("000", DayOfTheYear(FileDateToDateTime(FileAge(Application->ExeName))));
HWND OtraVentana = FindWindow(NULL, cVersion.c_str());
if (OtraVentana != NULL)
{
    Application->MessageBox("¡¡¡LA APLICACIÓN YA ESTÁ ACTIVA!!!", cVersion.c_str(), 48);
    ShowWindow(OtraVentana, SW_RESTORE);
    SetForegroundWindow(OtraVentana);
    return 0;
}

Lo he probado antes de hacer el Application->CreateForm pero no me ha funcionado bien. ¿Hay alguna manera de evitar que se abra más de una vez cada formulario?

Casimiro Notevi 03-07-2023 13:29:52

Le he preguntado a chatgpt :D y dice esto:

Código Delphi [-]
var
  FormularioAbierto: Boolean = False;
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  if FormularioAbierto then
  begin
    Close;
    Exit;
  end;

  // Resto del código de inicialización del formulario
end;
Código Delphi [-]
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FormularioAbierto := False;
end;
Código Delphi [-]
procedure TFormMain.AbrirFormularioClick(Sender: TObject);
begin
  if not Assigned(Formulario) then
  begin
    Formulario := TFormulario.Create(Self);
    Formulario.Show;
  end
  else
  begin
    Formulario.Visible := True;
    Formulario.BringToFront;
  end;
end;

Neftali [Germán.Estévez] 03-07-2023 13:45:18

Cita:

Empezado por Angel.Matilla (Mensaje 551938)
Tengo una aplicación en BCB6 en la que varios de los formularios están definidos como fsMDIChild. Lo que me está pasando, que no se me había ocurrido, es que se puede abrir cada uno de estos formularios más de una vez y no se me ocurre como evitarlo.

La duda (y que cambia la respuesta) es ¿cómo estás creando los formularios?

a) Si estás usando las variables globales para los formularios debería bastar con preguntar si la variable está asignada o no y al cerrar el formulario asegurarte de ponerla a nil.

b) Si no estás usando variables globales, sino que los creas "al vuelo", deberás detectarlo, por ejemplo por la clase. O puedes almacenar una lista con los formularios creados. O determinar el criterio para la no duplicidad; Por ejemplo, poder abrir 2 formularios de cliente, pero NO 2 del mismo cliente.
En estos casos puedes consultar la lista de formularios creados usando TScreen.FormCount y TScreen.Forms (https://docwiki.embarcadero.com/Libr...een_Properties) o llevar la lista tú mismo.

Angel.Matilla 05-07-2023 11:57:16

Gracias por las respuestas. Las propiedades TScreen->FormCount y TScreen->Forms no las conocía y creo que me va a ser muy útiles. Los formularios los voy creando cuando se pulsa la opción donde hacen falta.
Cita:

void __fastcall TfMenu::GesAfiClick(TObject *Sender)
{
Application->CreateForm(__classid(TfPersona), &fPersona);
fPersona->Show();
}

Angel.Matilla 05-07-2023 12:17:37

Efectivamente me va valido. El código ha quedado así:
Código:

void __fastcall TfMenu::GesAfiClick(TObject *Sender)
{
    bool lExiste = false;

    for (nItem = 0; nItem < Screen->FormCount; nItem ++)
    {
          if (Screen->Forms[nItem]->Name == "fPersona")
          {
              lExiste = true;
              break;
          }
    }

    if (!lExiste)
          Application->CreateForm(__classid(TfPersona), &fPersona);
    fPersona->Show();
}

Gracias a los dos por las sugerencias.


La franja horaria es GMT +2. Ahora son las 17:04:47.

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