喫茶XRAYトップページ

[スレッド全体
]

[6350] Mouseメッセージの捕獲返信 削除
2012/9/13 (木) 23:23:56 snail3
すみません、また教えて下さい。
TScrollBoxからコンポーネントを作成しました。
作成したコンポーネントでマウスダウンを捕獲したいと思って

  Application.OnMessage := DoMessage;

といったコードを書きました。フォームが1つの時は良かったのですが
、複数のフォームでこのコンポーネントを使うと最初に作った
コンポーネントでマウスイベントが補足できなくなりました。

TScrollBoxにはOnMouseDown イベントが最初から存在しているので
単純に override できればいいんですが、

    procedure DoMouseDown(var Message: TWMMouse; Button: TMouseButton;
      Shift: TShiftState); override;

と適当にコード書いてみましたが「基本クラスで見つかりません」
と怒られてしまいました。

よろしくお願いします。


[6351] Re:Mouseメッセージの捕獲返信 削除
2012/9/14 (金) 01:03:56 Mr.XRARY
▼ snail3さん,どうもです.

>     procedure DoMouseDown(var Message: TWMMouse; Button: TMouseButton;
>       Shift: TShiftState); override;
>
> と適当にコード書いてみましたが「基本クラスで見つかりません」
> と怒られてしまいました。


イヒヒヒッ(いやみな笑い)
実は,DoMouseXXX はないのでございますよ.
MouseXXX ならあるでござんす.
とりあえず,お休みなさい.

継承コンボで,内部で使用するメソッド類を作成する時は,
以下のように,タイピングすると,あるかどうか確認しやすいです.

http://mrxray.on.coocan.jp/Delphi/Others/A_IDETechnique.htm#07

[6352] Re2:Mouseメッセージの捕獲返信 削除
2012/9/14 (金) 08:40:37 snail3
▼ Mr.XRARYさん

ありがとうございました。無事 MouseDown でコーディングできました。

最初 [Ctrl]+[Space] でゴニョゴニョしてみましたが変化なし。

その後アプリソースの OnMouseDown の定義をゴニョゴニョして作成。
無事コンパイルが通りました。今試していますが問題なさそうです。


本当にありがとうございました。


[6366] Re3:Mouseメッセージの捕獲返信 削除
2012/9/17 (月) 16:06:51 snail3
▼ snail3さん

またまた大ぼけをかましていました。

マウスイベントですが、コンポーネント本体でクリックした時は
反応しますが、このコンポーネントに載せた子コンポーネントで
クリックすると補足することができませんでした。子供でクリック
した場合も横取りする方法はないでしょうか。


[6367] Re4:Mouseメッセージの捕獲返信 削除
2012/9/17 (月) 16:37:03 Mr.XRAY
▼ snail3さん.どうもです.

> マウスイベントですが、コンポーネント本体でクリックした時は
> 反応しますが、このコンポーネントに載せた子コンポーネントで
> クリックすると補足することができませんでした。子供でクリック
> した場合も横取りする方法はないでしょうか。


たしか,TScrollBoxを継承したコンポでしたよね.
載せるコンポというのは,動的に,つまり,実行時に生成して載せる
ということですよね.

とすると,動的に生成して載せたコンポにマウスイベントを
定義するしかないのかな ?

複数生成するのであれば,管理が必要だと思います.
以下のように,配列とか,ジェネリックが便利ですが,Delphi 2007
以降ですね.確か.
http://mrxray.on.coocan.jp/Delphi/plSamples/160_CreateComponent.htm#02

> クリックすると補足することができませんでした。子供でクリック
> した場合も横取りする方法はないでしょうか。


「横取り」と言えば,マウスフックなんてのも考えられますが.
う〜ん.少し考えてみないと... 何とも言えマシェーン.

[6368] Re5:Mouseメッセージの捕獲返信 削除
2012/9/17 (月) 17:46:59 snail3
▼ Mr.XRAYさん
> たしか,TScrollBoxを継承したコンポでしたよね.
はい

