Ver Mensaje Individual
  #2  
Antiguo 23-01-2004
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.610
Reputación: 32
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¡Buen día a todos!


Cita:
Empezado por marto
...creando un componente muy sencillo que hereda de TComboBox. El tema es que necesito que los punteros Objects de su propiedad items apunten a ciertos objetos de una clase...en caso de que así se indique, el componente se ha de encargar de liberar estos objetos...
Código:
procedure Destroy; override;
....
destructor TNxAuxCombo.Destroy;
var
  i: Integer;
begin
  if FOwnObjects then
    for i := 0 to Count - 1 do
      if Items.Objects[ I ] <> Nil then
         Items.Objects[ I ].Free;
  inherited;
end;
...al ejecutarse el destructor, Items vale nil, de manera que se produce una excepción...
Quizás el destructor heredado está siendo ejecutado antes de tiempo.


Cita:
Empezado por marto
...Items, si no recuerdo mal...se detruye en el destructor de TListControl...
En realidad es TCustomComboBox, la clase padre de TComboBox (Delphi 6), quien normalmente instancía y destruye la propiedad Items. Quizás estás destruyendo esa propiedad en otro lugar o modificaste su método de lectura.


Cita:
Empezado por marto
...si creo el combo en diseño, al destruirse el form me lanza una excepción de "Control xxxx has no parent window"...efectivamente en mi destructor Parent = nil...¿Por que está accediendo al parent?...
Pudiera ser que algún evento esté disparando una llamada al método SetFocus del control, lo cual causa la excepción mencionada si éste no tiene contenedor padre. Pero existen muchas otras situaciones donde se eleva una excepción con el mensaje SParentRequired, no obstante todas tienen que ver con la necesidad del control de tener un padre para desempeñar cierta función visual o de cálculo de coordenadas.


Por último debo agregar que el término sobrecarga se aplica más bien a los casos donde el compilador determina cuál de dos rutinas es a la que se refiere una expresión de código, cuando dichas rutinas tienen el mismo nombre y utilizan la directiva Overload. En este caso, se trata más bien de una redefinición (Override) de un método virtual (el destructor Destroy).

De cualquier forma te agradecería que detallaras un poco más este caso.

Para la administración del foro: Tuve que alterar un poco el código de Marto que cité arriba. Agregué dos espacios a los lados de la variable "I" que aparece entre corchetes, porque como estaba (sin espacios) afectaba el texto que escribí en cursiva más adelante. Ojalá se haga la corrección pertinente. Muchas gracias.

Espero esto sea de utilidad. Seguimos en contacto.

Al González .
Responder Con Cita