掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
生成したTPaintBoxに線を描画するには? (ID:20571)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
「は?」さん、ありがとうございます。 すごくよく分かりました。 (1)Selfの扱いについて > > 疑問1: > > 対象を省略した場合、すべてフォームになるのでしょうか? > 省略した場合、Self.の扱いになる。 この説明は、なんとなく目にしていましたが、 > すなわち、そのメソッドを記述しているクラスが対象。 この部分まで把握していませんでした。 > procedure TForm1.HogeHoge( > ^^^^^^^この部分が、Selfとして扱われる。 この具体例で、ばっちり分かりました。大変分かりやすい例示をありがとうございます。 念のためヘルプでSelfを調べてみましたが、TCollectionItemの例なのと、クラスメソッドに該当するか判断が必要だったりで、判断しきれませんでした。 「は?」さんの例は今回のポイントをストレートに解釈でき、本当に嬉しく拝見しました。 (2)イベントの共有について > Button1.OnClick := Button1Click; > Button2.OnClick := Button1Click; > Button3.OnClick := Button1Click; > Button4.OnClick := Button1Click; > Button5.OnClick := Button1Click; > > イベントの共有。 > > procedure TForm1.Button1Click(Sender:TObject); > begin > if Sender = Button1 then begin > > end > else if 〜 > end; > > > なんか、感じ取れるか? はい、こちらもありがとうございます! このように使えることから、イベント発生時に実行されるコードを「割り当てる」感じがわかりました。 イベントハンドラで「実行したいコードが書かれているプロシージャを指定する」ことになりますね。 プロシージャですから、それがクラスの内部にあるか外部にあるかは関係ない・・・のだと理解しました。 提示いただいたサンプルコードも参考に、ヘルプも見て、実際に動かしてみました。 ヘルプでは、AboutBoxの部分がエラーになったので、ボタンを押した際のメッセージ表示を共有しています。 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin if Sender = Button1 then ShowMessage('Button1Click!') else ShowMessage('Not Button1!'); end; end. 皆さんには既知と思いますが、このコードには共有指定が見当たらなかったので他のファイルを調べてみたところUnit1.dfmファイルに該当箇所(らしい部分)がありました。 ----- object Button1: TButton Left = 96 Top = 48 Width = 75 Height = 25 Caption = 'Button1' TabOrder = 0 OnClick = Button1Click //←この部分と end object Button2: TButton Left = 96 Top = 96 Width = 75 Height = 25 Caption = 'Button2' TabOrder = 1 OnClick = Button1Click //←この部分 end ----- (3)意味不明な質問の部分について > > 疑問2: > > もしかすると、イベントが発生した際に実行するコードというのは、 > > イベントが起きたオブジェクトとは無関係(オブジェクトの外部にある)と考えるべきなのですか? > 質問の意味不明。 確かになんのことだかわからない内容になってますね。 ご指摘ありがとうございます。 (1)と(2)で自分なりに整理できました。 再描画するには「Paintで処理すればいい」という点から、最初は「クラスのPaintメソッドに線を引くコードを追加する」と考えたのです。 それを「クラスを継承して元のPaintを呼び出し、線を描画する処理を追加する」と考えました。 メソッド内に記述するコードなのでなので「クラス内部にある」と表現しました。 (ここでかなり勘違いしていたことが、今は、わかりました) ところが、イベントが発生した際のコードは、次のような場合があります a)フォームに貼り付けたボタンの場合 procedure TForm1.Button1Click(Sender: TObject); //これは自動的に生成されます b)生成したボタンにイベントを実装する場合 procedure TForm1.MyButtonClick(Sender: TObject); //これは自分で記述しました a)はフォームに貼り付けたボタンに属している(内部にある)と解釈しましたが、 type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); //この部分の実装内容なのでTForm1の内部と考えた private { Private 宣言 } public { Public 宣言 } end; b)は自分でコードを書きましたし、MyButtonというクラスも作っていませんから、特定のクラスに属していません。 これを「外部にある」と表現しました。 ・・・と書いてみて、自分の誤りに気づきました。 上記コードを見直すと、Button1Clickも、TForm1に属していて、Button2には属していないですね。 この2例からすると「イベント発生時の実行コードはオブジェクトの外部に持つ」となりますね。 また、クラスに新たに独自のイベントを実装するのと、イベントが発生した際に実行するコードを記述するのは、全く違うというこも(たぶん)わかりました。 後者の「イベントが発生した際に実行するコード」を書く場所を「イベントハンドラ」と言うのですよね? このあたり、私の理解も混乱し、用語の使い方も混乱していました。 ご指摘とご説明をいただいて、かなり整理できてきたと思います。 ありがとうございます。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.