Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-09-2005
Avatar de buildero_d
buildero_d buildero_d is offline
Miembro
 
Registrado: sep 2005
Ubicación: Puebla, México
Posts: 37
Poder: 0
buildero_d Va por buen camino
Propiedad tipo Objeto

Que tal colegas,

Resulta que he creado un componente derivado de TListView, lo que intento es crear una nueva propiedad de tipo Objeto.... esta propiedad debe ser un apuntador a un Formulario.

Alguien me puede orientar para crear este tipo de propiedad.

Gracias anticipadas.
Responder Con Cita
  #2  
Antiguo 07-09-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Si se trata de un formulario en concreto creo que tendrás que utilizar su tipo como tipo de la propiedad que precisas. Si no se trata de un formulario concreto podrías utilizar el tipo "TForm", de donde derivan los formularios. Supongamos que tú quieres que la propiedad sea del tipo de un formulario conque cuentas en el proyecto, por ejemplo: "TMiFormulario", pues bien, de ese tipo habría de ser la propiedad en cuestión. No sé hasta qué punto, si quisieras utilizar el tipo "TMiFormulario" bastaría con declarar la propiedad de tipo "TForm" y hacer uso después del polimorfismo.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 07-09-2005
Avatar de buildero_d
buildero_d buildero_d is offline
Miembro
 
Registrado: sep 2005
Ubicación: Puebla, México
Posts: 37
Poder: 0
buildero_d Va por buen camino
Gracias por la respuesta, amplio un poco mas la duda.

El formulario que quiero ligar al componente esta en mi proyecto, aunque no siempre será el mismo.

Este es mi codigo para crear la propiedad...

Código:
 private: 
  		Forms::TForm *FForm; 
  		void __fastcall SetForm(Forms::TForm* aValue); 
  protected: 
  public: 
   
  __published: 
  		__property Forms::TForm* Form = {read=FForm, write=SetForm};
En el .cpp tengo la implementacion de la función SetForm
Código:
  void __fastcall TMiControl::SetForm(Forms::TForm* aValue) 
  { 
  		FForm = new Forms::TForm(aValue); 
  }
En el inspector de objetos puedo ver mi nueva propiedad de mi componente, pero al momento de asignarle un form en el Inspector de Objetos me marca el error "Invalid property value"

¿Por qué no me deja asignarlo?... ¿debo de hacer algo adicional?

Saludos.
Responder Con Cita
  #4  
Antiguo 07-09-2005
Avatar de jmariano
jmariano jmariano is offline
Miembro
 
Registrado: jul 2005
Posts: 376
Poder: 19
jmariano Va por buen camino
No conozco mucho el C++ Builder, pero me parece que estás asignando mal la propiedad en el método "Set". ¿No podrías hacer simplemente esta asignación: FForm = aValue?

Es decir, lo que tienes que conseguir es que la variable FForm "apunte" a la misma dirección dada por el parámetro (y me parece, si no estoy equivocado, que lo que estás haciendo es inicializar incorrectamente una nueva instancia del puntero pasado como parámetro, que, en tal caso, creo que sería así: FForm = new aValue).

