Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Transferir propiedades a un hijo (https://www.clubdelphi.com/foros/showthread.php?t=24935)

elcigarra 07-09-2005 04:20:31

Transferir propiedades a un hijo
 
Vuelvo al ejemplo de mi hilo anterior:

Supongan que tengo un componente de tipo TCustomControl. Dentro de él, entre las variables privadas creo una (FEdit) de tipo TEdit. y dentro del constructor:

Código Delphi [-]
 constructor Create(AOwner: TComponent);
 begin
   inherited create(AOwner);
   FEdit := TEdit.create(self);
   FEdit.Parent := self;
   {...}
 end;
Ahora... como el componente que registro es de tipo TCustomControl, obviamente solo estarán publicadas (published) en diseño las propiedades del mismo, y ninguna del TEdit;

Supongan que yo quiero que aparezcan publicadas TAMBIEN las del componente hijo (o sea en nuestro caso las del EDIT). Hay alguna forma de hacerlo en bloque o la única forma es hacer:

Código Delphi [-]
 TMicomp.SetPropiedad(Value: {...});
 begin
   {...}
   FPropiedad := Value;
   FEdit.FPropiedad:=Value;
   {...}
 end;
para cada una?.

Además de ser tedioso y excesivamente extenso en código la verdad no estoy seguro como hacer para hacer una propiedad falsa para el componente padre del tipo compatible con la del TEdit en el caso que solo esté definida en su clase, p.ej "CharCase".

roman 07-09-2005 05:42:56

¿Por qué no simplemente publicas toda la subcomponente?

Código Delphi [-]
type
  TMiControl = class(TCustomControl)
  private
    FEdit: TEdit;
    procedure SetEdit(Value: TEdit);

  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

  published
    property Edit: TEdit read FEdit write SetEdit;
  end;

implementation

{ TMiControl }

constructor TMiControl.Create(AComponent: TComponent);
begin
  inherited;

  FEdit := TEdit.Create(Self);
  FEdit.Parent := Self;
  FEdit.SetSubComponent(true);
end;

destructor TMiControl.Destroy;
begin
  FEdit.Free;
  inherited;
end;

procedure TMiControl.SetEdit(const Value: TEdit);
begin
  FEdit.Assign(Value);
end;

De esta manera la propiedad Edit aparecerá en el inspector de objetos similar, por ejemplo, a la propiedad Font del formulario: con un + a la izquierda que al expandirlo mostrará todas las propiedades de la componente Edit.

Esto lo acabo de probar en Delphi7. Creo recordar que en Delphi6 había algún problema con SetSubComponent.

// Saludos

DarkDrakon 09-09-2005 00:57:46

Aki te va
 
No crees ke seria mas sencillo solo al crear tu nuevo componente, ke herede no del componente TCustomControl, sino directamente del componente TEdit.

Código:

unit NewComp;
 
interface
 
uses
Classes, ....;
 
type
TNewComp = class(TEdit)
private
{...}

Asi el constructor solo seria ::

Código:

constructor TNewComp.Create(AOwner : TComponent);
begin
inherited Create(AOwner); {Llama al constructor original (heredado)}
{...}
end;

Eso es todo lo ke yo haria :D

elcigarra 09-09-2005 19:17:46

Es cierto, aunque si lo que quisiera es un TEdit, yo no haría un componente nuevo, sinó que usaría el de la paleta Standard :D .

El componente que estaba haciendo es un poco más complejo que un TEdit, de hecho la variable interna de la cual quería publicar propiedades no era un TEdit sinó un particular descendiente de TCustomComboBox que yo mismo había creado, aunque el TControl tenía también un TEdit, etre otras propiedades nuevas.

No importa la idea original, si pretendo que la respuesta sea sencilla trato de hacer la pregunta sencilla, es decir, solamente pregunto lo que no sé. Adaptar la respuesta a mis complejidades particulares es un divertimento que a los que no somos profesionales de la programación no nos gusta renunciar:p Me gusta que me enseñen a jugar al ajedrez pero no que elijan la pieza que muevo... si pierdo, preguntaré después porqué.

De todas formas esto fue dicho con buena onda y agradecimiento no solo a DarkDrakon sino a todos amigos de este foro de quien he aprendido mucho, más y mejor que en mis pocos cursos de informática. Y si no suelo escribir este agradecimiento es porque lo considero sobreentendido.

un abrazo

yusnerqui 09-09-2005 20:01:20

:confused: :confused: Leiste la respuesta de roman, te sirvió???.

Cita:

Empezado por elcigarra
Y si no suelo escribir este agradecimiento es porque lo considero sobreentendido.

Pues yo, aunque plasmo mi agradecimiento por adelantado, también lo hago después de recibir la respuesta, comentando además, si esta me fue útil o como se solucionó el problema en cuestión. Considero que es la única forma que tengo de pagar a aquellas personas que sacrifican su tiempo para ayudarme desinteresadamente, y se por experiencia , que a esas personas que aportan soluciones les interesa saber si su consejo dio resultado. Pero en fin, cada cual con su estilo.

Saludos


La franja horaria es GMT +2. Ahora son las 11:26:51.

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