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 26-03-2010
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
Sí que se puede hacer.

Si dicho componente "adjunto" lo creas en el mismo constructor Create, debes pasarle como Owner el mismo que recibes, para que dependa del mismo formulario. Si el componente "adjunto" es visual, es decir un Control, debes decidir dónde se ubicará, si dentro del formulario o bien dentro de un Panel por ejemplo, asignándole la propiedad Parent:

Código Delphi [-]
constructor MiComponente.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ConexADO := TADOConnection.Create(AOwner);
  (...)
  MiLabel := TLabel.Create(AOwner);  
  if AOwner is TWinControl then MiLabel.Parent := TWinControl(AOwner);
end;

Lo más normal, al trabajar en diseño, es que el Owner sea el formulario sobre el que estés trabajando.

Saludos
__________________
Guía de Estilo
Responder Con Cita
  #2  
Antiguo 26-03-2010
ElDuc ElDuc is offline
Miembro
 
Registrado: jul 2004
Posts: 197
Poder: 20
ElDuc Va por buen camino
Gracias Andres1569

Yo ya había probado algo parecedo
Código Delphi [-]
Constructor _TgvApplication.Create(AOwner:TComponent);
Begin
Inherited Create(AOwner);
Label_1:=TLabel.Create(AOwner);
Label_1.Parent:=TWinControl(AOwner);
End;

No condiciono la asignación de Parent porque previamente ya lo había hecho poniento un breakpoint y comprobando el tipo AOwner.

También he probado de utilizar ComponentState, pero poniendo un breakpoint en tiempo de diseño no me funciona, no sé si tiene algo que ver.

Pero no me funciona, ¿qué piensas que hago mal?

Última edición por ElDuc fecha: 26-03-2010 a las 23:00:17.
Responder Con Cita
  #3  
Antiguo 26-03-2010
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
¿Qué es lo que no funciona? ¿No te aparece el Label por ningun sitio?

El objeto Owner, ¿de qué clase es? ¿es realmente un formulario? Si es un Control trata de obtener el formulario padre mediante GetParentForm(Owner) a ver qué te devuelve.

Ahora no tengo a mano el Delphi y te hablo de memoria, pero hace años implementé algo así, puede que haya que acceder al diseñador (propiedad FormDesigner -o Designer- de un TForm) pero esto desde Delphi 6 plantea problemas pues no está permitido durante RunTime utilizar clases propias del diseño (contenidas en la unit DsgnIntf.pas)

Siento no poder ayudarte más en este momento ...
__________________
Guía de Estilo
Responder Con Cita
  #4  
Antiguo 27-03-2010
ElDuc ElDuc is offline
Miembro
 
Registrado: jul 2004
Posts: 197
Poder: 20
ElDuc Va por buen camino
Angry

Estoy haciendo muchas pruebas, pero no funciona.

Es como si el método Create de mi componente sólo se ejecutara cuando ejecuto el programa (Run) pero no cuando inserto mi componente en el formularioa, que es cuando realmente necesito crear el otro componente en el formulario.

Posiblemente sea otro método o evento lo que debo controlar.
Responder Con Cita
  #5  
Antiguo 27-03-2010
ElDuc ElDuc is offline
Miembro
 
Registrado: jul 2004
Posts: 197
Poder: 20
ElDuc Va por buen camino
Es evidente que está sucediendo lo que he descrito en el post anterior.

Ge conseguido que mi componente no visual cree otro componente visual en el momento que ejecuto el programa, método Create del componente, pero no cuando inserto el componente no visual en el formulario que es cuando yo lo necesito.

Creo que debo actuar sobre otro método o evento, ¿sabéis en cual?
Responder Con Cita
  #6  
Antiguo 27-03-2010
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
Hola,

He hecho algunas pruebas y sí que se consigue crear ambos tipos de componentes, aunque he detectado algún problema con el componente NO Visual en versiones antiguas de Delphi (la 4 en concreto, en Delphi 6 no pasa). Ocurre que cuando se crea dicho componente NO visual, al no poder tener una representación en pantalla, el icono de éste no aparece, pero sí que está. Si guardo el formulario y lo vuelvo a abrir, ahí está, en la esuqina superior izquierda. Con los controles no sucede pues cuando le asignas el Parent enseguida aparece situado dentro de dicho Parent.

Deberías mirar si en la declaración de componentes del formulario te aparece dicho componente NO Visual (aunque para eso le tienes que haber asignado un nombre, cosa que el IDE hace por defecto cuando soltamos un componente desde la paleta pero que debes realizar tú en este caso). Si te aparece es que todo ha ido bien, aunque, claro, lo que tú querrías es que apereciera su icono sobre el formulario automáticamente para poderle asignar propiedades (ésto es lo que falla en la versión 4 y supongo que en anteriores, y que no he conseguido solucionar).

Te pongo un componente que he utilizado de pruebas, para que lo revises. Este código hace uso de la función GetParentForm para obtener el formulario padre a partir del AOwner (en caso de que éste sea un TControl). También te pongo una función FindUniqueName que sirve para asignarle un nombre automáticamete y que no esté repetido.

Código Delphi [-]
unit CompPrueba;

