Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-03-2009
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Post Mdi no repetir ventanas abiertas

Hola compañeros, llevo un tiempo desconectado del club por motivos personales y laborales, me guataria que me ayudaseis con el siguiente problema que tengo:

Tengo una Form padre y una serie de foms hijos, que creo según se solicita, no tengo problemas a la hora de crarlos, mediante

Código Delphi [-]
Tform.create(self);

Ni al destruirlos mediante el siguiente codigo en el evento Onclose del Form

Código Delphi [-]
Action:=Canfree;

El problema es que no se como evitar que si e abierto el Form de clientes lo pueda abrir de nuevo .
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #2  
Antiguo 01-03-2009
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Tienes varias formas de hacerlo, yo normalmente lo hago así:
Tengo una unit de funciones comunes y entre ellas está esta:

Código:
function AbreForm (Cclase : TFormClass; bMostrar: boolean; var Fnombre) : boolean;
(* bMostrar indica si el formulario se visualizará o no *)
var
  F : TForm;
begin
  result := true;
  F := Application.FindComponent (copy(cClase.ClassName,2,255)) as TForm;
  if assigned(F) and bMostrar then
  begin
    F.Show;
  end
  else
  begin
    try
      Application.CreateForm (Cclase, Fnombre);
      if bMostrar then
        (Application.FindComponent (copy(cClase.ClassName,2,255)) as TForm).Show;
    except
      if assigned(TForm(Fnombre)) then
        Error(3, TForm(Fnombre).name)
      else
        Error (3,'');
      result := false;
    end;
  end;
end;
Y la llamada sería algo así:
Código:
AbreForm(TFentradaUsuario,False,FentradaUsuario);
FentradaUsuario.ShowModal;
Si ya está creada (asignada), entonces se abre. Si no lo está, se crea.
También se puede hacer directamente;
Código:
AbreForm(TFentradaUsuario,True,FentradaUsuario);
Responder Con Cita
  #3  
Antiguo 01-03-2009
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Gracias por tu rápida respuesta Casimiro, me parase una idea genial lo de agregarla a un unit de funciones, lo probare a partir de mañana y te digo como me fue. Un día de estos tendrimaos que juntar las funciones que usamos en un único fichero de todos los miembros, nos ayudaría mucho.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #4  
Antiguo 02-03-2009
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.285
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
Creo que para esto se pueden usar las propiedades MDIChildCount y MDIChildren de TForm.

Por ejemplo para un form2 se puede preguntar si ya está entre los que están creados/abiertos.

Código Delphi [-]
var
  i:Integer;
begin

  // Revisar los formularios...
  for i := 0 to (Self.MDIChildCount - 1) do begin
    if (Self.MDIChildren[i] = form2) then begin
      // Nada
      MessageDlg('Ya está abierto...', mtInformation, [mbOK], 0);
      Exit;
    end;
  end;

  // Si llega a quí es que hay que crearlo.
  form2 := TForm2.Create(Self);

Puedes colocarlo dentro de un procedimiento para automatizarlo...
__________________
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
  #5  
Antiguo 02-03-2009
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Todos los días se aprende algo , nunca me había interesado por saber para qué servían esas propiedades tan "raras", incluso alguna vez he llegado a implementar algo parecido usando la propiedad 'tag'...
Responder Con Cita
  #6  
Antiguo 02-03-2009
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Personalmente me gusta la idea de trabajar con una funcion, pero también admito que es más lógico el método de Neftali para las MDI. De Todas maneras me da un error en la funcion Casimiro, imagino que por culpa de algún uses?, el error es Operator semi colon justo en
Código Delphi [-]
Error(3, TForm(Fnombre).name)
, si me podéis decir cual es el problema y como se podría, si es posible convertir el método proporcionado por Neftali a una funcion. Muchas Gracias
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #7  
Antiguo 02-03-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¿Y pr qué no algo como esto?

Código Delphi [-]
procedure FormHijoClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  FormHijo := nil;
end;

Y para abrir el formulario hijo:

Código Delphi [-]
if not Assigned(FormHijo) then
  FormHijo := TFormHijo.Create(nil);

// Saludos
Responder Con Cita
  #8  
Antiguo 03-03-2009
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por José Luis Garcí Ver Mensaje
De Todas maneras me da un error en la funcion Casimiro, imagino que por culpa de algún uses?, el error es Operator semi colon justo en Código Delphi [-]Error(3, TForm(Fnombre).name)
Bueno, es que es un procedimiento mio, algo así:
Código:
procedure Error (iNumError : integer; cTexto : string);
var
  cE : string;
begin
  case iNumError of
    0 : cE :=  cTexto;
    1 : cE :=  cTexto;
    2 : cE :=  cTexto;
    3 : cE := 'Error al crear el formulario ' + cTexto;
    4 : cE := 'Error al cerrar el formulario ' + cTexto;
...
...
Responder Con Cita
  #9  
Antiguo 03-03-2009
Avatar de rcarrillom
[rcarrillom] rcarrillom is offline
Miembro Premium
 
Registrado: dic 2004
Ubicación: UK / North Sea / Norway / Golfo de México / Frente a mi Laptop
Posts: 219
Poder: 20
rcarrillom Va por buen camino
Olvídense de escribir más código , las Rx tienen la función FindShowForm en su unidad AppUtils que ya lo implementa; las Rx ya fueron integradas en las jcl y jvcl, si tienen éstos paquetes instalados, pues ya está.

Cita:
FindShowForm function


--------------------------------------------------------------------------------

Unit
AppUtils

Declaration
Código Delphi [-]
function FindShowForm(FormClass: TFormClass; const Caption: string): TForm;

