Проблема
Я хотел бы упростить следующий код в Delphi XE6 для Windows , который становится недоступным, так как я добавляю все больше и больше типов компонентов.
Примечание по переносимости: Я хотел бы использовать тот же код позже в Lazarus 2.0.2 для Linux без особых изменений, поэтому об обработке сообщений Windows не может быть и речи.
Проблема в том, что я не могу найти способ назначить обработчик события OnMouseEnter для всех компонентов во всей Форме.
Я попробовал все, что мог, включая различные классы, общие в их дереве объектов.,Кажется, что событие OnMouseEnter нигде не встречается.
Сам обработчик события содержит только одну команду (процедура = функция void), и его больше не будет, может быть, это могло бы упростить всю проблему?
Как вы можете видеть ниже, в этот момент мне нужно добавить каждый тип компонента (в настоящее время только TLabel, TButton и TEdit) в цикл for.
procedure TFormMain.FormCreate(Sender: TObject);
var
I: Integer;
begin
for I := 0 to FormMain.ComponentCount - 1 do
begin
if FormMain.Components[I] is TLabel then
begin
(FormMain.Components[I] as TLabel).OnMouseEnter
:= @CustomGenericMouseEnter;
end;
if FormMain.Components[I] is TButton then
begin
(FormMain.Components[I] as TButton).OnMouseEnter
:= @CustomGenericMouseEnter;
end;
if FormMain.Components[I] is TEdit then
begin
(FormMain.Components[I] as TEdit).OnMouseEnter
:= @CustomGenericMouseEnter;
end;
end;
end;
procedure TFormMain.CustomGenericMouseEnter(Sender: TObject);
begin
SingleCustomProcedure; // no arguments, nor return value
end;
Мотивация
Я программирую приложение color picker и поэтому хочу показать пользователю координаты мыши.
У меня есть таймер опроса, я неЯ не хочу добавлять больше кода, чем необходимо, поэтому я надеюсь, что это не требует пояснений:
procedure TFormMain.TimerMousePollTimer(Sender: TObject);
begin
if MousePosChanged then
begin
LabelEdit_MousePosX.Text := MousePosX.ToString;
LabelEdit_MousePosY.Text := MousePosY.ToString;
end;
end;
Далее, у меня есть OnMouseLeave .