EventHandler внутри TFrame? - PullRequest
4 голосов
/ 10 июля 2009

У меня есть TForm (TVehicleEditForm) с 3 идентичными TFrames (TVehicleUnitFrame) внутри.

Идея заключалась в том, что каждый экземпляр фрейма обрабатывает собственные события на eventhandler внутри фрейма. Проблема в том, что eventhandler не вызывается.

Я попытался назначить eventhandler по коду внутри фрейма, переопределив метод Create, но в этом случае обработчик также не вызывается.

Но если я назначу eventhandler вне рамки из формы, он будет работать нормально. Как это:

fraVehicleUnitFrame1.cmdNewOwner.OnClick := fraVehicleUnitFrame1.cmdNewOwnerClick;
fraVehicleUnitFrame2.cmdNewOwner.OnClick := fraVehicleUnitFrame2.cmdNewOwnerClick;
fraVehicleUnitFrame3.cmdNewOwner.OnClick := fraVehicleUnitFrame3.cmdNewOwnerClick;

И это только для одной кнопки! Поскольку у меня много компонентов внутри фрейма, это приведет ко многим назначениям ... Весьма некрасивый код, когда это нужно сделать прямо в инспекторе объектов.

Я использую D2007. Есть идеи о причине?

С уважением, Роланд

Ответы [ 2 ]

12 голосов
/ 10 июля 2009

Причина, по которой это работает, когда вы делаете это из кода, заключается в том, что вы заменяете указатель на обработчик событий, независимо от того, что было раньше.

Во время разработки у меня есть два возможных места для установки обработчика. Предположим, у меня есть Frame1 в Unit1 и я помещаю его в MyForm в MyUnit, у меня будет возможность установить обработчик событий в обоих местах.

В вашем случае вы хотите установить обработчик событий в самом фрейме (в моем примере это Unit1), так как код, на который он ссылается, находится в самом фрейме. Если вы это сделаете, это должно работать. Если вы установите обработчик события в месте, где он используется (MyUnit), то обработчик события будет назначен там.

Delphi достаточно умен, чтобы по-прежнему вызывать обработчик событий из вашего фрейма, если этот обработчик событий был назначен за до , когда вы добавили его в форму. Если вы сначала добавили его в форму, а затем добавили обработчик в фрейм, последний из фреймов будет вызываться , а не . Хуже того, если вы удалите обработчик в форме, он все равно не вызовет обработчик в кадре.

Что вам нужно сделать, это:

Щелкните правой кнопкой мыши форму и выберите «Просмотреть как текст». Прокрутите вниз до рамки. Это должно быть что-то вроде:

inline FrameX: fraVehicleUnitFrame1

Под этим ищите

inherited cmdNewOwner: TButton

Там вы должны увидеть что-то вроде:

OnClick = FormOldClickHandler

или, возможно,

OnClick = nil

Удалите это назначение OnClick, снова просмотрите форму и сохраните. Все должно быть хорошо. Если вы теперь выберите кнопку (или что-то вроде cmdNewOwner) в форме, инспектор объектов не должен показывать ничего рядом с этим событием.

0 голосов
/ 15 февраля 2019

Это старая проблема, но у меня была похожая проблема в Рио 10.3. В главной форме вы можете нажать опцию «Вернуться к унаследованному».

Этот параметр находится на вкладке «События» в «Инспекторе объектов». Щелкните правой кнопкой мыши на «OnItemClick» и выберите параметр «Вернуть в наследство».

...