(Tambien puede ser que esté diciendo una burrada! pero, como ya dije, no conozco mucho C++ Builder, de todas formas existe un foro donde te podrán ayudar mas: http://www.clubdelphi.com/foros/forumdisplay.php?f=13)

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

Yo estoy como jmariano, que C++ me es bastante desconocido. Llevo desde que te contesté por vez primera tratando de hacer algo similar en Delphi, porque creo que no te sería complicada la traducción del código fuente a C++.

El caso es que no he conseguido lo que se proponía sino dando cierto rodeo que no sé hasta qué punto será necesario. He hecho varias pruebas, como te digo, y, en ninguna de ellas conseguía asignar un formulario a la propiedad de marras, salvo programáticamente, esto es, fuera del Inspector de objetos.

A lo último que he llegado ha sido a lo que a continuación expondré (el código fuente) y, de este modo, sí que he podido asignar un formulario a una propiedad de "mi componente" desde el Inspector de Objetos. Solo que lo que hago es asignar el formulario a una propiedad de una propiedad...

Me explicaré, se trata de dos clases: una de ellas contiene una propiedad a la cual puede asignársele un formulario. Esta misma clase es el tipo de una propiedad de "mi componente", de ahí que diga que he dado un rodeo que no sé hasta qué punto sería preciso dar, si supiera hacerse de otro modo.

En fin, aquí está el código fuente que digo que consigue al cabo hacer algo parecido a lo que se precisaba, si no es ya que todo ello sea deshechable porque no es exactamente lo que se pretendía realizar. El caso es que, como digo, al cabo puedo, mediante el Inspector de Objetos, asignar un formulario a una propiedad de "mi componente".

Como verás es código fuente de Delphi... espero que no tengas muchos problemas para traducirlo a código fuente de C++.

Código Delphi [-]
 unit UPruebas;
 
 interface
 
 uses
   Forms, Classes;
 
 type
   TMiForm = class(TPersistent)
   private
     FForm: TForm;
   public
     procedure Assign(Source: TPersistent); override;
   published
     property MiForm: TForm read FForm write FForm;
  end;
 
 type
   TMiComponente = class(TComponent)
   private
     FMiForm: TMiForm;
     procedure SetForm(Value: TMiForm);
   public
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
   published
     property MiForm: TMiForm read FMiForm write SetForm;
   end;
 
 procedure Register;
 
 implementation
 
 procedure Register;
 begin
   RegisterComponents('Samples', [TMiComponente]);
 end;
 
 { TMiComponente }
 
 constructor TMiComponente.Create(AOwner: TComponent);
 begin
   inherited Create(AOwner);
   FMiForm := TMiForm.Create;
 end;
 
 destructor TMiComponente.Destroy;
 begin
   FMiForm.Free;
   inherited;
 end;
 
 procedure TMiComponente.SetForm(Value: TMiForm);
 begin
   if Value <> FMiForm then
     FMiForm.Assign(Value);
 end;
 
 { TMiForm }
 
 procedure TMiForm.Assign(Source: TPersistent);
 begin
   inherited;
    if Source is TForm then
    begin
      FForm := TForm(Source);
    end;
    inherited Assign(Source);
 end;
 
 end.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #6  
Antiguo 07-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
Cita:
Empezado por dec
Código Delphi [-]
 procedure TMiForm.Assign(Source: TPersistent);
 begin
   inherited;
    if Source is TForm then
    begin
      FForm := TForm(Source);
    end;
    inherited Assign(Source);
 end;
Hola dec,

El propósito de Assign es copiar el contenido de un objeto a otro.

Cuando asignas

FForm := TForm(Source);

no estás copiando el contenido sino simplemente la referencia al objeto. Es decir que sólo has pospuesto el problema de la asignación en el método Set al método Assign.

Estoy seguro que ahora ya te queda claro.

// Saludos
Responder Con Cita
  #7  
Antiguo 07-09-2005
Avatar de buildero_d
buildero_d buildero_d is offline
Miembro
 
Registrado: sep 2005
Ubicación: Puebla, México
Posts: 37
Poder: 0
buildero_d Va por buen camino
Muchas gracias por sus respuestas, seguire investigando, aunque creo que la duda en general es ¿Como crear una propiedad de tipo Objeto especificamente en TForm?, ya sea en Delphi o en C++ Builder.

Posteare en el foro que me has indicado.

Saludos y gracias.
Responder Con Cita
  #8  
Antiguo 07-09-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Mi gozo en un pozo, se suele decir en estos casos. ¡Pues no resulta que puedo asignar desde el Inspector de Objetos un formulario a la propiedad del componente pero no otro formulario! Me explico. Tengo dos unidades en el proyecto en que hago pruebas. Cada una de ellas representan formularios: "Form1" y "Form2".

Pues bien, puedo asignar desde el Inspector de Objetos, como digo, a la propiedad "MiForm" el formulario "Form1", pero, a la que trato de asignar a dicha propiedad "Form2" obtengo un "Invalid property value" muy bonito, en un diálogo con su icono de error y todo.

Decididamente, no aprende uno y se mete no ya donde no le llaman, pero de donde es probable que no sepa salir... He probado a añadir el componente conque estoy probando también en el formulario "Form2" y ahí sí puedo añadir este a la propiedad del componente que se supone puede albergar variables del tipo "TForm"...

Esto de suponer... es mucho suponer... De todos modos hay algo que me extrañó de tu primer mensaje: comprendería que un formulario tuviera un objeto "TListView" en su interior, pero, ¿para qué necesitas que un "TListView" tenga "en su interior" un formulario?
__________________
David Esperalta
www.decsoftutils.com
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 18:06:07.


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