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; MyLabel : TLabel; 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;
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;
constructor TComponentePrueba.Create(AOwner: TComponent);
var
AForm : TCustomForm;
begin
inherited Create(AOwner);
if Assigned(AOwner) AND NOT (csLoading in AOwner.ComponentState) then
begin
MyADOConexion := TADOConnection.Create(AOwner);
MyADOConexion.Name := FindUniqueName(AOwner, MyADOConexion.ClassName);
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