Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-06-2007
Avatar de jzginez
jzginez jzginez is offline
Miembro
 
Registrado: sep 2003
Ubicación: Puebla, México
Posts: 247
Poder: 21
jzginez Va por buen camino
Talking 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 ( 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
__________________
Espero poder seguir exprimiéndote el cerebro 8)
Jorge Zamora Ginez
Puebla, Pue. México
Responder Con Cita
  #2  
Antiguo 22-06-2007
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
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
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #3  
Antiguo 22-06-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Por cierto, bonito Access Violation tienes aquí:
Código Delphi [-]
          FormaMenu:= Nil;
          FormaMenu.Free;

Te deben gustar mucho cuando repites ese código

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

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #4  
Antiguo 22-06-2007
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.233
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
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
__________________
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 22-06-2007
Avatar de jzginez
jzginez jzginez is offline
Miembro
 
Registrado: sep 2003
Ubicación: Puebla, México
Posts: 247
Poder: 21
jzginez Va por buen camino
Antes que nada les agradesco la ayuda

Cita:
Empezado por eduarcol
Despues del dolor de cabeza que me dio tratar de entender esto .........
a mi me sigue doliendo y aun no se como darme a entender

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
__________________
Espero poder seguir exprimiéndote el cerebro 8)
Jorge Zamora Ginez
Puebla, Pue. México
Responder Con Cita
  #6  
Antiguo 22-06-2007
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 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 , 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
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 cerrar un formulario desde un componente genius Varios 1 23-11-2006 16:55:42
Problema Con formulario Hijo JELIRM Varios 5 10-04-2006 18:45:42
Ayuda con formulario hijo.... ronimaxh Varios 10 26-02-2004 23:11:11
Acceso a componente de formulario padre???? mguixot OOP 6 11-06-2003 14:54:19
Tamaño formulario hijo craven Varios 1 22-05-2003 01:13:33


La franja horaria es GMT +2. Ahora son las 16:49:06.


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