![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
|
Sobrecargando destructor
Hola a todos,
Estoy 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. Para lo que hayan leido el hilo sobre "propiedades de clases" , se trata de cargarlo con las listas que allí describo. Bien, en caso de que así se indique, el componente se ha de encargar de liberar estos objetos. Esto lo intento con el siguiente código: 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;
En segundo lugar, si creo el combo en diseño, al destruirse el form me lanza una excepción de "Control xxxx has no parent window". Si depuro el código, efectivamente en mi destructor Parent = nil. Eso me parece muy bien, pero ¿Por que está accediendo al parent? A ver si tenéis alguna idea y me echáis una mano. Ah! os pongo el código del constructor por si os da más pistas: Código:
constructor Create(AOwner: TComponent); override; .... constructor TNxAuxCombo.Create(AOwner: TComponent); begin inherited Create(AOwner); FOwnObjects := true; Style := csDropDownList; end;
__________________
E pur si muove |
|
#2
|
||||
|
||||
|
¡Buen día a todos!
Cita:
Cita:
Cita:
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 . |
|
#3
|
||||||
|
||||||
|
Cita:
Cita:
Cita:
Cita:
Cita:
Cita:
Código:
unit NxAuxCombo;
interface
uses
Windows, Messages, SysUtils, Classes, Controls,
StdCtrls, NxAuxiliar, Dialogs;
type
TNxAuxCombo = class(TComboBox)
private
FOwnObjects: Boolean;
function GetSelectedObject: TNxAuxiliar;
procedure SetOwnObjects(const Value: Boolean);
protected
public
property SelectedObject: TNxAuxiliar
read GetSelectedObject;
property OwnObjects: Boolean
read FOwnObjects
write SetOwnObjects;
procedure Carrega(List: TStringList);
procedure Clear; override;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Nex', [TNxAuxCombo]);
end;
{ TNxAuxCombo }
procedure TNxAuxCombo.Carrega(List: TStringList);
var
i: Integer;
begin
for i := 0 to List.Count -1 do
Items.AddObject(List[i], List.Objects[i]);
end;
procedure TNxAuxCombo.Clear;
var
i: Integer;
begin
if FOwnObjects then
begin
for i := 0 to Items.Count - 1 do
if Items.Objects[i] <> Nil then
try Items.Objects[i].Free; except end;
end;
inherited;
end;
constructor TNxAuxCombo.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FOwnObjects := true;
Style := csDropDownList;
end;
destructor TNxAuxCombo.Destroy;
var
i: Integer;
begin
if FOwnObjects then
begin
for i := 0 to Items.Count - 1 do
if Items.Objects[i] <> Nil then
try Items.Objects[i].Free; except end;
end;
inherited;
end;
function TNxAuxCombo.GetSelectedObject: TNxAuxiliar;
begin
if Items.Objects[ItemIndex] is TNxAuxiliar then
Result := TNxAuxiliar(Items.Objects[ItemIndex])
else Result := Nil;
end;
procedure TNxAuxCombo.SetOwnObjects(const Value: Boolean);
begin
FOwnObjects := Value;
end;
end.
__________________
E pur si muove Última edición por marto fecha: 23-01-2004 a las 20:51:32. |
|
#4
|
||||
|
||||
|
¡Buen día a todos!
Cita:
Quizás la propiedad Items es válida, pero no así uno de sus objetos Items.Objects [ I ]. Esto podría deberse a una ejecución previa del método Clear, o a la destrucción previa de otro objeto TNxAuxCombo que comparta la misma lista de objetos. Considera que la sentencia Código:
Items.Objects [ I ].Free; Código:
try Items.Objects[i].Free; except end; Una última cosa: ¿Serías tan amable de reducir las muestras de código a máximo 60 columnas por línea, para que el mensaje no se ensanche tanto?. Muchas gracias. Al González .Última edición por Al González fecha: 23-01-2004 a las 19:42:40. Razón: aclarar mensaje |
|
#5
|
|||||
|
|||||
|
Cita:
La excepcion es la que da siempre que intentas acceder a una propiedad de una referencia a nil.... Acces Violation Cita:
Cita:
Cita:
pero no tiene ningún sentidoCita:
![]() Al González .[/quote]
__________________
E pur si muove |
![]() |
|
|
|