Как выбрать рамку Delphi вместо ее компонентов для события onclick? - PullRequest
4 голосов
/ 04 октября 2019

Я создал форму VCL, содержащую несколько копий TFrame, каждый из которых содержит несколько TLabel компонентов.

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

Как создать событие OnClick кадра, еслипользователь щелкает в любом месте кадра?

Ответы [ 3 ]

9 голосов
/ 04 октября 2019

VCL проверяет реакцию графического (не оконного) элемента управления на события мыши, прежде чем решить, является ли он допустимой целью. Вы можете использовать специальную метку, которая изменяет этот ответ. Проще всего было бы использовать класс вставки в вашем фрейме (если ожидается, что все метки будут вести себя одинаково).

type
  TLabel = class(Vcl.StdCtrls.TLabel)
  protected
    procedure CMHitTest(var Message: TCMHitTest); message CM_HITTEST;
  end;

  TMyFrame = class(TFrame)
  ...
  end;

...

procedure TLabel.CMHitTest(var Message: TCMHitTest);
begin
  Message.Result := HTNOWHERE;
end;
1 голос
/ 04 октября 2019

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

0 голосов
/ 04 октября 2019

Если вы не против, чтобы текст Label был серым, вы можете просто установить свойство Enabled ваших Labels на False. Это не позволит вашим меткам захватывать любые события клавиатуры или мыши, и, таким образом, все они попадут в базовый кадр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...