Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-06-2011
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 17
jafera Va por buen camino
Abrir solo una vez un MDIChild

Hola a todos.

Estuve buscando la forma de abrir una sola vez un form MDI y encontré varias soluciones en este foro.

Mi pregunta es si los ejemplos que vi, los cuales son basicamente en la llamada del form MDIChild desde el MDIPadre, se pueden aplicar entre dos MDIChild.

Por el momento si desde un child abro el otro child con un dobleclick en un dbgrid, funciona de maravilla. Si desde este segundo child vuelvo a llamar al primero, se me abre una nueva copia del form, cosa que no quiero, quiero que si existe el form llamado me lo muestre con los nuevos datos del registro actual.

He hecho pruebas y no me acaba de convencer pues al cerrar me da errores con el FreeAndNil, actualmente tengo action:=caFree;

Saludos
Responder Con Cita
  #2  
Antiguo 07-06-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola jafera.

Cita:
Si desde este segundo child vuelvo a llamar al primero, se me abre una nueva copia del form, cosa que no quiero
Una aplicación MDI está compuesta por ventanas hijas, área de cliente o frame y la ventana de clientes. Esta última es la que administra a todas las ventanas MDIChild que de ella dependen.
Para que no te suceda lo que comentas, es necesario que una ventana hija llame a otra mediante la ventana padre.

Para ejemplificar supongamos que tenemos: frmMain (MDIForm) con un TMainMenu y dos TMenuItem, cada uno de los cuales llama a las ventanas frmChild1 y frmChild2 (MDIChilds). En cada ventana hija, además tenemos un TButton que llama a la otra ventana hija.

frmMain:
Código Delphi [-]
implementation

uses Unit2, Unit3;

procedure TfrmMain.frmChild1AbrirClick(Sender: TObject);
begin
  TfrmChild1.Mostrar;
end;

procedure TfrmMain.frmChild2AbrirClick(Sender: TObject);
begin
  TfrmChild2.Mostrar;
end;

frmChild1:
Código Delphi [-]
implementation

uses Unit1;

class procedure TfrmChild1.Mostrar;
begin
  if not Assigned(frmChild1) then
    frmChild1:= TfrmChild1.Create(nil)
  else
    frmChild1.BringToFront;
end;

procedure TfrmChild1.btnShowChild2Click(Sender: TObject);
begin
  frmMain.frmChild2AbrirClick(Self); // llamar a otro MDIChild
end;

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

procedure TfrmChild1.FormDestroy(Sender: TObject);
begin
  frmChild1:= nil;  // necesario por: if not Assigned...
end;

frmChild2:
Código Delphi [-]
uses Unit1;

class procedure TfrmChild2.Mostrar;
begin
  if not Assigned(frmChild2) then
    frmChild2:= TfrmChild2.Create(nil)
  else
    frmChild2.BringToFront;
end;

procedure TfrmChild2.btnShowChild1Click(Sender: TObject);
begin
  frmMain.frmChild1AbrirClick(Self); // llamar a otro MDIChild
end;

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

procedure TfrmChild2.FormDestroy(Sender: TObject);
begin
  frmChild2:= nil; // necesario por: if not Assigned...
end;
De este modo no te abrirá una nueva copia del form MDIChild.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 07-06-2011 a las 12:54:44.
Responder Con Cita
  #3  
Antiguo 07-06-2011
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 17
jafera Va por buen camino
Gracias Ecfisa, como siempre al rescate de los Delphinaufragos.

Hay una cosa que no entiendo

De donde sale esta linea?

class procedure TfrmChild1.Mostrar;

Saludos
Responder Con Cita
  #4  
Antiguo 07-06-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por jafera Ver Mensaje
Gracias Ecfisa, como siempre al rescate de los Delphinaufragos.

Hay una cosa que no entiendo

De donde sale esta linea?

class procedure TfrmChild1.Mostrar;

Saludos
Es un método de clase, se aplica a una referencia de clase y no necesita de la existencia de una instancia de la misma para ser llamado.

La declaración iría en cada MDIChild:
Código Delphi [-]
type
  TfrmChild1 = class(TForm)
  private
  public
    class procedure Mostrar;
  end;

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 07-06-2011 a las 17:27:22.
Responder Con Cita
  #5  
Antiguo 07-06-2011
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 17
jafera Va por buen camino
Ahora que tengo 10 minitillos voy a ver si lo pruebo

Saludos
Responder Con Cita
  #6  
Antiguo 08-06-2011
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 17
jafera Va por buen camino
Código Delphi [-]
type
TfrmChild1 = class(TForm)
private
public
class procedure Mostrar;
end;

Hola de nuevo, no lo entiendo. si coloco la linea del class me dice que no puede compìlar



[Error] Parcs.pas(202): Unsatisfied forward or external declaration: 'TF_Parcs.Mostrar'

Que puedo estar haciendo mal?

Gracias
Responder Con Cita
  #7  
Antiguo 08-06-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Jafera.

Aparentemente te falta incluir la unidad en que está declarado 'TF_Parcs' tendría que mirar el código...

Mejor te pongo el código funcional del ejemplo de arriba así lo estudias con tranquilidad.

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 01-08-2011 a las 10:02:56.
Responder Con Cita
  #8  
Antiguo 08-06-2011
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 17
jafera Va por buen camino
Gracias Ecfisa

No se que pasa pero no puedo abrir los archivos zip adjuntos, no solo el tuyo, sino ninguno.

De momento lo he solucionado así y funciona

Código Delphi [-]
 
procedure TF_Parcs.JvDBGrid1DblClick(Sender: TObject);
begin
        if not Assigned(F_Camions) then
        begin
                F_Camions:=TF_Camions.Create(nil);
                F_ModulDades.Camions.Locate('ID',Camions_ParcID.Value,[]);
        end
        else
        begin
                F_ModulDades.Camions.Locate('ID',Camions_ParcID.Value,[]);
                F_Camions.BringToFront;
        end;
end;

Y en el formClose

Código Delphi [-]
 
Action:=caFREE;
Y en el formDestroy

Código Delphi [-]
 
F_Camions:=nil;

Saludos
Responder Con Cita
  #9  
Antiguo 08-06-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Jafera.
Cita:
No se que pasa pero no puedo abrir los archivos zip adjuntos, no solo el tuyo, sino ninguno.
Ya lo he comentado antes pero me pasaba lo mismo cuando usaba Internet Explorer en Club Delphi y no pude darle solución.
Por ese motivo empecé a usar Mozilla Firefox y nunca más tuve problemas.

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #10  
Antiguo 08-06-2011
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 17
jafera Va por buen camino
Ahora si lo he descargado con el Mozilla.

Hago pruebas

Saludos
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
Abrir formulario solo una vez morfeo21 Varios 6 12-06-2013 02:38:09
Abrir MDIChild desde otro totote Varios 9 24-09-2008 11:58:32
Abrir el programa solo una vez Paulao Varios 8 10-04-2008 11:15:30
Abrir un formulario hijo solo una vez Walterdf Varios 5 08-04-2008 17:15:01
Aplicacio abrir solo una vez Paulao Varios 1 03-04-2008 17:55:30


La franja horaria es GMT +2. Ahora son las 04:37: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
Copyright 1996-2007 Club Delphi