Код ниже воспроизведен из Toolbar2000. Это часть подпрограммы, которая считывает позиции панели инструментов и состояния док-станции из INI-файла. Я вызываю эту процедуру во время инициализации. Этот код ниже перебирает все компоненты в главной форме (OwnerComponent) и загружает настройки всех найденных панелей инструментов.
for I := 0 to OwnerComponent.ComponentCount-1 do begin
ToolWindow := OwnerComponent.Components[I]; // <------------------------
....
Эта итерация занимает некоторое время (секунды - в форме 1500 с лишним компонентов), и я получаю ошибку диапазона в показанной точке. Я установил, что один или несколько элементов удаляются из компонентов основной формы во время выполнения этого цикла, поэтому в конечном итоге цикл пытается получить доступ к одному за концом массива, как только это произошло (предположительно, было бы лучше закодировать это как "вниз" для цикла, чтобы предотвратить это).
В любом случае, мне нужно выяснить, где основная форма теряет компонент. Может ли кто-нибудь дать мне какие-либо советы по отладке Delphi 2006 о том, как это сделать? Я бы не ожидал, что какие-либо основные компоненты формы будут освобождены на этом этапе моей программы.
ОБНОВЛЕНИЕ
Я обнаружил, что, когда я изменил положение стыковки панели инструментов по умолчанию во время разработки, я непреднамеренно пристыковал ее к другой панели инструментов, а не к стыковочному сайту, в котором находилась другая панель инструментов. Я решил проблему, удалив панель инструментов из панели инструментов, она была вместо этого пристыковал и добавил его в док. Таким образом, механизм, вызвавший проблему, был следующим:
Dock
Toolbar 1
Control 1
Control 2
Toolbar 2
Control 3
Control 4
и исправление заключалось в том, чтобы расположить их следующим образом:
Dock
Toolbar 1
Control 1
Control 2
Toolbar 2
Control 3
Control 4
Это по-прежнему указывает на ошибку в коде TB2k — можно было бы предположить, что он должен иметь возможность обрабатывать вложенные панели инструментов.
for
только в том случае, если количество элементов фиксировано до начала итерации. Используйтеwhile
илиrepeat
, если вы не знаете, сколько итераций потребуется циклу.Repeat
проверки условий после каждой итерации (а вы знаете, что это как минимум одна итерация) иwhile
проверки условий перед каждой итерацией (это может быть вообще без итерации). - person Jørn E. Angeltveit   schedule 28.04.2011