Casa
Top.Mail.Ru Yandeks.Metrika
Foro: "Principal";
Archivo actual: 2002.01.10;
Descargar: [xml.tar.bz2];

abajo

Cómo destruir correctamente los componentes ScrollBar de un destructor Encontrar ramas similares


Aleksandr   (2001-12-21 14:33) [0]

El componente tiene una barra de desplazamiento creada cuando se crea:
constructor TWayTree.Create (AOwner: TComponent);
comenzar
Heredado
FScrollBar: = TScrollBar.Create (AOwner);
FScrollBar.Parent: = Parent;
FScrollBar.OnScroll: = FWayTreeScroll;
...Venta de Casas y Condominios en Calgary. Fernando Aramburu agente inmobiliario
fin;
Parent ScrollBar "Lo asigno para que no parpadee y no se contraiga cuando el componente se vuelve a dibujar (y generalmente no interfiere con su vida útil). Es decir, de hecho, no pertenece al componente, simplemente lo desplaza.
Todo está bien, pero cuando se llama al destructor de componentes en este lugar:
si asignado (FScrollBar) entonces
FScrollBar.Free
Aparece Infracción de acceso en 00000000 ...
¿Qué estoy haciendo mal?



Alx2   (2001-12-21 14:39) [1]

Tal vez alguien ya lo clavó antes de eso?



Aleksandr   (2001-12-21 14:41) [2]

No lo sé ... solo si este mismo padre no elimina la barra de desplazamiento antes y luego el componente ... solo ¿cómo puedo verificar si Assigned solo está comprobando con nil?



Alx2   (2001-12-21 14:44) [3]

A punto de ...
Entonces simplemente no lo golpees. El propietario hará esto cuando muera (¿o Padre? - No lo recuerdo. ¿Pero alguien ya se cuidó?).



Alx2   (2001-12-21 14:46) [4]

Después: intentaré transferirme al diseñador del pergamino (es decir, TWay).



Alx2   (2001-12-21 14:49) [5]

¡Exactamente!
Aquí es de ayuda:
Propietario: TComponent;
Indica el componente responsable de liberar este componente.



Aleksandr   (2001-12-21 15:06) [6]

Gracias!



Aleksandr   (2001-12-21 15:16) [7]

Mlyn ... el bigote es igual a Infracción de acceso ...



Alx2   (2001-12-21 15:23) [8]

¿Cómo se ve el código ahora?



Alx2   (2001-12-21 15:27) [9]

El perejil probablemente pueda sentarse en el hecho de que TWay.Destroy primero se hereda, lo que bloquea el pergamino. Es decir Ya no le importa nadie.
Puede intentar limpiar el palo heredado al final, después de FScrollBar.Free; FScrollBar: = Cero. Y vea dónde estará el AV.



Aleksandr   (2001-12-21 15:51) [10]

El destructor completo se ve así:

destructor TWayTree.Destroy;
var
W: TWayItem;
comenzar
tratar de
si FDestroyItems comienza entonces
mientras que FPoints.Count> 0 comienzan
W: = TWayItem (FPoints.Items [0]);
FPoints.Delete (0);
W.Free
final
fin;
finalmente
FPoints.Free;
FFont.Free;
si asignado (FScrollBar) entonces
FScrollBar.Free;
heredado destruye
final
fin;

Naturalmente, llamo a Destroy heredado el último ...



DieHard   (2001-12-21 15:58) [11]

¿Por qué destruir la FScrollBar en absoluto? Déjelo a AOwner, a quien debería ser ...



Alx2   (2001-12-21 16:05) [12]

Intente verificar la propiedad ComponentCount en TWay
Si es 0, entonces todo ya está clavado en alguna parte.



Юрий Зотов   (2001-12-21 16:06) [13]

Lo siguiente sucede. Crea una barra de desplazamiento con el mismo propietario que el propietario de su componente:

FScrollBar: = TScrollBar.Create (AOwner);

Esto significa que este AOwner, cuando se destruye, primero matará a su componente y luego a la Barra de desplazamiento que creó. Pero su componente lo mata en su destructor y, por lo tanto, Aowner intenta matar la barra de desplazamiento ya matada. Eso es un error

Crea una barra de desplazamiento como esta:

FScrollBar: = TScrollBar.Create (Self);

Y después de eso, puedes matarlo en tu destructor (o no puedes matarlo, lo matarán automáticamente).



Alx2   (2001-12-21 16:08) [14]

> DieHard
Es entendible. Es interesante que este pergamino tenga tiempo de morir antes de TWayTree. Destruya, ya que el propietario tiene TWayTree ...



Alx2   (2001-12-21 16:11) [15]

> Yuri Zotov
Me citaré a mí mismo (ver arriba):
Después: intente transferirse al diseñador del desplazamiento (es decir, TWaytree).
Ahora todo el problema está en averiguar dónde se desplaza este pergamino para morir antes de TWayTree. Destruye, ya que el Propietario tiene TWayTree ...



