Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Componente dentro de otro aparece la ventana de ordenación de acceso (https://www.clubdelphi.com/foros/showthread.php?t=91371)

Jose_Pérez 19-01-2017 14:12:23

Componente dentro de otro aparece la ventana de ordenación de acceso
 
2 Archivos Adjunto(s)
Hola:

Estoy trabajando con Delphi 5. He desarrollado un componente que, a su vez, utiliza un componente ya existente. Funciona muy bien. El problema es que el componente incluido dentro del desarrollado por mí se muestra en la ventana de ordenación de acceso (tab edit order), no así en el inspector de objetos. ¿Qué estoy haciendo mal?

Además, en tiempo de diseño al pasar el ratón sobre el componente en desarrollo, en la eqtiqueta emergente (hint) se muestra el componente incluido.

Por favor, ver código y jpeg adjuntos.

Código Delphi [-]


  TSpecialEdit = class(TEdit)
  private
    FDateEdit: TNewDateEdit;


Constructor TSpecialEdit.Create(AOwner: TComponent);
Begin

  Inherited Create(AOwner);

  FDateEdit:=TNewDateEdit.Create(Self);

  // Inicialmente el componente no está visible

End;

// Cuando se da una condición lo hago visible asignandole la propiedad Parent.

procedure TSpecialEdit.WMPaint(var Message: TWMPaint);
begin

 inherited;

  If Condicion Then
     begin

     If FDateEdit.Parent=Nil Then
        FDateEdit.Parent:=Parent

     end
     else
     FDateEdit.Parent:=Nil;

end;

AgustinOrtu 19-01-2017 17:16:47

Hay varias formas de tratar con componentes anidados. Hay una presentación de Ray Konopka del CodeRage X que explica muy claramente unas 3 variantes, te recomiendo que la mires

Una alternativa es utilizar sub componentes. Esto sería como el caso del TLabeledEdit en donde todas las propiedades del TLabel están disponibles para modificar.

Otra forma es publicar las propiedades del sub componente que te interesan modificar. De este modo se promueve el encapsulamiento

Revisa este link http://etutorials.org/Programming/ma...nd+Components/

Jose_Pérez 20-01-2017 11:58:44

Cita:

Empezado por AgustinOrtu (Mensaje 512463)
Hay varias formas de tratar con componentes anidados. Hay una presentación de Ray Konopka del CodeRage X que explica muy claramente unas 3 variantes, te recomiendo que la mires

Un artículo muy interesante. Pero fíjate que los componentes que utiliza de ejemplo (TTimer, TLabel y TBevel) ninguno puede tomar el foco de entrada, por lo tanto, no aparecen nunca en las ventana de ordenación de acceso. Además no aporta nada nuevo a mi código, al menos en Delphi 5.

Cita:

Empezado por AgustinOrtu (Mensaje 512463)
Una alternativa es utilizar sub componentes. Esto sería como el caso del TLabeledEdit en donde todas las propiedades del TLabel están disponibles para modificar.

Otra forma es publicar las propiedades del sub componente que te interesan modificar. De este modo se promueve el encapsulamiento

No es esto lo que busco.

Muchas gracias por tu amable respuesta.

Jose_Pérez 20-01-2017 13:28:31

Revisando un poco mi código, me he dado cuenta que quizás el problema está al asignar la propiedad parent. En lugar de FDateEdit.Parent:=Self (mi component) le asigno FDateEdit.Parentt:=Parent (la ventana que lo contiene) para que FDateEdit (es un botón de edición) se muestre junto al TSpecialEdit. Mii intención es encapsular los dos componentes para que parezcan uno solo.

Código Delphi [-]

// Cuando se da una condición lo hago visible asignandole la propiedad Parent.

procedure TSpecialEdit.WMPaint(var Message: TWMPaint);
begin

 inherited;

  If Condicion Then
     begin

     If FDateEdit.Parent=Nil Then
        FDateEdit.Parent:=Parent {<- probablemente el problema está aquí}

     end
     else
     FDateEdit.Parent:=Nil;

end;


La franja horaria es GMT +2. Ahora son las 10:25:57.

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