すみません”わ”の「気になって睡眠不足その2」です。
これは書籍やヘルプに書いてありそうなものなのですが、今ひとつ
自分の中で消化し切れておらず、友人に聞かれて答えられなかったものです。
もしよろしければ噛み砕いてお願いできればと...
VCLフォームアプリケーションを新規に作成すると下のようなスケルトンが自動作成されますよね。
-------------------------------------------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
{------A-------}
private
{ Private 宣言 }
{------B-------}
public
{ Public 宣言 }
{-----C-------}
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
end.
-----------------------------------------------------------
ここで疑問なのは自分で作った関数なり手続きなり、自分で宣言した変数
なりを{---A---}の位置に宣言する場合と{---B---},{---C---}で宣言する
場合とでは何が違うのですか。Aの位置だと「TForm1というクラスの中にXXX
という関数がある。」になると思うのですがBだと「TForm1というクラスの
中に可視性がprivateのxxxという関数がある。」となるのではないでしょうか。
可視性を横においておけば実質的な違いは無いと思うのですが、何か重要な
違いがあるのですか?ちなみにオブジェクトインスペクタからイベントを設定するとAに宣言が入りますよね...うーむ
事故便乗です
同じような趣旨の疑問で
var
Form1 : TForm1;
の部分は「かくかくしかじかなTForm1というクラス型のForm1という
変数を作ったよ」だと思うのですがここへ変数をたとえば
var
Form1 : TForm1;
xxx : integer;
とするのとA,B,Cの所で宣言するのとではどう違うのでしょう?
ごわぁー
事故便乗---->自己便乗です
{------A-------}について
Delphiが直接管理使用するセクションで、触るのはタブー。
変数なり、メソッドを宣言してコンパイルしてみるとよいでしょう。
もちろん、大切なプロジェクトでは行わないこと。
祟りがあるかもしれません。
{------B-------} {------C-------}について
http://www.jurapun.com/Tutorial/delphi4/beginner/tutor-class.htm
などを検索で調べ、それでも疑問に残る点をつめて再質問されるとより理解できるでしょう。
> var
> Form1 : TForm1;
> xxx : integer;
グローバル(広域?)変数と呼ばれます。
http://oto.chu.jp/kujira/text/delphi/zero/13.htm
などを一度参照してみてください。
グローバル変数はできるだけ使うべきではないとよく言われます。
しかし、積極的に使うべき場合もあり、そう言われても初心者は困ります。
私の経験では、変数はまずより狭い有効範囲で作成してみる。
コンパイルして「未定義の識別子」となったら、理由を考え昇格させる。
そうすると、こうした疑問がだんだん解けてきます。
できれば下記の1か2でまず作成してみます。
1.最も有効範囲が狭い変数
手続き・関数内で宣言した変数
2.private 内で宣言した変数
3.public 内で宣言した変数
4.グローバル変数
> 3.public 内で宣言した変数
> 4.グローバル変数
訂正
3.public 内で宣言した変数
4.implememtation 部で宣言するユニット内変数
implementation
var
yyyy: Integer;
5.グローバル変数
さどやまさんこんばんわ
リンク先を参考にさせてもらいました。
なるほどたたりのある領域には踏み込んではいけませんね。
(意外とこういう理由のほうがよくわかる)あと変数は有効範囲の
狭いほうから順にというのも良くわかります。意図に反して変数の
内容が書き換わってしまうバグを避けるためにですよね(隠蔽というん
でしたっけ?)なるほどなるほどよくわかるわぁ--->多謝
ツイート | ![]() |