Ver Mensaje Individual
  #7  
Antiguo 27-03-2010
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Reputación: 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