![]() |
![]() |
![]() |
![]() |
![]() |
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:
![]() Cita:
![]() Al González ![]()
__________________
E pur si muove |
![]() |
|
|
![]() |
|