> 載せるコンポというのは,動的に,つまり,実行時に生成して載せる
> ということですよね.

伝票形式の入力で利用するコンポーネントです。1行分は設計時に
置いてあります。実行時にプロパティで指定した行数分、最初に
置いたコンポーネントをコピーして使っています。

 
> とすると,動的に生成して載せたコンポにマウスイベントを
> 定義するしかないのかな ?


できれば避けて通りたいと考えています。

> 「横取り」と言えば,マウスフックなんてのも考えられますが.
> う〜ん.少し考えてみないと... 何とも言えマシェーン.


ボタンクリックしたときにだけ反応できればいいんですが、

よろしくお願いします。

私も無い頭をもう少し使ってみます。

[6369] Re6:Mouseメッセージの捕獲返信 削除
2012/9/17 (月) 20:41:58 Mr.XRAY
考えてみたのですが(本当か?)
やっぱり,生成した子コンポにイベントを割り当てのが一番のような
気がします.どうせ生成コードを書かなければならないのですから.

こんな感じですね.
動作確認環境は,Windows XP(SP3) + Delphi XE

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
    APanel : TPanel;
    procedure OnPanelChildChick(Sender: TObject);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  APanel := nil;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if APanel = nil then begin
    APanel                  := TPanel.Create(Self);
    APanel.Parent           := Self;
    APanel.ParentBackground := False;
    APanel.Color            := clSkyBlue;
    APanel.SetBounds(30, 50, 200, 200);

    with TButton.Create(Self) do begin
      Parent  := APanel;
      Name    := 'AAA';
      OnClick := OnPanelChildChick;
      SetBounds(50, 50, 100, 40);
    end;

    with TButton.Create(Self) do begin
      Parent  := APanel;
      Name    := 'BBB';
      OnClick := OnPanelChildChick;
      SetBounds(50, 100, 100, 40);
    end;
  end;
end;

procedure TForm1.OnPanelChildChick(Sender: TObject);
begin
  Application.MessageBox(PChar(TControl(Sender).Name), '情報');
end;


[6370] Re7:Mouseメッセージの捕獲返信 削除
2012/9/17 (月) 21:32:13 snail3
▼ Mr.XRAYさん

独自に色々と実験しているんですが、教えて下さい。

    procedure WndProc(var Message: TMessage); override;

を定義してみました。
最初

  if Message.Msg = WM_LBUTTONDOWN then   // マウス左ボタンクリック

としてメッセージを拾っていましたが、子コンポーネントのマウスクリック
は補足できませんでした。 でもメッセージ自体は発生している様です。


    if ( Message.Msg = WM_LBUTTONDOWN )   // マウス左ボタンクリック
      or( Message.Msg = $B034 ) then   // マウス左ボタンクリック

実際に子コンポーネントでクリックすると B034 が発生するようです。

改めて TMessage とは何か?ヘルプには WMメッセージが入っている
と書かれているのですが、当然 $B034 なんてありません。

↓こちらのサンプルでは
http://delfusa.main.jp/delfusafloor/archive/www.nifty.ne.jp_forum_fdelphi/samples/00214.html

 if Msg.Msg= MSWHEEL_ROLLMSG then

などとしているのですが「MSWHEEL_ROLLMSG」って「Winapi.Windows」
で文字列定義されています。

頭から湯気が出そうです。

>やっぱり,生成した子コンポにイベントを割り当てのが一番のような
>気がします.どうせ生成コードを書かなければならないのですから.


元のコンポーネントの OnClick 処理を保存するのがちょっと嫌だな
などと思っています。怠け者ですみません。




[6380] Re8:Mouseメッセージの捕獲返信 削除
2012/9/18 (火) 22:58:17 おかぽん
▼ snail3さん
> 実際に子コンポーネントでクリックすると B034 が発生するようです。

Delphi5 で恐縮ですが、Controls.pas で宣言されている
"CM_INVALIDATE" だったりしません?
52=$34

  CM_BASE                   = $B000;
  CM_INVALIDATE             = CM_BASE + 52;



