Причина, по которой это работает, когда вы делаете это из кода, заключается в том, что вы заменяете указатель на обработчик событий, независимо от того, что было раньше.
Во время разработки у меня есть два возможных места для установки обработчика. Предположим, у меня есть Frame1 в Unit1 и я помещаю его в MyForm в MyUnit, у меня будет возможность установить обработчик событий в обоих местах.
В вашем случае вы хотите установить обработчик событий в самом фрейме (в моем примере это Unit1), так как код, на который он ссылается, находится в самом фрейме. Если вы это сделаете, это должно работать. Если вы установите обработчик события в месте, где он используется (MyUnit), то обработчик события будет назначен там.
Delphi достаточно умен, чтобы по-прежнему вызывать обработчик событий из вашего фрейма, если этот обработчик событий был назначен за до , когда вы добавили его в форму. Если вы сначала добавили его в форму, а затем добавили обработчик в фрейм, последний из фреймов будет вызываться , а не .
Хуже того, если вы удалите обработчик в форме, он все равно не вызовет обработчик в кадре.
Что вам нужно сделать, это:
Щелкните правой кнопкой мыши форму и выберите «Просмотреть как текст». Прокрутите вниз до рамки. Это должно быть что-то вроде:
inline FrameX: fraVehicleUnitFrame1
Под этим ищите
inherited cmdNewOwner: TButton
Там вы должны увидеть что-то вроде:
OnClick = FormOldClickHandler
или, возможно,
OnClick = nil
Удалите это назначение OnClick, снова просмотрите форму и сохраните. Все должно быть хорошо. Если вы теперь выберите кнопку (или что-то вроде cmdNewOwner) в форме, инспектор объектов не должен показывать ничего рядом с этим событием.