Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-09-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.114
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Pues yo voy a reconocer que he preparado un pequeño ejemplo basándome en mi primera idea, que había cogido de ver los componentes que implementan propiedades de la forma que estamos refiriendo en este Hilo. Pues bien, primero hize algo muy similar a lo que Aldo ha propuesto, pero, aunque podía ver el símbolo "+" en la propiedad correspondiente en el Inspector de Objetos... era como si no estuviera, porque no desplegaba la lista de propiedades tal como esperaba.

Luego me fijé en cómo se hace en la clase "TControl", concretamente en su propiedad "Constraints", de tipo "TSizeConstraints", que es una propiedad que puede verse también (heredada de "TControl") en los "TForm", sin ir más lejos... la forma en que se lleva a cabo en dicha propiedad es algo más elaborada que lo que intenté la vez primera, pero, aunque conseguir implementar algo parecido en el componente de pruebas que estaba llevando a cabo para lograr lo que CHiCoLiTa seguía teniendo el mismo inconveniente... La propiedad aparece en el Inspector de Objetos, pero la "+" a su izquierda no sirve de mucho, porque no funciona...

En fin, me declaro inútil, creo que habría que investigar un tanto más el asunto, o que en algo metí la pata y no sé ahora mismo en qué puede haber sido... así que si antes dije que la cosa no era "complicada", ahora retiro lo dicho, y pido disculpas, pues que creo que pequé de hablador, siendo que no es tan sencillo como parece, o que, no puedo decir yo que lo sea cuando no he podido llevarlo a cabo ni a la de tres...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #2  
Antiguo 05-09-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.114
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Bueno. Pues ya parece que puedo decir que no era tan complicado. Al cabo faltaba la creación de la clase que se utiliza en el componente y que es la que contiene las propiedades que hay que mostrar bajo el símbolo "+" en el Inspector de Objetos. Esto y alguna otra cosa, porque he añadido algunas hasta dar con el secreto. Con el permiso de Aldo, observa, CHICoLiTa, el siguiente código, por si puede ayudarte en algo:

Código Delphi [-]
  {
    Corregido tendiendo en cuenta
    lo dicho por roman más abajo
  }
 
 unit UPruebas;
 
 interface
 
 uses
   Classes;
 
 type
   TPruebas = class(TPersistent)
   private
     FAlto: integer;
     FAncho: integer;
   public
     procedure Assign(Source: TPersistent); override;
   published
     property Alto: integer read FAlto write FAlto default 0;
     property Ancho: integer read FAncho write FAncho default 0;
   end;
 
 type
   TDePruebas = class(TComponent)
   private
     FPruebas: TPruebas;
     procedure SetPruebas(Value: TPruebas);
   public
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
   published
     property Pruebas: TPruebas read FPruebas write SetPruebas;
   end;
 
 procedure Register;
 
 implementation
 
 procedure Register;
 begin
   RegisterComponents('Samples', [TDePruebas]);
 end;
 
 { TDePruebas }
 
 constructor TDePruebas.Create(AOwner: TComponent);
 begin
   inherited Create(AOwner);
   FPruebas := TPruebas.Create;
   FPruebas.Alto := 0;
   FPruebas.Ancho := 0;
 end;
 
 destructor TDePruebas.Destroy;
 begin
   FPruebas.Free;
   inherited Destroy;
 end;
 
 procedure TDePruebas.SetPruebas(Value: TPruebas);
 begin
   if Value <> FPruebas then
     Value.Assign(FPruebas);
 end;
 
 { TPruebas }
 
 procedure TPruebas.Assign(Source: TPersistent);
 begin
   if Source is TPruebas then
   begin
     FAlto := TPruebas(Source).FAlto;
     FAncho := TPruebas(Source).FAncho;
   end;
   inherited Assign(Source);
 end;
 
 end.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 05-09-2005 a las 20:40:41. Razón: (corrección del código fuente)
Responder Con Cita
  #3  
Antiguo 05-09-2005
CHiCoLiTa CHiCoLiTa is offline
Miembro
 
Registrado: may 2003
Posts: 102
Poder: 22
CHiCoLiTa Va por buen camino
Nos esta faltando el constructor del componenete para que en la clase TPersisten se puedan crear el 'desplegable'.
Voy a ver si me sale y comento la solucion final
Responder Con Cita
  #4  
Antiguo 05-09-2005
CHiCoLiTa CHiCoLiTa is offline
Miembro
 
Registrado: may 2003
Posts: 102
Poder: 22
CHiCoLiTa Va por buen camino
Vaya, he llegado tarde por unos minutos
dec ha puesto justo lo que faltaba
Sobretodo muchisimas gracias a Aldo
Una cosita mas que se hacer
Responder Con Cita
  #5  
Antiguo 05-09-2005
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
Nada más un detalle respecto del ejemplo de dec. La clase contenedora se encarga de la construcción y destrucción del objeto Pruebas, es decir, le pertenece. Por tanto hay que proteger la propiedad contra cambios no deseados: si se asigna

DePruebas.Pruebas := ObjetoPruebas

estamos sustituyendo el objeto que originalmente pertenecía a DePruebas por otro y al hacer FPruebas.Free será este otro el que estemos destruyendo y el objeto original se habrá quedado atorado en memoria.

Normalmente, para este tipo de propiedades hay que definir un método set:

Código Delphi [-]
property Pruebas: TPruebas read FPruebas write SetPruebas

donde SetPruebas se encargará de copiar el contenido. Puede hacerlo campo por campo aunque lo usual es transferir ese copiado al método Assign de TPruebas:

Código Delphi [-]
type
  TPruebas
  public
    procedure Assingn(Source: TPersistent); override;
  end;

y dejar SetPruebas con:

FPruebas.Assign(Value);

// Saludos
Responder Con Cita
  #6  
Antiguo 05-09-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.114
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

roman, me queda una duda, ¿viste que edité el código fuente para añadir el método "SetPruebas" tal como decías? Ahora bien, en donde se lee el comentario "{ ¿Acaso falta algo que hacer aquí? }"... ¿hay, efectivamente, que hacer algo más?

Actualización: Me temo que sí que había que hacer algo... claro está... creo que con lo siguiente sería bastante, y si me equivoco aquí estoy para que se me diga en qué. Y en todo caso muchas gracias roman.

Código Delphi [-]
{ TPruebas }
 
 procedure TPruebas.Assign(Source: TPersistent);
 begin
   if Source is TPruebas then
   begin
     FAlto := TPruebas(Source).Alto;
     FAncho := TPruebas(Source).Alto
   end;
   inherited Assign(Source);
 end;
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 05-09-2005 a las 20:58:33. Razón: (actualización)
Responder Con Cita
Respuesta



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


La franja horaria es GMT +2. Ahora son las 22:09:19.


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