掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
生成したTPaintBoxに線を描画するには? (ID:20579)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
Mr.XRAY様、3月19日の発言に回答させていただきますね。 あれこれ悩んでしまって、ぜんぜん、まとまってないんです。 お詫びします。 それでも、最後に少し糸口が見えてきました。 そのまま発言いたしますが、皆様、どうぞ、お付き合いください。 > 最初の内は,用語よりも,体で感じた方がいいと思いますよ. ご指摘ありがとうございます。 言葉から入って、実行が遅くなる傾向がありますので、気をつけるようにしますね。 > > TForm1 = class(TForm) > > Button1: TButton; > > Button2: TButton; > > procedure Button1Click(Sender: TObject); > > private > > { Private 宣言 } > > public > > { Public 宣言 } > > end; まず私の理解をそのまま書いてみますね。 あたっているでしょうか? 一番大きいのがTForm1というクラス。これは、TFormを継承している。 TForm1はクラスだから、そのままでは使えない。どこかで変数を宣言しているはず。 TForm1というクラスにはButton1とButton2という2つのメンバがある。 Button1とButton2はTButton型として宣言されている。 どこで生成するのだろう・・?と気になる。(が目をつぶって使う) TForm1というクラスにはButton1Clickというメソッドがある。 Button1ClickというメソッドはSenderという名前のTObject型の引数を要求する Button1Clickはprocedureなので、戻り値はない この次の行からprivateや{Private宣言}とあるが、ここまでの3行は何になるのだろう?? > の場合,Button1,Button2はTButtonというクラスのオブジェクトです これは理解できているみたいです。 実装部で次のように使う場合の延長で解釈して問題なさそうですね。 var AStringList: TStringList; 問題は、どこで生成しているのか???という点がわかっていないみたいです。 自作クラスの内部に(すいません、内部という表現をつかいますね)別のクラスを持たせる場合、自作クラスのコンストラクタ(Createメソッド←イベントかもしれません)で生成し、デストラクタでFreeする例を見かけたことがあるので、クラスのメンバとして宣言(用語としては「定義」が正解??)したオブジェクトは生成不要ということはなさそうな気がします・・。 >そしてこれらはTForm1というクラスのオブジェクトです. この文面だけみると次のようなコードをイメージしてしまいます。 Form1: TForm1; //これらはTForm1というクラスのオブジェクトです Form2: TForm1; // TForm1というクラスのオブジェクト、という表現は、TForm1というクラスのメンバとなるオブジェクト、と解釈すればよいでしょうか? 上記でも「内部」という表現を使って逃げてしまったように、私は、この部分をキチンと理解できていないみたいです。 > >MyButtonというクラスも作っていませんから、特定のクラスに属していません。 > MyButtonのイベントは,MyButtonのイベントで,TForm1のクラスのものです. これは私の次の発言を対象にして説明していただいています。 > b)生成したボタンにイベントを実装する場合 > procedure TForm1.MyButtonClick(Sender: TObject); //これは自分で記述しました 最初に実際のコードで書かなかったことをお詫びします。 以下にMyButton1Clickの実装部を追加してみました。この形で進めていいでしょうか? ----- > > TForm1 = class(TForm) > > MyButton1: TMyButton; > > procedure MyButton1Click(Sender: TObject); > > private > > { Private 宣言 } > > public > > { Public 宣言 } > > end; procedure MyButton1Click(Sender: TObject); begin end; ----- この場合、 a)MyButtonのイベントは b)MyButtonのイベントで c)TForm1のクラスのものです a)は、次の行を指す表現になりますか? > > procedure MyButton1Click(Sender: TObject); b)は「MyButton型のイベントで」と解釈してよいでしょうか? やはり、私は、b)の表現を、ちゃんと理解できずにいるみたいです。 なので、この時点では、この点を整理して質問することが難しい。どうぞご了承ください。 たぶん、私が一番わからないでいるのは「MyButton1」の「イベント」という表現なんです。 MyButton1Clickを見ていて、そのイベントというと「Click」のことなのかな?と思ってしまうんですよ。 d-1)MyButtonクラスはTButtonを継承しているのでClickというイベントを内部に(「内部」を使いますね)持っている d-2)そのオブジェクトMyButton1はClickイベントを持つ d-3)MyButton1でClickイベントが発生した場合にコードを実装する場合、IDEのオブジェクトインスペクタが使えるならIDEがMyButton1Clickというプロシージャを自動生成する d-4)同時にMyButton1Clickというプロシージャの実行部分が自動で開かれるのでそこにコードを書く ※ちなみに上記d-3とd-4はDelphiのIDEがコードを自動生成するルール(言語でなくIDEの仕様)なのかな?と思っています。 動的に生成した場合、オブジェクトインスペクタが使えないので、次のようになりますね d-3')オブジェクトインスペクタが使えないので、procedure TForm1.MyButtonClick(Sender: TObject);を書く d-4')クリックイベントで実行するコードを次のように割り当てる MyButton1.OnClick := TForm1.MyButtonClick; このように考えてしまうんですね・・。 一応、IDEの場合と動的生成の場合で、矛盾はしていないように思うのですが、しっかり把握できていないと感じています。 具体的には、 procedure MyButton1Click(Sender: TObject); はイベントではないのかもしれない。 という気持ちが出てきてしまい、しっくりいかないんです。 Paintを使って再描画できるけど、再描画のコードはPaintBoxPaint内にない。 そこが納得できないから、というのもあります。 他にも、「イベント」とは別に「イベントハンドラ」という用語があるのではないか?と思ってしまうんです。 ・イベントを実装する ・イベントハンドラにコードを記述する というような使い分けがあるような気がしているんです。 Windowsでは「ウィンドウハンドル」というのにここで「ハンドラ」というのには何か意味がありそうだ・・・とか・・。 これって、さどやま様がおっしゃる「先進国アメリカの用語を機械的に翻訳して始まっていますので」にあたる部分なんですよね?きっと。 特にイベント、ハンドラ、ハンドルは翻訳さえもしていないですし。 ネイティブスピーカーなら理解できるのでしょうか・・??? まとめられなくて、ごめんなさい。そのまま進みますね。 ここから先の部分は一番目のコードの課題ですので、誤解をさけるため、もう一度引用しておきますね。 > > TForm1 = class(TForm) > > Button1: TButton; > > Button2: TButton; > > procedure Button1Click(Sender: TObject); > > private > > { Private 宣言 } > > public > > { Public 宣言 } > >Button1Clickも、TForm1に属していて、Button2には属していないですね。 > Button2はTForm1のオブジェクトで,Button1ClickはButton1のイベントです. はい、Button2はTForm1に配置されたオブジェクトですね。納得できます。 「TForm1のオブジェクト」という表現は、「Form1はTForm1型のオブジェクト」という文意での「TForm1のオブジェクト」という同じ表現ですが、「TForm1のメンバオブジェクト」と受け取ればいいですよね? > 「Button1ClickはButton1に属している」と言い方は変です. すいません。 Form1にButton1とButton2を置いた場合が上記のコードになりますよね。 そのとき、Button1とForm1の上下関係をどう表現したらよいのかわからなくて「属する」と表現していました。 Button1がForm1に「属する」と表現して適当な感じがしたので、procedure Button1ClickもForm1に「属する」と表現したんです。 このようなオブジェクトの上下関係をどのように表現するのがよいでしょうか? クラスの上下関係というのもありそうで、混乱しそうですね。まずは、オブジェクトの上下関係(含有関係)が気になっています。 > また「オブジェクトの外部」という用語は多分意味不明です. > (ヘルプのどこかに説明があったのでしょうか?) > (内部にあるとか外部にあるとかも私は初耳です) すいません。この点もお詫びいたします。 Form1にPanel1とPanel2を置いたとします。 Panel1にButton1を、Punel2にButton2を置きます。 教えていただいたので、Button2のClickイベントにButton1のClickイベントを割り当てることができるようになりました。 この場合、Button1のClickイベントはButton2の外部にある・・、とか、そういう関係を表現したいのですが、どのように表現するとよいでしょうか・・? そもそも、オブジェクトの内部とか外部とか意識しない方がよいのでしょうか? > あまり理解していない内に(自作?)用語を乱用すると,文章を読む人が混乱します. ごめんなさい。 もう少し理解してから、もう一度整理してみますね。 今回の発言は、ぜんぜんまとまらずに申し訳ありません。 それでも、疑問を文章にする中で、コード上の表現の差には厳密に意味があるのかも?と感じ始めました。 次のような感じです。 A)クリック時に実行するコードを記述する場所:用語は「イベントハンドラ」? Button1Click begin xxxx; end; B)クリックイベントの割り当て:イベントは実はプロパティなので代入している? OnClick := xxx; C)イベント(実装場所がどこかにある) OnClick begin xxxx; end; ますます混乱しているのですが、極端ながら直接的な例を思いついたのでコードを実行してみました。 フォームにButton1とButton2を置き、Button1のClickに適当な処理を記述します。 Button2のClickにはオブジェクトインスペクタでButton1Clickを割り当てます。 これで、Button2のClickイベントでButton1Clickプロシージャが実行されますね。 ----- 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 showmessage('aaa'); end; end. ----- この中には、 Procedure Button2Click(Sender: TObject); がないですね。 これがあって、その中で Button1Click(TButton(Sender)); ・・・コードA とでもなっていると、なんとなく納得できるのですが、実際は違うんですね・・・。 ちなみに、上記コードAで期待通りに動作しました。 ----- 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); procedure Button2Click(Sender: TObject); //Button2をダブルクリックしてコードを入力したら生成された private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin showmessage('aaa'); end; procedure TForm1.Button2Click(Sender: TObject); begin Button1Click(TButton(TObject)); //・・・コードAの実装 end; end. ----- コードAの実装部分は Button1Click; だけや Button1Click(Sender); ではエラーが起きるのでは?と感じていた予想通り、コードAにしないとNGでした。 このことから、なんとなく、方向性は当たっているように思います。 やはり「dfmファイル」の中の次のコードが理解できれば・・、という感じがします。 --- object Button2: TButton Left = 0 Top = 288 Width = 185 Height = 25 Caption = #... TabOrder = 1 OnClick = Button2Click //このコードが理解できれば・・? end --- どうぞ、お力添えをよろしくお願いします。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.