Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Problema con Jerarquias en un Componente (https://www.clubdelphi.com/foros/showthread.php?t=34644)

chrids506 16-08-2006 18:25:02

Problema con Jerarquias en un Componente
 
Saludos comunidad, mi pregunta es relacionada con el componente que estoy haciendo, es un decendiente de un TPanel, pero tiene que crear otro panel adentro por ejemplo,

Form1
-Panel1
--Panel2

hasta ahí todo bien, pero a la hora de revisar el arbol de componentes aparece

Form1
-Panel1

y el panel 2 ni idea, aunque existe no aparece, mi pregunta como debo crear el panel 2 para que aparezca correctamente?

Gracias de antemano,
Saludos,
Chrids

maeyanes 16-08-2006 18:50:49

Como estás creando el panel dos?

Le estás asignando su propiedad Parent? Esta debe apuntar al Panel1 que es el que lo va a contener:

Código Delphi [-]
constructor TMiPanel.Create(AOwner: TComponent);
begin
  inherited;
  FPanelHijo := TPanel.Create(Self); // Creo panel2 y su owner es panel1
  FPanelHijo.Parent := Self; // Panel2 se muestra dentro de panel1
  // Sigo inicializando mi componente...
end;

Saludos...

chrids506 16-08-2006 19:01:08

así lo creo, pero no se que hago mal

FPanelTit representa al Panel2

Código Delphi [-]
constructor TExpPanel.Create(AOwner : TComponent);
begin
   inherited Create(AOwner);       {Llama al constructor original (heredado)}

   //////////////////Panel2 >>>
    FPanelTit := TPanel.Create(self);  {Creamos el Panel}
    FPanelTit.Height := 60;
    FPanelTit.width := width;
    FPanelTit.top := 0; 
    FPanelTit.left := 0;
    FPanelTit.parent := self;
    FPanelTit.visible := true;

  ...

roman 16-08-2006 19:15:23

Creo que tienes que añadir:

Código Delphi [-]
FPaneTit.SetSubcomponent(true);

para que el IDE no se confunda y sepa que FPanelTit pertenece al ExpPanel y no al formulario donde lo colocas.

// Saludos

maeyanes 16-08-2006 19:18:18

Lo que sucede es que el panel que creas de esta forma no se guarda en la forma al no ser su owner la forma.

Para lograr lo que quieres, tienes que redefinir el método GetChildren de tu componente:

Código Delphi [-]
procedure TExpPanel.GetChildren(Proc: TGetChildProc; Root: TComponent);
begin
  Proc(FPanelTit)
end;

Para más información busca en la ayuda de Delphi...


Saludos...

chrids506 16-08-2006 19:20:06

Muchas gracias lo voy a probar

chrids506 16-08-2006 19:26:05

a ver si entendí, agrego esto en los protected:

Código Delphi [-]
   protected
    { Protected declarations }
   procedure GetChildren(Proc: TGetChildProc; Root: TComponent);

agrego este procedimiento:

Código Delphi [-]
procedure TExpPanel.GetChildren(Proc: TGetChildProc; Root: TComponent);
begin
  Proc(FPanelTit)
end;

y lo creo así:

Código Delphi [-]
constructor TExpPanel.Create(AOwner : TComponent);
begin
   inherited Create(AOwner);       {Llama al constructor original (heredado)}

   //////////////////Panel2 >>>
    FPanelTit := TPanel.Create(self);  {Creamos el Panel}
    FPanelTit.Height := 60;
    FPanelTit.width := width;
    FPanelTit.top := 0; 
    FPanelTit.left := 0;
    FPanelTit.parent := self;
    FPanelTit.visible := true;

  ...

o no?

P.D.:Muchas gracias a los 2 por el tiempo que han dedicado a responderme

maeyanes 16-08-2006 19:30:37

Así es, solo que en la declaración del método tienes que poner la directiva override.

También puedes probar el método que comentó Román, puede que simplifique más las cosas. La verdad no sabía que existía ese método.


Saludos...

roman 16-08-2006 19:36:30

Hace mucho tiempo que no hago estas cosas pero creo recordar que SetSubcomponent apareció en no se cuál versión para facilitar lo que antes se hacía como indica Marcos.

// Saludos

chrids506 16-08-2006 19:37:41

Muchas gracias, probaré los 2

chrids506 16-08-2006 19:42:00

Entonces según la tecnica que propones el componente se tendría que crear así:

Código Delphi [-]
constructor TExpPanel.Create(AOwner : TComponent);
begin
   inherited Create(AOwner);       {Llama al constructor original (heredado)}

   //////////////////Panel2 >>>
    FPanelTit := TPanel.Create(self);  {Creamos el Panel}
   
    FPanelTit.SetSubcomponent(true);
   
    FPanelTit.Height := 60;
    FPanelTit.width := width;
    FPanelTit.top := 0; 
    FPanelTit.left := 0;
    FPanelTit.parent := self;
    FPanelTit.visible := true;

  ...

verdad?


La franja horaria es GMT +2. Ahora son las 17:56:58.

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