2011-11-04 24 views
5

Esta es mi primera publicación aquí, pero me gustaría dar las gracias a la comunidad porque he encontrado soluciones a mis problemas innumerables veces al venir aquí y encontrar una solución en una pregunta eso ya había sido respondido.Creación/destrucción de clase virtual en delphi

Habiendo dicho eso, me gustaría ir al grano. Estoy trabajando en Code Gear's Delphi 2007 IDE. Todavía soy bastante nuevo para trabajar en Delphi, menos de 3 meses para ser precisos, así que tenga esto en cuenta ya que me puede estar perdiendo algo básico aquí.

Primero me gustaría dar un pequeño contexto sobre el problema. Estoy escribiendo una utilidad de programación para ejecutar tareas en momentos específicos. Para cada tarea disponible hay 2 marcos delphi relacionados que están asociados con esa tarea. El primer marco es para editar detalles específicos de esa tarea, y el segundo marco es para mostrar información en tiempo de ejecución cuando se ejecutan las tareas.

Se mantiene una lista de las tareas en ejecución, y en un cuadro de desplazamiento en la utilidad, se muestra una lista de los marcos correspondientes para la información de tiempo de ejecución. Estos marcos de tiempo de ejecución se crean y destruyen cuando las tareas comienzan y finalizan. Lo que me lleva a mi problema.

Utilizo un administrador de clases virtual para mantener una lista de marcos de visualización y edición disponibles para cada tarea, y crearlos sobre la marcha cuando sea necesario. Durante el tiempo de ejecución, todo se comporta de forma adecuada, es cuando la aplicación realmente se cierra que estoy viendo el problema.

el programa muestra una excepción EAccessViolation como cierre. Cuando traté de rastrear el problema usando el IDE, la línea o acción correspondiente al problema no existe realmente en mi código. Por lo tanto, debe ser parte de una funcionalidad de limpieza que se realiza en segundo plano.

Lo he reducido al código que crea los marcos de clases virtuales sobre la marcha, porque se cierra bien cuando tengo ese código comentado. Entonces, esto me lleva a creer que no estoy realizando ninguna acción relacionada con el uso de este tipo de creación de clase.

var 
    tmpCCI: TComponentClassInfExt; 
    tmpS: String; 
    tc: TComponent; 
    bf: TBaseactionedit; 
... 
begin 
... 
tc := tmpCCI.fComponentClass.Create(nil); 
if tc is TBaseactionedit then 
begin 
    bf := TBaseActionEdit(tc); 
    bf.name := tmpCCI.fComponentClass.classname+IntToStr(nameCount); 
    bf.Visible := False; 
    bf.parent := pnlActionEdit; 
    bf.Align := alClient; 
    bf.Visible := True; 
end; 
... 

Este es el extracto de cómo estoy creando los marcos usando el administrador de clase virtual. Estoy liberando instancias con FreeAndNil cuando ya no se necesitan. Me he trazado lo mejor que he podido para asegurarme de haber liberado correctamente cualquier instancia antes de que se cierre la aplicación, pero obviamente me falta algo.

Entonces, ¿alguien tiene alguna idea sobre a dónde desde aquí para la depuración de algo como esto?

P.S. una vez más soy nuevo, así que si hay algo que he extrañado, pasado por alto u olvidado agregar, por favor avíseme. ¡Gracias de nuevo por leer mi publicación!

+0

He experimentado AVs al apagar si deja que la jerarquía 'Dueño' destruya todo al apagar. Intenta llamar "Gratis" en tu formulario principal (y otros formularios que puedas tener abiertos) al apagar. Haga esto agregando al archivo .dpr después de la línea 'Application.Run'. –

Respuesta

2

Probablemente sea el principal que libere todos los controles contenidos durante Destruir.

+1

Si el padre quiere destruirlo durante el cierre de la aplicación, ¿cuál sería la forma correcta de destruir el marco cuando ya no es necesario durante el tiempo de ejecución, o hay una forma de decirle al padre, no tiene que preocuparse por intentarlo para destruir el componente? – PoultrySlave

+4

@PrematureOptimization 'TWinControl' libera sus controles secundarios también, consulte [aquí] (http://stackoverflow.com/questions/7075637/). –

+0

@TOndrej, gracias, bastante interesante y peligroso rincón de VCL –

Cuestiones relacionadas