掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
生成したTPaintBoxに線を描画するには? (ID:20593)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
匿名?様、さ(どやま)様、Mr.XRAY様、メッセージありがとうございます。 今日は時間がないため、いただいたメッセージに回答ができませんが、どうぞご了承ください。 今日は、最後に残った課題「独自のイベント実装」にトライしていました。 調べた結果「独自イベントは自分で起こす」ことと知りながら、すっかり気づかず最後の最後ではまりましたが何とか完成できました。 独自イベントが発生して、ダイアログが表示されたときはうれしかったです。 みなさま、本当にありがとうございます。 作成したコードについて、お気づきの点などございましたら、ご指導をいただけると幸いです。 ----- //独自イベント実装を実験します 20060321 15:09 //祝WBC Japan優勝! 優勝直後、独自イベント発生を確認できました //Paintメソッドでイベントを発生させるメソッドを呼び出すことに気づかず //しばらくはまっていました。その点がわかりにくいように感じました //その点を注意してコードをご覧になってみてください。 //コードの合間に説明を添えています //コードの内容や、説明に誤りなどございましたら、 //ご指摘、ご指導いただけると幸いです //よろしくお願いします //掲示板のやりとりの中で、疑問と感じて調査、解決できた内容について //一区切りできる内容にできたと感じています。 //多くの皆様にご指導、ご指摘いただきました。 //ご指導いただいた皆様に感謝いたします // by デル太 //独自の描画をする目的で質問をはじめ、いくつかの実現方法が考えられました //その最後の方法として、独自イベントを実装する例を検討しました。 //ただし、特に必要がなければ独自イベントまで使う必要はないと感じています //イベント実装例の簡単な例として、技術的なことを追確認できると思います。 //イベント実装の説明 //イベントはプロパティとして実装されている //そのプロパティには、イベントが発生する際に実行するメソッドを保持する //そのメソッドをイベントハンドラのと呼ぶ //イベントハンドラはTForm型から派生したクラスのメソッドのこと //具体的にはForm1のメソッドのひとつとして実装される //イベントハンドラはオブジェクトインスペクタでイベントに関連付けることができる //その関連情報は、*.dfmファイルに保存される //独自イベントを実装する場合も、この方法で実装する unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; //TPaintBoxに必要 type //独自イベントを持ったクラスを準備する TMyPaintBox = class(TPaintBox) private //ここでイベントハンドラを保持する変数を準備する //その変数はイベント型とする //イベントの発生元(Sender)だけをパラメータに持つイベントは //TNotifyEvent型の変数を準備する //独自パラメータを持つイベントは次の形で宣言する // // 自作イベント型=Procedure(パラメータ1,パラメータ2,...) of Object; // //この例を見ると、メソッド(プロシージャ)が代入されていることがわかる //これは具体的には、メソッドのポインタを代入する //このようにメソッド(イベントを含む)を代入した変数を、メソッドとして //実行することができる //このサンプルで、その実例を見ることができる FOnMyEvent: TNotifyEvent; //イベント型として宣言する protected //独自のイベントは自作コードの中のどこかで発生するように作りこむ //そのためにイベントを発生させたい場所で、このメソッドを呼び出す //その結果、イベントが起きることになる //この記述内容からだけでは、このメソッドがイベントとはわからない(と思う) procedure MyEvent(Sender: TObject); //Paintメソッド内で独自イベントを発生させる //そのため、オリジナルのメソッドに機能を追加する procedure Paint; override; public published //イベントはプロパティとして実装するので、ここでプロパティで定義する //定義の仕方は通常のプロパティと同じ //やはりこの記述内容からだけでは、このプロパティがイベントとはわからない property OnMyEvent: TNotifyEvent read FOnMyEvent write FOnMyEvent; end; TForm1 = class(TForm) procedure Button1Click(Sender: TObject); //TFomr型派生クラスのメソッドとして実装する //するとイベントハンドラとして扱われる procedure MyEventHandler(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} { TMyPaint } //イベントを発生させたいときにこのメソッドを呼び出す procedure TMyPaintBox.MyEvent(Sender: TObject); begin //Assigned関数でポインタ変数または手続き型変数が割り当てられているかテストする //FOnMyEventは変数だが、プロシージャを保持している //それを呼び出せば、保持された関数が実行される //それではいつ変数にプロシージャを代入するのだろうか? //設計時に配置したオブジェクトの場合、オブジェクトインスペクタで //イベントハンドラを関連付けるが、そのときに代入される //今回のように動的に生成したオブジェクトはIDEで代入しないため、 //どこかでコードで代入することになる //たとえばForm.Createなどで次のように代入できる // Button1.OnClick := MyClick; if Assigned(FOnMyEvent) then FOnMyEvent(Self); end; procedure TForm1.Button1Click(Sender: TObject); begin end; //独自イベントが発生した際に呼び出されるイベントハンドラ //これは、通常のイベントハンドラと同様に扱うことができる //たとえばButton1Clickのイベントハンドラと同じ作業で準備できる procedure TForm1.MyEventHandler(Sender: TObject); begin TMyPaintBox(Sender).Canvas.Ellipse(0, 0, 30, 30); //小さい円を描く ShowMessage('独自イベントが発生しました'); end; //FormCreateメソッドで、独自イベントを実装したオブジェクトを生成し、 //生成したオブジェクトが持つ独自イベントとイベントハンドラを関連付けている procedure TForm1.FormCreate(Sender: TObject); var AMyPaintBox: TMyPaintBox; //独自イベントを持つ変数を準備 begin AMyPaintBox := TMyPaintBox.Create(Self); AMyPaintBox.OnMyEvent := MyEventHandler; //イベントにイベントハンドラを関連付ける AMyPaintBox.Parent := Form1; //表示する end; //このメソッドの中に独自イベントを実装する procedure TMyPaintBox.Paint; begin inherited; MyEvent(Self); //ここで独自イベントが発生することになる end; end.
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.