В моем пользовательском компоненте, как я могу увеличить события mouse-enter и -leave? - PullRequest
4 голосов
/ 02 февраля 2010

Я делаю пользовательский компонент Panel, который получает TPanel .

Я хочу, чтобы мой новый компонент выполнял некоторый код для событий OnMouseEnter и OnMouseLeave , однако я не знаю, как его реализовать.

Я вижу, что TPanel имеет опубликованные свойства OnMouseEnter , OnMouseLeave .

Как мне переопределить их и добавить свой собственный код?

Пример моей идеи:
Поведение по умолчанию TMyPanel , которое должно быть в самом компоненте.

on event OnMouseEnter do: Color := NewColor;
on event OnMouseLeave do: Color := OldColor;

И затем, я хочу иметь возможность назначить некоторую функцию этим событиям во время выполнения. Это назначение выполняется в приложении.

.. TButton1.Click ..
begin
    MyPanel1.OnMouseEnter := DoSomethingMore;
    MyPanel1.OnMouseLeave := DoSomethingElse;
end;

так что в конце, когда мышь находится над новой панелью, она должна изменить цвет и выполнить некоторые другие действия, написанные в процедуре DoSomethingMore.

Спасибо

Ответы [ 3 ]

9 голосов
/ 02 февраля 2010

Другой подход заключается в том, чтобы обрабатывать сообщения Windows самостоятельно:

type
  TMyPanel = class(TPanel)
  private
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  published
  end;

implementation

{ TMyPanel }

procedure TMyPanel.CMMouseEnter(var Message: TMessage);
begin
     // Do whatever your want before the event
     if Assigned(OnMouseEnter) then OnMouseEnter(Self);
end;

procedure TMyPanel.CMMouseLeave(var Message: TMessage);
begin
     // Do whatever your want before the event
     if Assigned(OnMouseLeave) then OnMouseLeave(Self);
end;

РЕДАКТИРОВАТЬ: см. Ниже для лучшей версии VCL-совместимого.

3 голосов
/ 02 февраля 2010

Если они доступны, вы должны переопределить DoMouseEnter и DoMouseLeave. В противном случае перехватите соответствующие сообщения, например , другой ответ показывает . Не забудьте назвать наследуемым, так как это вызовет события.

1 голос
/ 02 февраля 2010

Вот VCL-совместимая версия (проверено D2010)

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TMyPanel = class(TPanel)
  private
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  published
  end;

  TForm1 = class(TForm)
    Panel1: TPanel;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Procedure OnMEnter(Sender: TObject);
    Procedure OnMLeave(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
     With TMyPanel.Create(Form1) do
     Begin
          Parent := Form1;
          Caption := 'Test';
          OnMouseEnter := OnMEnter;
          OnMouseLeave := OnMLeave;
     End;
end;

procedure TForm1.OnMEnter(Sender: TObject);
begin
     Form1.Caption := 'Entered';
end;

procedure TForm1.OnMLeave(Sender: TObject);
begin
     Form1.Caption := 'Left';
end;

{ TMyPanel }

procedure TMyPanel.CMMouseEnter(var Message: TMessage);
begin
     // Do whatever your want before the event
     Self.Caption := 'Custom Enter';
     // Call inhertied method handler
     Inherited;
end;

procedure TMyPanel.CMMouseLeave(var Message: TMessage);
begin
     // Do whatever your want before the event
     Self.Caption := 'Custom Left';
     // Call inhertied method handler
     Inherited;
end;

end.
...