Если вас интересуют только дети с MDI, как вам кажется, учитывая, что вы используете MDIChildCount
формы, то используйте MDIChildren
формы имущество. Эти два свойства сочетаются друг с другом, как и свойства FormCount
и Forms
экрана. Ваш код смешивает свойство form с свойством screen .
begin
for I := 0 to MDIChildCount - 1 do
begin
if MDIChildren[I] is TFrmMessage then
begin
Кроме того, вам определенно следует вычесть 1 из числа диспетчеров запросов, иначе это означает, что вы неправильно отслеживаете, сколько менеджеров запросов у вас изначально. «-1», который вы видите в большинстве кодов, присутствует, потому что верхняя граница цикла Delphi «for» равна включительно . Переменная цикла начнется с нижней границы, и цикл продолжит работать, пока переменная не пройдет верхнюю границу. Это может помочь вам понять, что происходит в базовом случае, когда в списке нет элементов. В этом случае цикл вообще не должен запускаться, верно? Потому что там нечего найти. Цикл, установленный для запуска из «0 to 0
», будет выполняться один раз, поэтому верхняя граница должна быть отрицательной , чтобы предотвратить запуск цикла. (Все это описано в документации .)
Что касается того, почему ваша функция возвращает нулевую ссылку, даже если вы думаете, что это не должно, я могу только предположить, что это связано с другими проблемами в вашем коде. Возможно, вы не зацикливаетесь на стольких формах, как вы думали, или, возможно, вы выходите за пределы списка менеджера запросов и получаете какое-то неопределенное значение. Размещение вашего Result
назначения является правильным, хотя на самом деле не имеет значения, куда вы его поместили, поскольку единственное другое место, которое ему назначено, находится непосредственно перед выходом из функции.
Я вижу , который вы спрашивали о детях с ДИ на About.com. Там Зарко Гаджич ответил на ваш вопрос , сообщив вам такой код:
for cnt := 0 to -1 + MDIChildCount do
Хотя это действительный код, он не является идиоматическим. Я никогда не видел, чтобы кто-нибудь еще писал такой код, поэтому было бы разумно не использовать эту привычку. Когда мы хотим на единицу меньше, чем что-либо, мы не добавляем буквально отрицательный к значению. Скорее вычитаем положительное:
for cnt := 0 to MDIChildCount - 1 do
В качестве альтернативы, я иногда использую стандартную функцию Pred
:
for cnt := 0 to Pred(MDIChildCount) do