4

TPanelを派生させるカスタム Panel コンポーネントを作成しています。

新しいコンポーネントでOnMouseEnterおよびOnMouseLeaveイベントでコードを実行したいのですが、実装方法がわかりません。

TPanelがプロパティOnMouseEnterOnMouseLeaveを公開していることがわかります。

それらをオーバーライドして独自のコードを追加するにはどうすればよいですか?

私のアイデアの例:コンポーネント自体にあるはず のTMyPanel
のデフォルトの動作。

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

そして、実行時にこれらのイベントに何らかの機能を割り当てられるようにしたいと考えています。この割り当ては、アプリケーションで行われます。

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

最終的に、マウスが新しいパネルの上にあるとき、色が変わり、DoSomethingMore プロシージャに記述された他のアクションを実行する必要があります。

ありがとう

4

3 に答える 3

9

別のアプローチは、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;

EDIT:より良いVCL準拠のバージョンについては、以下を参照してください。

于 2010-02-02T08:42:16.593 に答える
3

利用可能な場合は、DoMouseEnter と DoMouseLeave をオーバーライドする必要があります。それ以外の場合は、他の回答が示すように、対応するメッセージをキャッチします。これはイベントを呼び出すため、継承を呼び出すことを忘れないでください。

于 2010-02-02T08:32:58.893 に答える
1

これは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.
于 2010-02-02T15:09:56.437 に答える