Description
FindShowForm returns the windowed Delphi's form whose class is identified by the specified class name FormClass and (or) window caption passed as Caption.

If FormClass is not the name of the class of an existing form, FindShowForm creates new form by calling Application.CreateForm. For found or created form the Show method is called.

FindShowForm example:

Código Delphi [-]
procedure MainForm.ShowFormItemClick(Sender: TObject);
begin
FindShowForm(TForm1, '');
end;
__________________
eLcHiCoTeMiDo - Rompecorazones profesional
Yo no soy presumido; ¿Pero de qué sirve mi humilde opinión contra la de los espejos?
Salva a un nylon, usa prendas de piel de foca
Responder Con Cita
  #10  
Antiguo 03-03-2009
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.285
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 rcarrillom Ver Mensaje
Olvídense de escribir más código , las Rx tienen la función FindShowForm en su unidad AppUtils que ya lo implementa; las Rx ya fueron integradas en las jcl y jvcl, si tienen éstos paquetes instalados, pues ya está.
Ya estará, pero me parece un poco exagerado añadir las Rx al proyecto () o la JCL+JVCL () para no programar 4 líneas de texto.

Para pensárselo...
__________________
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
  #11  
Antiguo 03-03-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por rcarrillom
las Rx tienen la función FindShowForm
Pues sí, pero tanto FindComponent como FindShowForm hacen un ciclo en búsqueda del formulario. Ese ciclo no es necesario si se asegura poner la referencia al formulario en nil. Sí, sí, ya sé, apenas ganaremos medio milisegundo, pero algo es algo

// Saludos
Responder Con Cita
  #12  
Antiguo 03-03-2009
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Gracias a todos por vuestras respuestas, la verdad es que Perdón pero acojonais, si hay tantas respuestas para una solucion tan simple y yo con más de 20 libros de delphi, la busqueda en el club y en google, no doy pie con bola es que soy muy malo y estoy muy desfasado.

Esto de programar para no quedarme desfasado, me esta costando y no se si me merece la pena seguir, por que noto que cada vez tengo más conceptos a los que no doy pie con bola. Con lo Facil que ere programar con clipper y lo controladito que lo tenia.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #13  
Antiguo 04-03-2009
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Clipper era pequeñito en comparación con los sistemas actuales, no son comparables, aunque finalmente sirvan para lo mismo, para guardar y extraer información.
No debes rendirte, escoge la forma que te resulte más cómoda o más clara, o más simpática, o más simple, o más elegante, o más enrevesada... da igual, mientras funcione
Responder Con Cita
  #14  
Antiguo 04-03-2009
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Gracias Amigo, llevo años peleándome con delphi y no pienso abandonarlo, aunque me tienta cosmos y velneo, pero no dejando delphi.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #15  
Antiguo 04-03-2009
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Yo uso esta función simplona que crea un formulario MDI o lo muestra si ya existe:

Código Delphi [-]
Type
 TFormClass = class of TForm;

Procedure CreateMDI(Owner:TForm;BaseClass:TFormClass;  FormVar:TForm);
var
found:Boolean;
i:integer;

begin
  found := FAlse;
  // recorremos el array de ventanas hijas
  For i:= 0 To Owner.MDIChildCount-1 Do
    If Owner.MDIChildren[i] is BaseClass Then
    Begin
      Owner.MDIChildren[i].Show;
      found := True;
    End;
  if not found then
    Application.CreateForm(BaseClass,FormVar);
end;

forma de Uso:
Código Delphi [-]
 CreateMDI(Application.MainForm, TMiForm, FMiForm);

Y voilá...reconozco que esta medio chapuceron pero hasta ahora me ha funcionado bien y simple, si la ventana no existe la crea, si ya existe la muestra.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #16  
Antiguo 05-03-2009
jconnor82 jconnor82 is offline
Miembro
 
Registrado: feb 2008
Posts: 22
Poder: 0
jconnor82 Va por buen camino
Ya q todos estan colocando sus rutinas ponga la mia

No modal

Código Delphi [-]
procedure FormShowEx(AOwner: TComponent; AClass: TFormClass);
var
  Form: TForm;
  I: Integer;
begin
  {Verifica si el formulario ha sido creado anteriormente}
  Form := nil;
  for I := 0 to Screen.FormCount - 1 do
    if Screen.Forms[i].ClassType = AClass then
    begin
      Form := Screen.Forms[i];
      Break;
    end;
  if Form = nil then
    Form := AClass.Create(AOwner);
  Form.Show;
  Form.BringToFront;
end;

Modal

Código Delphi [-]
function FormShowModalEx(AOwner: TComponent; AClass: TFormClass): Integer;
var
  I: Integer;
begin
  for I := 0 to Screen.FormCount - 1 do
    if Screen.Forms[i].ClassType = AClass then
    begin
      Screen.Forms[i].Show;
      Screen.Forms[i].BringToFront;
      Result := mrNone;
      Exit;
    end;

  with AClass.Create(AOwner) do
    try
      Result := ShowModal;
    finally
      Free;
    end;
end;
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
Barra de ventanas abiertas Vlady OOP 3 10-02-2009 10:40:12
Saber cuantas ventanas tengo abiertas caifan_0883 API de Windows 0 22-10-2008 00:26:55
For a todas las ventanas abiertas. rauros Varios 1 03-08-2008 22:07:59
Cantidad de VEntanas abiertas Paradiso Varios 1 22-06-2006 02:42:51
Ventanas abiertas Isaac Varios 3 11-02-2004 16:44:37


La franja horaria es GMT +2. Ahora son las 05:59:59.


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