OnMouseMoveから出たときの処理は?

解決


なんとん  2003-12-19 05:35:40  No: 6322

Panel1上にマウスポインタがきたら(OnMouseMove),Panel2と
Panel3の色と文字色を変え,Panel1からマウスが出たら,
それぞれ元の色に戻したいのです。

色と文字色を変えるのはできましたが,元に戻すことが
できません。どうしたらいいのでしょうか。


にしの  2003-12-19 06:39:09  No: 6323

https://www.petitmonte.com/bbs/answers?question_id=1040
こちらを参照してください。


Halbow  2003-12-19 07:06:28  No: 6324

Halbow です。

Panel1 にマウスが入ってきたときと、出て行ったときのタイミング
がつかめられればいいのですね。こんな感じです。

    { Private 宣言 }
  public
    OriginalProc:TWndMethod;
    procedure SubClassProc(var Msg:TMessage);
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  OriginalProc := Panel1.WindowProc;
  Panel1.WindowProc := SubClassProc;
end;

procedure TForm1.SubClassProc(var Msg: TMessage);
begin
  OriginalProc(Msg);
  case Msg.Msg of
    CM_MOUSEENTER:Panel2.Color := clRed;
    CM_MOUSELEAVE:Panel2.Color := clBtnFace;
  end;
end;


なんとん  2003-12-19 14:17:54  No: 6325

にしのさん,Halbowさん,こんにちは。

Halbowさんのコードの理解もままならない初心者ですが,
よろしくお願いします。

早速Halbowさんのコードを打ち込んでみました。
Panel2の色は見事に変わり,また元にも戻りました。(感激!)
この調子で,Panel3の色も…と挑戦しましたが,ことごとく
コンパイルエラーになりました。

Panel2とPanel3の色を同時に変えるには,どうしたら
いいのでしょうか。


たかみちえ  URL  2003-12-19 15:46:15  No: 6326

Halbowさんのコードは、Panel1をサブクラス化して、
"CM_MOUSEENTER”メッセージ(マウスが入ってきたときのメッセージ)をキャッチして、色変更
"CM_MOUSELEAVE”メッセージ(マウスが出て行ったときのメッセージ)をキャッチして、同じように色変更
というような処理をしているわけです。
  Panel1.WindowProcは、Panel1のウィンドウプロシージャが入っていますから、それと自作プロシージャ(メッセージを処理している部分)を差し替えることで、サブクラス化を実現します。
  ただし一つ注意として、サブクラス化したら、必ず差し替え前のウィンドウプロシージャに処理を渡してあげなくてはなりません(自作プロシージャはあくまで自分の必要なメッセージしか処理してませんから)。
  それが、Halbowさんのコードでは
>  OriginalProc := Panel1.WindowProc;
>  Panel1.WindowProc := SubClassProc;
  このようなものであり(OriginalProcに、元々のプロシージャを格納、自作プロシージャをセット)
>  OriginalProc(Msg);
  このようにして、自作プロシージャの中で、元々のプロシージャを呼び出してあげる必要があるのです。

  さて本題。
> Panel2とPanel3の色を同時に変えるには
  コンポーネント化することをおすすめします。
コンポーネント化しない場合、Panel1と2と3のプロシージャをリスト管理して、
何とかして振り分けて——というような、面倒なことをしないといけません。
  CM_MOUSEENTER,LEAVEを受け取って色を変える機能をつけたコンポーネントを作ってそれを使えば、コンポーネントに色を変える機能があればそれをどうこうするだけですみますね。


なんとん  2003-12-19 18:08:14  No: 6327

たかみちえさん,こんにちは。

コードの詳しい解説ありがとうございます。
初心者なので,なんとなく分かりかけてきたくらい
ですが,たいへん助かります。

さて,本題のほうですが,
>コンポーネント化することをおすすめします。
ということですが,一週間前にDelphiの入門書を買って
きたばかりなので,どういうふうにするのかさっぱり
分かりません。コンポーネントに詳しいサイトをご存知
でしたら,教えていただけませんか。


Halbow  2003-12-19 18:58:09  No: 6328

Halbow です。

たかみちえさん、解説ありがとうございます。

> Panel2とPanel3の色を同時に変えるには,どうしたら

>  case Msg.Msg of
>    CM_MOUSEENTER:Panel2.Color := clRed;
>    CM_MOUSELEAVE:Panel2.Color := clBtnFace;
>  end;

ここを

  case Msg.Msg of
    CM_MOUSEENTER:begin
      Panel2.Color := clRed;
      Panel3.Color := clRed;
    end;
    CM_MOUSELEAVE:begin
      Panel2.Color := clBtnFace;
      Panel2.Color := clBtnFace;
    end;
  end;

とするだけです。


Halbow  2003-12-19 18:59:13  No: 6329

訂正です。

  case Msg.Msg of
    CM_MOUSEENTER:begin
      Panel2.Color := clRed;
      Panel3.Color := clRed;
    end;
    CM_MOUSELEAVE:begin
      Panel2.Color := clBtnFace;
      Panel3.Color := clBtnFace;
    end;
  end;


なんとん  2003-12-19 20:57:53  No: 6330

できました。

Halbowさん,ありがとうございます。
begin と end の中に入れるんですね。

ところで,私が目指しているのはローマ字の入力を
キーボードの位置で教えるソフトです。
例えば,「か」を入力する場合「K]・「A」の位置が
分かるように色を変えようとしているのです。つまり,
Panel1のCaptionが「か」で,Panel2が「K」・Panel3が
「A」です。
  これをすべての仮名で表そうとする場合,今のコードで
できるのでしょうか。
やはり,コンポーネント化でしょうか。

エクセルのVBAを少し勉強しただけの身で,Delphiの世界に
無謀にも飛び込んできましたが,よろしくお願いします。


Halbow  2003-12-19 21:11:07  No: 6331

Halbow です。

ここのような掲示板のQ&Aでは、質問は一つずつして下さいね。
別の内容の質問は別スレッドにすると、タイトルとの関連ができて
より多くの適切な回答を得られると思います。


なんとん  2003-12-19 22:03:02  No: 6332

Halbowさん,失礼いたしました。

そうですね。ここはいったん解決にして
別にスレッドを立てることにします。

にしのさん,Halbowさん,たかみちえさんありがとう
ございました。
  これからも,よろしくお願いします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加