Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Cambiar propiedad de componente del formulario padre al cerrar el formulario hijo (https://www.clubdelphi.com/foros/showthread.php?t=45079)

jzginez 21-06-2007 23:51:02

Cambiar propiedad de componente del formulario padre al cerrar el formulario hijo
 
Hola amigos tengo una duda tengo un formulario principal en el cual solo tengo un menu, dependiendo de la opcion seleccionada del menu se muestra un segundo formulario con varios speedbutton, al hacer click en alguno de estos botonos este se queda sumido (para resaltar que opcion escogio el usuario) y se abre un tercer formulario.
Lo que quiero es que al cerrar el tercer formulario el speedButton el 2º formulario regrese a su estado normal (la propiedad down = false) ya se que lo mas facil seria en el evento onclose de la forma poner
Código Delphi [-]
formaMenu.SpeedButton1.down:= False;

Pero el chiste es que son varios botones y varias forma, lo que quiero por decirlo así es tener que estar poniendo esta linea en todas las formas (:D es una sola linea pero no importa) para darme a entender les escribo fracmento de todo mi código

Forma Principal
Código Delphi [-]
......
//declaracion de la clase form
  public
    { Public declarations }
    FormaMDI: boolean;
    FormaMenu: TFrmFB;
  end;
//otros procedimientos y variables de la forma
......
.......
//Este procedimiento lo asigno a todos los item del menu y segun la opción
//Seleccionada creo y muestro la forma corespondiente
procedure TFrmPrincipal.ActAbreModulos(Sender: TObject);
Var
  Numero: Integer;
  estado: Boolean;
Begin
  if Sender.ClassName = 'TMenuItem'
    Then Begin
      Numero:= TMenuItem(Sender).Tag;
      Estado:= TMenuItem(Sender).Checked;
    End
    Else Begin
      Numero:= TSpeedButton(Sender).Tag;
      Estado:= TSpeedbutton(Sender).Down;
    End;
  If Sender.ClassName = 'TMenuItem'
    Then TSpeedButton(FindComponent('SpeedButton'+IntToStr(Numero+1))).Down:= Estado
    Else TMenuItem(FindComponent('Submodulo'+IntToStr(Numero+1))).Checked:= Estado;
  If Not Estado
    Then Begin
      If Assigned(FormaMenu)
        Then Begin
          FormaMenu.Close;
          If FormaMenu.Visible
            Then FormaMenu.Visible:= False;
          FormaMenu:= Nil;
          FormaMenu.Free;
        End;
    End
    Else Begin
      If Assigned(FormaMenu)
        Then Begin
          if FormaMenu.Visible
            Then FormaMenu.Visible:= False;
          FormaMenu:= Nil;
          FormaMenu.Free;
        End;
      Case Numero of
        0: Begin
          If Not FormaMDI
            Then FormaMenu:= TFrmFBMenuClientes.Create(Application,ScrollBox1)
            Else FormaMenu:= TFrmFBMenuClientes.Create(Application);
          FormaMenu.Position:= poDesigned;
          FormaMenu.Visible:= True;
          End;
        1: Begin
          If Not FormaMDI
            Then FormaMenu:= TFrmFBMenuProveedores.Create(Application,ScrollBox1)
            Else FormaMenu:= TFrmFBMenuProveedores.Create(Application);
          FormaMenu.Position:= poDesigned;
          FormaMenu.Visible:= True;
          End;
        2: Begin
          If not FormaMDI
            Then FormaMenu:= TFrmFBMenuProductos.Create(Application,ScrollBox1)
            Else FormaMenu:= TFrmFBMenuProductos.Create(Application);
          FormaMenu.Position:= poDesigned;
          FormaMenu.Visible:= True;
          End;
        3: Begin
          If Not FormaMDI
            Then FormaMenu:= TFrmFBMenuProductos.Create(Application,ScrollBox1)
            Else FormaMenu:= TFrmFBMenuProductos.Create(Application);
          FormaMenu.Position:= poDesigned;
          FormaMenu.Visible:= True;
          End;
        4: Begin
          If Not FormaMDI
            Then FormaMenu:= TFrmFBMenuCatalogos.Create(Application,ScrollBox1)
            Else FormaMenu:= TFrmFBMenuCatalogos.Create(Application);
          FormaMenu.Position:= poDesigned;
          FormaMenu.Visible:= True;
          End;
    End;
  End;
End;

Con el código anterio abro la segunda forma que es la de los speedButton
Código Delphi [-]
//declaracion de la clase form
...................
  public
    { Public declarations }
    FormaHija: TFrmGB;
  end;
............
//otros procedimientos y variables de la forma
procedure TFrmFBMenuCatalogos.AbrirGridBase(Sender: tObject);
Begin
  CierraFormaHija;
  If TSpeedButton(Sender).Down
    Then Begin
      Case TSpeedButton(Sender).Tag of
        0: if FAsChild
            Then FormaHija:= TFrmGBClasificaciones.Create(Application,frmPrincipal.ScrollBox2)
            Else FormaHija:= TFrmGBClasificaciones.Create(Application);
        1: if FAsChild
            Then FormaHija:= TFrmGBDescuentos.Create(Application,frmPrincipal.ScrollBox2)
            Else FormaHija:= TFrmGBDescuentos.Create(Application);
        2: if FAsChild
            Then FormaHija:= TFrmGBImpuestos.Create(Application,frmPrincipal.ScrollBox2)
            Else FormaHija:= TFrmGBImpuestos.Create(Application);
        3: if FAsChild
            Then FormaHija:= TFrmGBTipoAlmacen.Create(Application,frmPrincipal.ScrollBox2)
            Else FormaHija:= TFrmGBTipoAlmacen.Create(Application);
        4: if FAsChild
            Then FormaHija:= TFrmGBFamilias.Create(Application,frmPrincipal.ScrollBox2)
            Else FormaHija:= TFrmGBFamilias.Create(Application);
        5: if FAsChild
            Then FormaHija:= TFrmGBCategorias.Create(Application,frmPrincipal.ScrollBox2)
            Else FormaHija:= TFrmGBCategorias.Create(Application);
      End;
      if FAsChild
        Then Begin
          if FrmPrincipal.CoolBar1.Bands.Count = 1
            Then FrmPrincipal.CoolBar1.Bands.Add;
          FrmPrincipal.CoolBar1.Bands.Items[1].Break:= True;
          FrmPrincipal.CoolBar1.Bands.Items[1].Control:= FormaHija.ToolBar2;
          FrmPrincipal.ScrollBox2.SetFocus;
        End
        Else Begin
          FormaHija.Position:= poDesigned;
          FormaHija.Left:= FrmPrincipal.FormaMenu.Left+ FrmPrincipal.FormaMenu.Width + 10;
          FormaHija.Top:= FrmPrincipal.FormaMenu.Top;
        End;
      FormaHija.Visible:= True;
    End;
End;
Ok este código es el que abre la tercera forma, lo que quisiera es poder poner algo como: formahija.buscaformapadre.buscaboton.Down:= False o en otras palabras desde la forma principal yo puedo escribir esto
Código Delphi [-]
FormaMenu.FormaHija.Label1.Caption:= 'forma normal';
lo que quisiera es viajar al reves:
Código Delphi [-]
formahija.formamenu.label1.caption:= 'al reves';

¿es posible esto?
Gracias
disculpen tanto rollo y código pero no se si me he logrado dar a entender

eduarcol 22-06-2007 00:19:09

Despues del dolor de cabeza que me dio tratar de entender esto resumo:
Quieres desde Form3 llamada desde Form2 cambiar algo en Form2, si se puede de hecho se llama referencias circulares:

Cita:

Empezado por IAN MARTEENS
Cuando existen referencias circulares entre pares de unidades, solo hay que tener en cuenta una regla: debido a problemas tecnicos de compilacion, no se admiten referencias circulares cuando ambas unidades se refieren entre si desde sus respectivas interfaces. una de las unidades debe referenciar la otra desde el uses de la seccion de implementacion

por ejemplo:

unit2 = Form2 //Aqui se llama a form3
unit3 = Form3

en la interface de unit2 declaras a unit3

en la implementacion de unit 3 quedaria algo asi

Código Delphi [-]
implementation
uses unit2;

y en el evento on close de form3 ya podras referenciar a Form2


Si no es este el problema o entendi mal te agradezco me digas para poder seguir ayudandote

Lepe 22-06-2007 01:15:47

Por cierto, bonito Access Violation tienes aquí:
Código Delphi [-]
          FormaMenu:= Nil;
          FormaMenu.Free;

Te deben gustar mucho cuando repites ese código ;) :D

