コンストラクタについて教えてください


DO  2009-05-09 20:42:57  No: 34321

かなり初心者の質問になってしまうのですが、教えてください。
コンストラクタはオブジェクトが生成されるときに呼び出されるのですよね?
今Unit1でボタンを押し、Unit2で宣言した変数を呼ぶとします。
Unit2は画面などはなく、ただ宣言があるだけです。(.pasのみ)
このとき、Unit1のボタンを押した場合、Unit2の変数を呼び出す際にUnit2で
書いたConstructorは呼び出されないのでしょうか?

いちおデバッグ環境で試したところ呼び出されませんでした。
私としては、Unit2の変数などを使う場合その変数がはじめてつかわれたのであればコンストラクタをまず通ると認識しているのですが…。

そもそもオブジェクトの生成という意味を調べたのですが、よくわかってないのかもしれません。


場合によりけり  2009-05-09 20:56:47  No: 34322

>このとき、Unit1のボタンを押した場合、Unit2の変数を呼び出す際にUnit2で
>書いたConstructorは呼び出されないのでしょうか?
そのUnit2の変数が自動生成されるフォームでない独自クラスのメンバーであるなら、自分でそのクラスのConstructorを呼び出さずにアクセスした場合に例外が発生するけど、クラスに属さないグローバル変数なら大丈夫。


KHE00221  2009-05-10 00:59:03  No: 34323

>Unit2は画面などはなく、ただ宣言があるだけです。(.pasのみ)
>Unit2で書いたConstructorは呼び出されないのでしょうか?

constructor Create;
begin

end;

こんな感じには記述できないはずだけど・・・・


toc  2009-05-10 07:09:02  No: 34324

> コンストラクタはオブジェクトが生成されるときに呼び出されるのですよね?
これはいいですが
> その変数がはじめてつかわれたのであればコンストラクタをまず通る
この認識が間違い。変数を宣言や参照しただけでオブジェクトが勝手に作られることはありません。

var hoge: THoge; // ←これは入れ物を宣言しただけ
hoge := THoge.Create; // ←これではじめてオブジェクトが生成され、使えるようになる

Form1とかは変数宣言しただけで使えているように見えるかもしれませんが、
それはアプリケーションが起動時に生成して変数に割り当ててくれるからです。
(.dprをテキスト形式で開くと、Application.CreateFormで作っていることがわかります)

ちなみに、unitを使うだけで自動的に生成させる方法としては
initialization節を使う方法があるのでヘルプで調べてみてください。


・・・  2009-05-10 07:10:15  No: 34325

hogehoge := クラス名.Create

とかやれば、Constructor通るでしょ?

単純に変数宣言しただけで、通るわけないよ。

> 私としては、Unit2の変数などを使う場合その変数がはじめて
> つかわれたのであればコンストラクタをまず通ると認識しているのですが…。
使うだけで通りません。
というか「使う」ってどう使うの?
Integer型, String型のような使い方?
だとしたら、クラス型の使い方を勉強したほうがいいと思う。


DO  2009-05-11 18:28:02  No: 34326

みなさんありがとうございます。

THogeクラスの道具を使用する場合はhoge := THoge.Createとし、THogeのConstructorをして初めて使えるようになるという認識でよいのでしょうか?

あとFormがあるときはprocedure THogeForm.FormCreate(Sender :TObject);
はConstructorと一緒と考えていいのでしょうか?それともtocさんがいっているようにApplication.CreateFormをやっていることでConstructorをし、procedure THogeForm.FormCreate(Sender :TObject);はただの初期化と考えればよいのでしょうか?

みなさん、理解が乏しくて申し訳ないですがよろしくお願いします。


toc  2009-05-12 05:04:06  No: 34327

> procedure THogeForm.FormCreate(Sender :TObject);
> はConstructorと一緒と考えていいのでしょうか?
コンストラクタはあくまでもTCustomForm.Createで、
FormCreateやら(どんな名前を付けてもいいですが)は
そこから呼び出されるイベントハンドラです。
(OnCreateのヘルプを見ると、コンストラクタから呼ばれると書いてあるはずです)

やりたければ自分でコンストラクタ(Create)をオーバーライドすることもできますが、少々知識がいるし面倒でもあるので
Formの場合は手軽に初期化コードが書ける場所を用意してあるということです。

ついでに「Constructorをする」ではなくて「Constructする」ですね。
誰かがConstructをした時に呼び出されるものがConstructorです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加