Delphi - Wie breche ich, wenn die Komponentcount eines Formulars abnimmt
-
25-10-2019 - |
Frage
Der folgende Code wird aus der Symbolleiste2000 reproduziert. Es ist Teil der Routine, die Symbolleiste und Dock -Zustände aus einer INI -Datei liest. Ich nenne diese Routine während der Initialisierung. Dieser nachstehende Code wird alle Komponenten im Hauptformular (Eigentümerkomponent) iteriert und die Einstellungen aller gefundenen Symbolleisten geladen.
for I := 0 to OwnerComponent.ComponentCount-1 do begin
ToolWindow := OwnerComponent.Components[I]; // <------------------------
....
Diese Iteration dauert einige Zeit (Sekunden - es gibt 1500 -ODD -Komponenten auf dem Formular) und ich erhalte am gezeigten Punkt einen Bereichsfehler. Ich habe festgestellt, dass ein oder mehrere Elemente während dieser Schleife aus den Komponenten der Hauptform ausgesetzt werden ein "Abfall" für Schleife, um dies zu verhindern).
Wie auch immer, ich muss herausfinden, wo die Hauptform eine Komponente verliert. Kann mir jemand Debugging -Tipps in Delphi 2006 geben, wie das geht? Ich würde nicht erwarten, dass sich an diesem Punkt in meinem Programm befassen werden, dass eine Hauptform -Komponenten befreit werden.
AKTUALISIEREN
Ich stellte fest, dass ich sie versehentlich in eine andere Symbolleiste angedockt hatte, als ich die Standarddockposition einer Symbolleiste bei der Entwurfszeit neu positionierte, anstatt die Dock-Site, in der die andere Symbolleiste war. Ich habe das Problem behoben, indem ich die Symbolleiste aus der Symbolleiste entlastete Angezeigt und fügen Sie es stattdessen zum Dock hinzu. Die Anordnung, die das Problem verursachte, war also:
Dock
Toolbar 1
Control 1
Control 2
Toolbar 2
Control 3
Control 4
Und die Lösung bestand darin, sie so zu arrangieren:
Dock
Toolbar 1
Control 1
Control 2
Toolbar 2
Control 3
Control 4
Es zeigt jedoch immer noch auf einen Fehler im TB2K -Code - man würde annehmen, dass es in der Lage sein sollte, verschachtelte Symbolleisten zu verarbeiten.
Lösung
Zusätzlich zu Lievens Antwort können Sie Debug -DCUs auch verwenden und einen Haltepunkt in tcomponent.destroy kurz bevor Sie die Schleife betreten.
In beiden Fällen müssen Sie den Anrufstapel untersuchen, um festzustellen, woher der Anruf/die Änderung zum Zählen kommt.
Ein sehr interessanter Artikel über Haltepunkte wurde von Cary Jensen geschrieben: http://caryjensen.blogspot.com/2010/08/breakpoints-with-side-effects.html
Andere Tipps
Sie müssen a hinzufügen Datenbestand bei @Self.FComponents.FCount
zu brechen, wenn sich die Anzahl ändert.
ComponentCount
ist eine Eigenschaft, die den Wert zurückgibt?GetComponentCount
GetComponentCount
kehrt zurückFComponents.Count
.FComponents
ist einTList
Instanz, die eine private hatFCount
Variable.