Te sugiero cambies esas dos líneas por: FreeAndNil(FormaMenu);

Saludos

Neftali [Germán.Estévez] 22-06-2007 10:10:31

Tal vez es darle muchas vueltas al caso, pero si por lo que sea no puedes añadir al form1 al uses del form2 o necesitas agrupar el código, puedes añadir un nuevo evento al segundo formulario y enlazarlo desde el primero.

En el formulario hijo añades un evento
Código Delphi [-]
    //: Evento que lanzaremos al cerrar
    property OnCloseForm:TNotifyEvent read FOnCloseFrom write FOnCloseFrom;

Y luego desde cualquier otro formulario puedes enlazarlo. Así cuando cierras el form hijo, salta este evento y ejecutas el código necesario.
La ventaja que le veo es que de esta forma la programación que debes hacer en el padre al cerrar el form hijo está programada dentro del padre.

No se si me he explicado. Mejor os adjunto el ejemplo; Lo subo al FTP.
Añadir eventos en forms.ZIP

jzginez 22-06-2007 19:20:48

Antes que nada les agradesco la ayuda

Cita:

Empezado por eduarcol
Despues del dolor de cabeza que me dio tratar de entender esto .........

:eek: a mi me sigue doliendo y aun no se como darme a entender :D

Cita:

