Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Object Inspector. Потеря обработчиков событий компонентов фрейма

Елена Филиппова

Создаем фрейм, содержащий контролы, которые имеют собственные обработчики событий. При помещении на форму таких фреймов нужно быть с ними очень осторожными в design-time. Достаточно случайно "войти" в процедуру обработки такого события для компонента фрейма, чтобы IDE автоматически сформировала обработчик этого события для формы, а не для фрейма. После этого, при удалении этого обработчика, обработчик "задетого" события во фрейме полностью игнорируется.

"Камушек" кроется в том, что IDE при удалении обработчика из ObjectInspector не вытирает упоминание о нем из файла *.dfm, а просто присваивает ему там nil!

Для иллюстрации "камня" приводится тестовый проект. На форме лежат два совершенно одинаковых фрейма, исходный код и OI показывают, что эти фреймы абсолютно идентичны, но(!) один из них отрабатывает нажатие на кнопку, а второй полностью его игнорирует.

Источник беды виден в файле формы *.dfm (View as text) :


....
  inline frClick1: TfrClick
    Left = 5
    Top = 32
  end
  inline frClick2: TfrClick
    Left = 6
    Top = 128
    TabOrder = 1
    inherited BitBtn1: TBitBtn
      OnClick = nil
    end
  end
....

ТИПОВЫЕ РЕШЕНИЯ

  1. Стараться не щелкать без надобности по OI;
  2. Если такое случилось, проверить и откорректировать файл *.dfm , удаляя ненужное описание обработчика (в тестовом примере это строка "OnClick = nil")

Скачать тест StoneTest_26.zip (1.8K)

КОММЕНТАРИЙ:

Еще один метод борьбы заключается в правильном способе удаления ненужного обработчика. Ведь нам нужно вообще удалить нечаянно созданный обработчик события с формы, не так ли? Очистка события в OI только отключает процедуру от компонента, не удаляя ее из кода модуля. И правильно делает - она могла быть задействована где-то еще.

Если действовать "по всем правилам искусства", как рекомендуют классики, то надо очистить тело процедуры обработчика от кода между begin и end, а затем просто сохранить файл (F2 в классической раскладке). IDE Delphi при сохранении файла очищает форму от пустых обработчиков, и делает это корректно (все в точности возвращается назад).

Так что, может быть, это не глюк, а фича такая: "OnClick = nil" - способ отключить унаследованный от фрейма обработчик, не прибегая к коду.

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay