Panel1上にマウスポインタがきたら(OnMouseMove),Panel2と
Panel3の色と文字色を変え,Panel1からマウスが出たら,
それぞれ元の色に戻したいのです。
色と文字色を変えるのはできましたが,元に戻すことが
できません。どうしたらいいのでしょうか。
https://www.petitmonte.com/bbs/answers?question_id=1040
こちらを参照してください。
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;
にしのさん,Halbowさん,こんにちは。
Halbowさんのコードの理解もままならない初心者ですが,
よろしくお願いします。
早速Halbowさんのコードを打ち込んでみました。
Panel2の色は見事に変わり,また元にも戻りました。(感激!)
この調子で,Panel3の色も…と挑戦しましたが,ことごとく
コンパイルエラーになりました。
Panel2とPanel3の色を同時に変えるには,どうしたら
いいのでしょうか。
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を受け取って色を変える機能をつけたコンポーネントを作ってそれを使えば、コンポーネントに色を変える機能があればそれをどうこうするだけですみますね。
たかみちえさん,こんにちは。
コードの詳しい解説ありがとうございます。
初心者なので,なんとなく分かりかけてきたくらい
ですが,たいへん助かります。
さて,本題のほうですが,
>コンポーネント化することをおすすめします。
ということですが,一週間前にDelphiの入門書を買って
きたばかりなので,どういうふうにするのかさっぱり
分かりません。コンポーネントに詳しいサイトをご存知
でしたら,教えていただけませんか。
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;
とするだけです。
訂正です。
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;
できました。
Halbowさん,ありがとうございます。
begin と end の中に入れるんですね。
ところで,私が目指しているのはローマ字の入力を
キーボードの位置で教えるソフトです。
例えば,「か」を入力する場合「K]・「A」の位置が
分かるように色を変えようとしているのです。つまり,
Panel1のCaptionが「か」で,Panel2が「K」・Panel3が
「A」です。
これをすべての仮名で表そうとする場合,今のコードで
できるのでしょうか。
やはり,コンポーネント化でしょうか。
エクセルのVBAを少し勉強しただけの身で,Delphiの世界に
無謀にも飛び込んできましたが,よろしくお願いします。
Halbow です。
ここのような掲示板のQ&Aでは、質問は一つずつして下さいね。
別の内容の質問は別スレッドにすると、タイトルとの関連ができて
より多くの適切な回答を得られると思います。
Halbowさん,失礼いたしました。
そうですね。ここはいったん解決にして
別にスレッドを立てることにします。
にしのさん,Halbowさん,たかみちえさんありがとう
ございました。
これからも,よろしくお願いします。
ツイート | ![]() |