Empezado por Lepe
Por cierto, bonito Access Violation tienes aquí:.....
Te sugiero cambies esas dos líneas por: FreeAndNil(FormaMenu);.......
Saludos

Las escribia alrevez
Código Delphi [-]
 FormaMenu.Free;
FormaMenu:= Nil;
y ahí si me marcada error pero lo voy a cambiar por la que me recomiendas gracias.

En cuanto al lo que estoy intentando hacer con mi sistema dicen que en la simplesa esta la luz, así que mas facil les mando el código fuente (ftp://200.67.246.247/deportes/ copien y pegen la dirección porque si no no se conecta a mi servidor ftp), lo que quiero es que en la forma FrmGB programar el evento onclose y en este decirle que busque la forma FrmFBMenuXXXXXX y de esta forma el speedbutton que tiene su propiedad down en verdadero y la ponga en falso o que ejecute su evento click (esto seria lo ideal).

las condiciones de uso del sistema, en el primer messagebox hay que responder que No, en el menú modulo la única opción que esta programada es la de catálogos y de esa los primeros 4 Speedbutton, en cuanto a los componestes y accesos a base de datos los borre para que no les den esto problemas.

Gracias

roman 22-06-2007 21:40:51

Cita:

Empezado por jzginez
Las escribia alrevez
Código Delphi [-]
FormaMenu.Free;
FormaMenu:= Nil;

y ahí si me marcada error pero lo voy a cambiar por la que me recomiendas gracias.

Debes estar cargando algún error que no creo que FreeAndNil solucione. FreeAndNil no hace otra cosa que Free and Nil :D, esto es, las líneas que ya tienes. Al intercambiarlas (primero nil y luego Free) no notas ningún error porque simplemente estás haciendo un Free de un objeto nil, lo cuál es seguro, y de hecho es la razón por la que debe usarse Free en lugar de Destroy:

Cita:

Empezado por Ayuda de Delphi
Free is successful even if the object is nil; so if the object was never initialized, Free won’t result in an error.

Pero claro que entonces el objeto al cual apuntaba FormaMenu, se queda en la memoria por lo cual tampoco es una solución.

// Saludos


La franja horaria es GMT +2. Ahora son las 13:54:15.

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