掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
重なったコントロールのうち、下のコントロールのクリックを取得するには? (ID:20665)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
えーとさん、ありがとうございました。 おかげで希望の処理ができました。 クリックされた子が親を見て、親が持つすべての子を処理しています。 形としてはクリックされた子がすべての処理をしている感じですね。 自分自身もその中に含まれます。 個人的にはちょっと不思議な感じで、こういう形でも問題ないのかわからずにとまどっています。 ご指導いただけると幸いです。 > この判断は親ではなく、子が担当した方がスマートなのかもしれません。 と思いつつも、作ってみたら、上記の形にはなっていませんでした。 チェックしているコードをTMyPaintBoxのメソッドにすればよいのかもしれませんね。 今後の課題にしようと思います。 ----- //重なったすべてのTPaintBoxでクリックを拾う実験20060323 byデル太 //結論:各インスタンスの領域内の座標に換算してクリックを拾うことができた //TPaintBoxの場合、他のインスタンスが描画した場合でも、 //自分のインスタンス内の描画として判断される //フォームにPanel1とButton1を配置して実行してください unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TMyPaintBox = class(TPaintBox) private public protected procedure Paint; override; end; TForm1 = class(TForm) Button1: TButton; Panel1: TPanel; procedure Button1Click(Sender: TObject); procedure MyPaintBoxMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); //procedure MyPaintClick( private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; i: Integer; //描画する図形をずらすために使います implementation {$R *.dfm} { TMyPaintBox } procedure TMyPaintBox.Paint; begin inherited; with Self.Canvas do begin Pen.Width := 1; Brush.Style := bsClear; Rectangle(0,0,Width,Height); Pen.Width := 10; MoveTo(0,0); LineTo(100,100); end; end; procedure TForm1.Button1Click(Sender: TObject); var AMyPaintBox: TMyPaintBox; begin i := i + 1 ; AMyPaintBox := TMyPaintBox.Create(Form1); AMyPaintBox.Left := i * 20; AMyPaintBox.Top := i * 5; AMyPaintBox.Width := 100; AMyPaintBox.Height := 100; AMyPaintBox.Parent := Panel1; //表示 AMyPaintBox.OnMouseDown:=MyPaintBoxMouseDown; end; procedure TForm1.MyPaintBoxMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var i: Integer; OyaX, OyaY: Integer; //親コンポーネントでのX,Y座標 KoX, KoY:Integer; //子コントロールでのX,Y座標 begin OyaX := TMyPaintBox(Sender).Left + X; OyaY := TMyPaintBox(Sender).Top + Y; for i := 0 to Panel1.ControlCount -1 do begin with TMyPaintBox(Panel1.Controls[i]) do begin ShowMessage('今は奥から'+IntToStr(i) + '番目の図形をチェック中...'); KoX := OyaX - Left; KoY := OyaY - Top; if Canvas.Pixels[KoX,KoY] = clBlack then begin ShowMessage('そこは黒です!'); end; end; end; end; end.
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.