Freezer   (2001-12-21 16:20) [16]


if not (csDestroying in ComponentState) then
if Assigned(FScrollBar) then
FScrollBar.Free;
inherited Destroy;



Юрий Зотов   (2001-12-21 16:22) [17]

> Alx2

> ¿Dónde se puede morir este desplazamiento antes de TWayTree?

En ninguna parte Hasta TWayTree.Destroy no muere. Él muere en TWayTree. Destruye.


> ya que el propietario tiene TWayTree ...

No El propietario tiene lo MISMO que TWayTree. Este es el error. Primero, TWayTree lo mata, y luego el Propietario lo mata, y aquí es donde entra AV. Es decir, NO en TWayTree. Destruya, sino DESPUÉS.



Alx2   (2001-12-21 16:29) [18]

> Yuri Zotov
Pues bien. Alexander nos juzgará. En mis respuestas anteriores, enfaticé precisamente que el desplazamiento del Propietario tenía exactamente TWayTree. No sé cómo fue realmente con él. Es decir, la llamada debe ser exactamente lo que escribió: FScrollBar: = TScrollBar.Create (Self);
Pero el hecho de que el error no haya desaparecido es extraño. Aunque sin fuente puedes decir poco.



Юрий Зотов   (2001-12-21 16:49) [19]

> Alx2 © (21.12.01 16: 29)
Estoy de acuerdo, necesitamos un código de constructor, el que es ahora, y no el que ya se ha citado. Sin embargo, sospecho que no ha cambiado, de lo contrario el error debería haber desaparecido. Es extraño que Aleksandr esté en silencio. Oooh!



Aleksandr   (2001-12-21 17:01) [20]

Probé las opciones en el constructor:

FScrollBar: = TScrollBar.Create (Self);
FScrollBar: = TScrollBar.Create (Propietario);

Con cualquiera de estos, Destroy sucede AV.



Aleksandr   (2001-12-21 17:06) [21]

Sí, por cierto, en el destructor reemplacé FScrollBar.Free con FreeAndNil (FScrollBar), en caso de que AV genere Propietario.



Юрий Зотов   (2001-12-21 17:08) [22]

Entonces, aparentemente, Alx2 tiene razón: debe buscar dónde se está matando la barra de desplazamiento. Hazlo

1. Verifique que las fuentes VCL estén incluidas en la ruta de depuración.
2. En el destructor TScrollbar, coloque BreakPoint y ejecute el programa.
3. Cuando llegue a BreakPoint, abra la ventana Pila de llamadas y vea de dónde vino. Lo más probable es que haya una causa del error.



Aleksandr   (2001-12-21 17:34) [23]

Ok Y si no lo destruyes en absoluto en el destructor, ¿seguirá arruinando la memoria? Simplemente, los usuarios usarán el formulario con este componente con la misma frecuencia que el contador usa la calculadora ...



Юрий Зотов   (2001-12-21 20:57) [24]

Si su propietario no es nulo, será destruido junto con el propietario. Pero personalmente, prefiero eliminarlo con bolígrafos, en el destructor, como el suyo. Al menos porque le permite detectar situaciones como la suya e indicar que Claramente hay algo mal con el programa, por lo que le recomiendo encarecidamente que lo descubra de todos modos.



Páginas: 1 rama entera

Foro: "Principal";
Archivo actual: 2002.01.10;
Descargar: [xml.tar.bz2];

arriba





Memoria: 0.62 MB
Tiempo: 0.029 c
1-28450
agarrar
2001-12-21 18:21
2002.01.10
Texto de TEdit en un formulario a las celdas de la tabla en otro formulario


3-28445
szap
2001-12-07 15:09
2002.01.10
Alternativa de TQuery


6-28514
maxi
2001-10-15 14:10
2002.01.10
¿Cómo llamar correctamente al método de interfaz en un servidor COM remoto?


3-28415
Romul
2001-12-07 13:00
2002.01.10
Campo booleano en archivo DBF


1-28449
Knyaz17
2001-12-21 11:47
2002.01.10
¿Cómo heredar el método no del padre, sino del padre del padre?





africaans albanés Arabic armenio Azerbaiyán vasco Bielorruso Bulgarian Catalán Chino (simplificado) Chino (tradicional) Croata Checo Danés Dutch Inglés Estonia filipina Finnish French
gallego georgiano Alemán Griego criollo haitiano Hebreo hindi Húngaro islandés Indonesian irlandés Italiano Japonés Korean letón lituano macedonio Malay maltés Noruego
persa polaco Portuguese Rumano Ruso Serbio Slovak Esloveno Español swahili Sueco Thai turco ucranio Urdu vietnamita galés yídish bengalí bosnio
cebuano esperanto gujarati hausa hmong igbo javanés kannada khmer lao latín maorí marathi mongol nepali punjabi somalí Tamil telugu yoruba
zulú
Английский Francés Alemán Italiano portugués Русский Español