PDA

Ver la Versión Completa : Error al crear un componente muy simple.


ALMERA
24-02-2005, 09:07:12
Saludos amigos del foro, estoy creando un componente y he definido una propiedad de tipo Strings, compilo mi componente hasta aquí todo bien, pero cuando lo uso en tiempo de diseño he intento entrar en esta propiedad, el inspector de objetos me da el siguiente error: "Cannot assigned a nil to a TRichEditStrings." no comprendo el porque de esto, uso Delphi6 y os paso el código para que lo veais, yo creo que esta todo bién pero si alguién puede ayudarme le estaría muy agradecido, aqui va el código:

unit AMRConsultaRemotaMultihilo;

interface

uses
Windows, Messages, SysUtils, Classes,AMRHiloConsultaSqlRemota,kbmMemTable,DesignIntf,DesignEditors,VCLEditors;

type
TAMRConsultaRemotaMultihilo = class(TComponent)
private
FIpServers:TStrings;
protected
procedure SetIpServers(value:TStrings);
public
Constructor Create;
Destructor Destroy; Override;
published
property IpServers:TStrings read FIpServers write SetIpServers;
end;

procedure Register;

implementation


constructor TAMRConsultaRemotaMultihilo.create;
begin
inherited create(nil);
FIpServers:=TStringList.Create;
end;

Destructor TAMRConsultaRemotaMultihilo.Destroy;
begin
freeandnil(FIpServers);
inherited;
end;


procedure TAMRConsultaRemotaMultihilo.SetIpServers(value:TStrings);
begin
FIpServers.Assign(value);
end;

procedure Register;
begin
RegisterComponents('AMR-SOFT', [TAMRConsultaRemotaMultihilo]);
end;

end.

roman
24-02-2005, 09:15:20
En SetIpServers prueba poner


if Assigned(Value) then
FIpServers.Assign(value)
else
FIpServers.Clear;


// Saludos

ALMERA
24-02-2005, 09:49:26
Gracias Roman pero me sigue dando el mismo error.

roman
24-02-2005, 18:29:06
Es cierto, lo que te puse no es necesario. El problema exacto no lo sé pero sí sé dónde se origina. Estás usando un constructor para la componente que rompe el polimorfismo. No sé si tienes alguna razón específica para ello pero el IDE de Delphi se basa en ello para poder construir las componentes durante el diseño. Si haces un debug de tu componente te darás cuenta que de hecho tu constructor nunca es llamado pues al omitir el override, el IDE simplemente llama al constructor de TComponent. Al no ser llamado, tampoco se construye FIpServers.

Para corregir esto cambia la declaración del constructor por:



constructor Create(AOwner: TComponent); override;


y la implementación por


inherited Create(AOwner);
FIpServers:=TStringList.Create;


// Saludos