Pregunta

El siguiente código se reproduce de la barra de herramientas2000. Es parte de la rutina que lee posiciones de la barra de herramientas y estados de muelle de un archivo INI. Llamo a esta rutina durante la inicialización. Este código a continuación está iterando a través de todos los componentes del formulario principal (propietario de componente) y la carga de la configuración de cualquier barra de herramientas que encuentre.

for I := 0 to OwnerComponent.ComponentCount-1 do begin
  ToolWindow := OwnerComponent.Components[I];  //  <------------------------
....

Esta iteración lleva algo de tiempo (segundos: hay 1500 componentes ODD en el formulario) y recibo un error de rango en el punto que se muestra. He determinado que uno o más elementos se están arrojando de los componentes de la forma principal mientras se ejecuta este bucle, por lo que eventualmente el bucle intenta acceder a un pasado al final de la matriz una vez que esto haya sucedido (presumiblemente sería mejor codificar esto como un "Down To" for-bucle para evitar esto).

De todos modos, necesito averiguar dónde está perdiendo el formulario principal un componente. ¿Alguien puede darme algún consejo de depuración de Delphi 2006 sobre cómo hacer esto? No esperaría que se liberen ningún componente de formulario principal en este momento de mi programa.

ACTUALIZAR

Descubrí que cuando había reposicionado la posición de muelle predeterminada de una barra de herramientas en el tiempo de diseño, la había acoplado inadvertidamente en otra barra de herramientas, en lugar del sitio de muelle en el que estaba la otra barra de herramientas. Se solucioné el problema al eliminar la barra de herramientas de la barra de herramientas que era. atracado y agregándolo al muelle en su lugar. Entonces, el acuerdo que causó el problema fue:

Dock 
  Toolbar 1
    Control 1
    Control 2
    Toolbar 2
      Control 3
      Control 4

y la solución era organizarlos así:

Dock 
  Toolbar 1
    Control 1
    Control 2
  Toolbar 2
    Control 3
    Control 4

Sin embargo, todavía apunta a un error en el código TB2K; se asumiría que debería ser capaz de manejar barras de herramientas anidadas.

¿Fue útil?

Solución

In addition to Lieven's answer, you could also use debug dcu's and set a breakpoint in TComponent.Destroy just before you enter the loop.

In both cases you will need to examine the call stack to see where the call/change to count is coming from.

A very interesting article on breakpoints was written by Cary Jensen: http://caryjensen.blogspot.com/2010/08/breakpoints-with-side-effects.html

Otros consejos

You'll have to add a data breakpoint at @Self.FComponents.FCount to break whenever the count changes.

  • ComponentCount is a property that returns the value from GetComponentCount
  • GetComponentCount returns FComponents.Count.
  • FComponents is a TList instance that has a private FCount variable.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top