[6391] Re9:Mouseメッセージの捕獲返信 削除
2012/9/20 (木) 22:42:19 snail3
▼ おかぽんさん
> ▼ snail3さん
> > 実際に子コンポーネントでクリックすると B034 が発生するようです。
>
> Delphi5 で恐縮ですが、Controls.pas で宣言されている
> "CM_INVALIDATE" だったりしません?


そうです。これみたいです。最初よく理解できていませんでしたが(現在も)
やっと少しわかったような気持ちになっています。


> 52=$34
>
>   CM_BASE                   = $B000;
>   CM_INVALIDATE             = CM_BASE + 52;
>


最終的に WndProc に戻ってきました。

↓こんな感じでコーディングしています。ごく短時間のテストですが
よさそうな感じです。

  if ( Message.Msg = WM_LBUTTONDOWN )   // マウス左ボタンクリック
    or( Message.Msg = CM_FOCUSCHANGED ) then   // CM_FOCUSCHANGED  = CM_BASE + 7;

なんだか難しそうでよく読んでいなかったこの↓ページを
我慢して勉強しておけば皆さんに迷惑をかけなくてすんだようです。

第2章 コントロールのメッセージ処理(その1)
http://mrxray.on.coocan.jp/Halbow/VCL02.html



[6392] Re10:Mouseメッセージの捕獲返信 削除
2012/9/20 (木) 22:51:29 snail3
 
> なんだか難しそうでよく読んでいなかったこの↓ページを
> 我慢して勉強しておけば皆さんに迷惑をかけなくてすんだようです。
>
> 第2章 コントロールのメッセージ処理(その1)
> http://mrxray.on.coocan.jp/Halbow/VCL02.htm


誤解を生みそうなので捕捉しますが、文書自体の話ではなくて、
あくまで根気がなく頭の悪い私が事です。
 

[6393] Re11:Mouseメッセージの捕獲返信 削除
2012/9/20 (木) 23:13:07 Mr.XRAY
▼ snail3さん,どうもです.

> > なんだか難しそうでよく読んでいなかったこの↓ページを

何を隠そう.私もあまりまじめに読んでいませんです.

> > 我慢して勉強しておけば皆さんに迷惑をかけなくてすんだようです。

そういうのは,この店ではないんじゃないでしょうか?
snail3 さんの発言と,おかぽんさんのおかげで勉強になりましたし.
そして,もしかしたら,このスレッドを読んでいる方々にも参考に
なったんじゃないかと,密かに思っています.(^^

[6394] 謝ってもらいたいのは,迷惑をかけた人返信 削除
2012/9/20 (木) 23:31:16 Mr.XRAY
しつこい性格なので,

> > > 我慢して勉強しておけば皆さんに迷惑をかけなくてすんだようです。

「迷惑」と言えば,過去にステハンで発言した方に,
「ご迷惑をおかけしました」と
一言あやまってもらいたいですね.ハッキリ言って.

他人に迷惑をかけて謝らないのは,人として情けないです.ハッキリ言って.
そういう人は,政治家にも,今回の中国に対しても,原発の事故に関しても,
大津の中学校の事件に関しても,
何も発言する資格はありません!! ハッキリ言って.

『邪魔なMr.XRAYのサイトを消すのに刃物はいらぬ,
喫茶XRAYでステハンで発言すればいい』
ってね.

[6395] Re:謝ってもらいたいのは,迷惑をかけた人返信 削除
2012/9/21 (金) 08:37:50 snail3
▼ Mr.XRAYさん

私物忘れが良い方でして ^^;

過去のことを繰り返し思い出しているとだんだんと腹が立ってきてしまいますよ。

(私の場合は反応する気力が無くなったのかもしれませんが)

「嫌なことは聞かなかったふりをする。」

ことが時々できるようになりました。

[▼次のスレッド]
INCM/CMT
Cyclamen v3.82