Delphi - Come si rompe quando decrementi ComponentCount di una maschera
-
25-10-2019 - |
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
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 fromGetComponentCount
GetComponentCount
returnsFComponents.Count
.FComponents
is aTList
instance that has a privateFCount
variable.