Question

Le code suivant est reproduit à partir Toolbar2000. Il fait partie de la routine qui lit la barre d'outils et positions dock états à partir d'un fichier INI. J'appelle cette routine lors de l'initialisation. Ce code ci-dessous est Itère tous les composants sur la principale forme (OwnerComponent) et le chargement des paramètres de barres d'outils qu'il trouve.

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

Cette itérer prend un certain temps (secondes - il y a des composants 1500 impairs sur la forme) et je me fais une erreur de plage au point indiqué. Je me suis assuré que l'un ou plusieurs éléments est versé de la principale des composants de forme alors que cette boucle est en cours d'exécution, donc finalement la boucle tente d'un accès après la fin du tableau une fois que cela est arrivé (on peut supposer qu'il serait préférable de coder cela comme une boucle for "downto" pour éviter cela).

Quoi qu'il en soit, je dois savoir où la principale forme est en train de perdre un composant. Quelqu'un peut-il me donner des conseils de débogage Delphi 2006 sur la façon de le faire? Je ne s'attendre à aucun composant principale forme à libérer à ce point dans mon programme.

UPDATE

Je trouve que lorsque je l'avais repositionné la position de dock par défaut d'une barre d'outils au moment de la conception que j'avais par mégarde à quai sur une autre barre d'outils, plutôt que le site de dock que l'autre barre d'outils était. Je résolu le problème en supprimant la barre d'outils de la barre d'outils, il a été accosté et l'ajouter à la station d'accueil à la place. Ainsi, l'arrangement qui a causé le problème:

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

et le correctif était de les organiser ainsi:

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

Il reste des points à un bogue dans le code TB2k bien -. On pourrait supposer qu'il devrait être en mesure de gérer les barres d'outils imbriquées

Était-ce utile?

La solution

En plus de la réponse de Lieven, vous pouvez également utiliser le débogage DCU et de définir un point d'arrêt dans TComponent.Destroy juste avant d'entrer la boucle.

Dans les deux cas, vous devez examiner la pile d'appel pour voir où l'appel / changement de comptage vient.

Un article très intéressant sur des points d'arrêt a été écrit par Cary Jensen: http://caryjensen.blogspot.com/2010/08/breakpoints-with-side-effects.html

scroll top