interface

uses Classes, SysUtils, Controls, Forms, StdCtrls, DB, ADODB;

type
  TComponentePrueba = class(TComponent)
  private
    MyADOConexion : TADOConnection;  // Componente No Visual
    MyLabel : TLabel;            // Componente Visual
  public
    constructor Create(AOwner: TComponent);   override;
  end;

  function FindUniqueName(AOwner: TComponent; const BaseName: string): string;

  procedure Register;

implementation

procedure register;
begin
  RegisterComponents('Pruebas', [TComponentePrueba]);
end;

// Esta función nos ayuda a dar nombre a un componente evitando que esté repetido
function FindUniqueName(AOwner: TComponent; const BaseName: string): string;
var
  i : Integer;
begin
  i := 1;
  repeat
    result := Format('%s%d', [BaseName, i]);
    Inc(i);
  until AOwner.FindComponent(result) = nil;
end;

{ TComponentePrueba }

constructor TComponentePrueba.Create(AOwner: TComponent);
var
  AForm : TCustomForm;
begin
  inherited Create(AOwner);
  // Sólo creamos los componentes "adjuntos" si AOwner no es nil y si no estamos
  // cargando el formulario de un Stream
  if Assigned(AOwner) AND NOT (csLoading in AOwner.ComponentState) then
  begin
  // CREACION DE UN Componente NO visual
    MyADOConexion := TADOConnection.Create(AOwner);
    MyADOConexion.Name := FindUniqueName(AOwner, MyADOConexion.ClassName);

  // CREACION DE UN Componente visual (TControl) ==> Hay que asignar el Parent,
  // que puede ser el formulario u otro control descendiente de TWinControl
    MyLabel := TLabel.Create(AOwner);
    MyLabel.Name := FindUniqueName(AOwner, MyLabel.ClassName);
    MyLabel.Caption := 'Label de prueba';
    AForm := nil;
    if AOwner is TControl then AForm := GetParentForm(TControl(AOwner));
    if AForm <> nil then MyLabel.Parent := AForm;
  end;
end;

end.

Saludos
__________________
Guía de Estilo
Responder Con Cita
  #7  
Antiguo 27-03-2010
ElDuc ElDuc is offline
Miembro
 
Registrado: jul 2004
Posts: 197
Poder: 20
ElDuc Va por buen camino
Thumbs up Resuelto

Hola Andes1569,

Lo he probado y funciona perfectamente sin tener que tocar nada.

Muchas gracias, la tuya ha sido una colaboración completa, me has hecho completamente los deberes.

Perdona, pero aprovechando qu entiendes un rato de esto, ¿me puedes decir algo de los editores de propiedades?

Necesito crear uno para mi componente y he buscado manuales por internet, pero lo que he encontrado


Los pasos que es necesario seguir para escribir un editor de propiedades son los siguientes:
· Crear una nueva unidad en la que definiremos el editor de propiedades. Más adelante hablaremos más extensamente sobre este punto, ya que no es tan trivial como puede parecer en principio
· Añadir la unidad DsgnIntf a la clausula uses del editor de propiedades. En esta unidad estan definidos los editores de propiedades por defecto que utiliza Delphi, además de la importantísima clase TPropertyEditor, la cuál es la clase base de todos los editores de propiedades.
· Crear una nueva clase que descienda de TPropertyEditor o de alguno de sus desciendentes. Por convención, el nombre de los editores de propiedades finaliza con la palabra Property. P.e. TIntegerProperty, TStringProperty...

A continuación se muestran los principales editores de propiedades por defecto que incorpora Delphi.
Editor de propiedades Tipo
TPropertyEditor Clase base para todos los editores de propiedades
TIntegerProperty Byte, word, integer, Longint
TCharProperty Char
TEnumProperty Tipos enumerados
TSetProperty Sets
TFloatProperty Single, Double, Extended, Comp, Currency
TStringProperty Strings
TClassProperty Cualquier objeto
TMethodProperty Cualquier método (eventos)
TComponentProperty Para propiedades que hacen referencia a componentes

· Implementar los métodos necesarios para dotar al editor de propiedades de las funcionalidades deseadas.
· Registrar el editor de propiedades en la VCL


no es compatible con delph7, el que yo utilizo, ya que delphi 7 no tiene DsgnIntf, por internet dicen que delphi 7 utiliza DesignIntf, pero éste no tiene TPropertyEditor ni los demás bases de editor por lo que estoy atascado aquí.

Última edición por ElDuc fecha: 27-03-2010 a las 20:58:10.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
No veo, en tiempo de diseño los nombres de los componentes QuarkBcn Varios 3 19-12-2007 09:38:31
eventos en tiempo de diseño jar OOP 0 27-01-2007 22:09:11
Indices En Tiempo De Diseño?? amadis Conexión con bases de datos 0 12-04-2006 20:22:01
Diseño en tiempo de ejecucion Nelson Alberto Impresión 2 26-01-2006 09:34:12
Instalar componentes solo en tiempo de diseño DarKraZY Varios 0 19-08-2003 16:47:37


La franja horaria es GMT +2. Ahora son las 02:09:20.


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