Domanda

Il codice di seguito è riprodotto da Toolbar2000. Fa parte della routine che legge barra degli strumenti di posizioni e dock stati da un file INI. Io chiamo questa routine durante l'inizializzazione. Questo codice di seguito viene iterato su tutti i componenti della maschera principale (OwnerComponent) e caricando le impostazioni di qualsiasi barra che trova.

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

Questa iterazione richiede un certo tempo (secondi - ci sono componenti 1.500 e rotti sulla forma) e sto ottenendo un errore di gamma nel punto indicato. Ho constatato che uno o più elementi viene versato dai componenti del modulo principale mentre questo ciclo è in esecuzione, così alla fine i tentativi di loop accesso uno oltre la fine della matrice una volta che questo è avvenuto (presumibilmente sarebbe preferibile codice questo come un "downto" per-loop per prevenire questo).

In ogni caso, ho bisogno di scoprire dove la forma principale sta perdendo un componente. Qualcuno mi può dare alcuna Delphi 2006 debug suggerimenti su come fare questo? Non mi aspetto alcun componenti principali del modulo a essere liberati, a questo punto nel mio programma.

Aggiorna

ho scoperto che quando avevo riposizionato la posizione dock di default di una barra degli strumenti in fase di progettazione che avevo inavvertitamente ancorata su un'altra barra degli strumenti, piuttosto che il sito dock che l'altra barra degli strumenti di stato. Ho risolto il problema rimuovendo la barra degli strumenti dalla barra degli strumenti è stata ancorata nella e aggiungendolo al molo, invece. Così la disposizione che ha causato il problema era:

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

e la correzione è stato quello di disporli in tal modo:

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

E 'ancora punti ad un bug nel codice TB2k anche se -. Si potrebbe supporre che dovrebbe essere in grado di gestire le barre degli strumenti nidificate

È stato utile?

Soluzione

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

Altri suggerimenti

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.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top