Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-07-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 19
Angel.Matilla Va por buen camino
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?
Responder Con Cita
  #2  
Antiguo 03-07-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Le he preguntado a chatgpt 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;
Responder Con Cita
  #3  
Antiguo 03-07-2023
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.586
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Angel.Matilla Ver Mensaje
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 05-07-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 19
Angel.Matilla Va por buen camino
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();
}
Responder Con Cita
  #5  
Antiguo 05-07-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 19
Angel.Matilla Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Evitar items duplicados en listbox querecuto Lazarus, FreePascal, Kylix, etc. 2 01-06-2016 17:26:56
Evitar duplicados en checklistbox CoCaInE Varios 1 16-07-2012 11:35:28
Evitar guardar datos duplicados bigpeter80 Varios 16 29-11-2008 15:10:02
sugerencia para evitar clientes duplicados Patricio Varios 2 06-11-2008 19:54:00
Evitar duplicados hectorin Conexión con bases de datos 2 29-10-2004 17:37:25


La franja horaria es GMT +2. Ahora son las 20:06:54.


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
Copyright 1996-2007 Club Delphi