喫茶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さん

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

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


[6382] Re4:Mouseメッセージの捕獲返信 削除
2012/9/19 (水) 18:12:06 おかぽん
▼ snail3さん
> マウスイベントですが、コンポーネント本体でクリックした時は
> 反応しますが、このコンポーネントに載せた子コンポーネントで
> クリックすると補足することができませんでした。子供でクリック
> した場合も横取りする方法はないでしょうか。


WM_PARENTNOTIFYをとっつかまえると、子コントロールのマウスダウンだけなら
補足できるようです。

手抜きかつDelphi5での記述ですが・・・
とりあえずTScrollBoxと位置を表示するためのTLabelを1個を配置。
それ以外は、TPanelとかTEdit,TConboBox,TListBox等を、TScrollBox上に適当に配置。

type
  TScrollBox=class(Forms.TScrollBox)
  private
    procedure WMParentNotify(var Message: TWMParentNotify); message WM_PARENTNOTIFY;
  public
    HintLabel        :TLabel;
  end;

  TForm1 = class(TForm)
    ScrollBox1: TScrollBox;
    Label1: TLabel;
    //コンポーネントいろいろ
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  end;

procedure TScrollBox.WMParentNotify(var Message: TWMParentNotify);
begin
  if HintLabel <> nil then begin
    case Message.Event of
      WM_LBUTTONDOWN: HintLabel.Caption := 'L: X=' + IntToStr(Message.XPos) + ' Y=' + IntToStr(Message.YPos);
      WM_MBUTTONDOWN: HintLabel.Caption := 'M: X=' + IntToStr(Message.XPos) + ' Y=' + IntToStr(Message.YPos);
      WM_RBUTTONDOWN: HintLabel.Caption := 'R: X=' + IntToStr(Message.XPos) + ' Y=' + IntToStr(Message.YPos);
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ScrollBox1.HintLabel := Label1;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ScrollBox1.HintLabel := nil;
end;

[6384] Re5:Mouseメッセージの捕獲返信 削除
2012/9/19 (水) 20:33:14 Mr.XRAY
▼ おかぽんさん

すげぇ !! (みち子さんに『はしたなない』と言われてしまいそう)

WM_PARENTNOTIFY メッセージですか,
早速ググッてみました.なるほどです.
XPos と YPos から TWinControl はコントロールを判定できまからね.
これは使えますね.ありがとうごさいます.

>Delphi5での記述ですが・・・

でも基本は同じですからね.(^^;

[6386] Re6:Mouseメッセージの捕獲返信 削除
2012/9/19 (水) 23:42:26 snail3
▼ Mr.XRAYさん

> XPos と YPos から TWinControl はコントロールを判定できまからね.


これって簡単に取り出す関数無いですよね。
知っていたら教えて下さい。



[6388] Re7:Mouseメッセージの捕獲返信 削除
2012/9/20 (木) 11:47:48 おかぽん
▼ snail3さん
> これって簡単に取り出す関数無いですよね。
> 知っていたら教えて下さい。

すでにマスターからレスがありますが、FindVCLWindowは、ウインドウハンドルを
持っているコンポーネントしか拾うことができないようなので、
直接の子コントロールしか返してくれないけど、ウインドウハンドルなしでもOKな
ControlAtPosを使ってみると、こんな感じですかね。

上記のWMParentNotify内で行うなら
var
  ctrlPos: TPoint;
  control1, control2: TControl;

    ctrlPos := Point(Message.XPos, Message.YPos);
    control1 := ControlAtPos(ctrlPos, True, True);
    while control1 <> nil do begin
      control2 := control1;
      if control2 is TwinControl then begin
        //子コントロールの座標に変更
        ctrlPos := Point(ctrlPos.X - TwinControl(control2).Left,
                         ctrlPos.Y - TwinControl(control2).Top);
        //子コントロール内のコントロールを検索
        control1 := TwinControl(control2).ControlAtPos(ctrlPos, True, True);
      end
      else begin
        control1 := nil;
      end;
    end;
  {ここで control2 がマウス下のコンポーネント
  今更ながら、WMParentNotifyは ウィンドウハンドルのないコントロールからは
  届かないので、TScrollBoxに直接貼ったTLabelとかだと、ここではつかまえることが
  できないですね。}

[6389] Re8:Mouseメッセージの捕獲返信 削除
2012/9/20 (木) 13:10:52 Mr.XRAY
▼ おかぽんさん

これで出揃った感じですね.
ControlAtPos がありました.
これ便利ですよね.無効化したのも,子コントロールも検出しますから.

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