掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
生成したTPaintBoxに線を描画するには? (ID:20576)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
直前の発言での(1)〜(3)を動作確認した内容を紹介します。 既知の方は多いと思いますが、参考になる方も中にはいらっしゃると思いますので、Unit1.pas全体を紹介します。 ----- //Paintで再描画するコードの実装方法を試しました // //実装例1:IDEで配置したPaintBoxを対象にIDEの機能でOnPaintのコードを入力 //実装例2:動的に生成したPaintBoxのPaintイベントに実装例1で生成したPaintBoxの // OnPaintを割り当てた //実装例3:動的に生成したPaintBoxのPaintイベントに独自に入力したMyOnPaintを // 割り当てた // //実行時はフォームにPaintBoxを1個、Buttonを2個配置しています unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) PaintBox1: TPaintBox; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure PaintBox1Paint(Sender: TObject); //イベントが発生した際に割り当てるコードをユーザが独自に実装する場合 //この部分を自分で入力する //プロシージャの引数は、発生するイベントに合わせておく必要がある //この位置(TForm1の中)に書くべきか、他(TForm1の外)がいいのかは、 //まだよく理解できていないので、今後の課題とする procedure MyOnPaint(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} {ここから下はPaintイベントで実行するコードを入力しています PaintBox内のコードを共有する場合と、独自コードを利用する場合があります} //IDEで配置したPaintBoxのPaintメソッドで円を表示する procedure TForm1.PaintBox1Paint(Sender: TObject); begin //ここで描画した円は最初から表示されています { //実装例1:一番シンプルな実装 //Paintメソッド(イベント?)にコードを書くと必要に応じて再描画される //配置したPaintBox1だけに描画する場合はこのコードを実行してみよう //その際PaintBox1は円が表示されるがAPaintBoxを生成しても円は表示されなくなる with PaintBox1.Canvas do begin Ellipse(0,0,100, 100); //隣接四角形(0,0)-(100,100)に内接する円を描く end; } //実装例2:複数のオブジェクトで共有できる実装例〜その1 //「実装例1」を元にイベントが発生したオブジェクト(Sender)に描画するように修正した //SenderのままだとCanvasが使えないのでTPaintBoxに型キャストして利用している //この形なら動的に生成したPaintBoxから、このメソッドを共有できる //具体的な動作としては、APaintBoxを生成した段階でCanvasに円が表示される with TPaintBox(Sender).Canvas do begin Ellipse(0,0,100, 100); //隣接四角形(0,0)-(100,100)に内接する円を描く end; end; //TPaintBox型のオブジェクト用:キャンバスに円を表示するだけのコード procedure TForm1.MyOnPaint(Sender: TObject); begin //実装例3:複数のオブジェクトで共有できる実装例〜その2 //ユーザが独自に追加したメソッドをイベントに割り当てる形で実装している //以下の実行コードは実装例2と同じ命令で、描画サイズを変えています with TPaintBox(Sender).Canvas do begin Ellipse(0,0,50, 50); //隣接四角形(0,0)-(50,50)に内接する円を描く end; end; {ここから下が動作テスト部分です} //ボタンをクリックするとPaintBoxを動的に生成する procedure TForm1.Button1Click(Sender: TObject); var APaintBox: TPaintBox; begin //PaintBoxを動的に生成する。引数(型はTComponent)には今回はSelfを指定した //この引数を省略するとSelfが指定されたことになる //Selfは自分自身が呼び出されたインスタンスオブジェクトTForm1を渡す←ヘルプで確認した //今回はForm1に配置したので、Form1が渡され、TPaintBoxのOwnerとしてセットされる APaintBox := TPaintBox.Create(Self); //動的に生成したオブジェクトはParentプロパティをセットすると画面に表示される APaintBox.Parent := Form1; //生成したAPaintBoxのPaintイベントに再描画のコードを割り当てる //ここではIDEで配置したオブジェクトのコードを割り当てている //割当先が実装例1のままだと、配置したオブジェクト(PaintBox1)に描画するだけで //使えないので実装例2のようにSenderオブジェクトを利用するよう修正した APaintBox.OnPaint := PaintBox1Paint; end; //ボタンをクリックするとPaintBoxを動的に生成する(その2) //下記を除きButton1Clickと同じです。 // ・Topを指定している // ・MyOnPaintを割り当てている procedure TForm1.Button2Click(Sender: TObject); var APaintBox: TPaintBox; begin APaintBox := TPaintBox.Create(Self); APaintBox.Top := 170; //別の位置に表示するために指定している APaintBox.Parent := Form1; //生成したAPaintBoxのPaintイベントに再描画のコードを割り当てる //ここでは自分で記述したメソッドを割り当てている APaintBox.OnPaint := MyOnPaint; end; end. ----- できれば、この発展で直前の発言の(4)まではトライしたいと思っています。 (4)に関しては、別のスレッドで、やはりMr.XRAY様や「は?」様から大変参考になりそうなコメントをいただいています。 まだ時間を取れずにいるのですが、それも参考に進めていくつもりです。 □スレッド:背景が透明な線を描画するには、どのようなアプローチが良いか? https://www.petitmonte.com/bbs/answers?question_id=3775
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.