お世話になります。
変数の扱い方で聞きたいのですが、
varの下に変数を定義するものとpublicの所で定義する変数は
インスタンスを作成する手順はありますが、同じグローバル変数ですよね?
それとも根本的に違う(使用方法に関して)のでしょうか?
親がどれになるかの違いしかないと勝手に理解しています。
使用方法はどこに定義しようと変わりません。
スコープが似ているだけで、全く違います。
implementation より上の var で宣言されたのが、真の意味のグローバル変数で
す。TForm1 の public に宣言されたのはクラスのフィールド変数です。これは
おのおののインスタンスに付随した変数です。インスタンスで使う変数は、本質的
にここで宣言すべきです。普通のグローバル変数と違って、インスタンスと1対1
の関係があります。当然ながら、インスタンス自体がスコープ外のときは、アクセ
スできません。
逆に真のグローバル変数は、インスタンスに依存しない用途に使うべきです。
例えば、何かの状態を表すフラグとかの複数のインスタンスからアクセスされる
べきもの、などです。
ということは、
TForm1のものだけど、皆が使うものはpublicに、
誰のものでもないけど、皆が使うものはvarに宣言する、でOK?
そうです。
TForm1というか、Form1.A、でアクセスするものですね。
var Form1Copy: TForm1;
...
Form1Copy := TForm1.Create(...
って記述もできるし
Form1.Aと
Form1Copy.Aは
別物になりますね。
クラスに属さないグローバル変数は極力使わないようにすべきです。
でないと、思わぬドツボにハマルことも…
例えば、以下のようにしても多重定義エラーにはなりません。
当然、Unit1の AAAと Unit2の AAAは、それぞれのユニット内では、まったく別の変数と解釈されます。
unit Unit1;
...
var
AAA: Integer = 10;
implementation
...
unit Unit2;
...
var
AAA: Integer = 20;
implementation
...
では、ここで問題。
以下の Unit3のボタンクリックの結果は?
unit Unit3;
...
implementation
{$R *.DFM}
uses unit1, unit2;
procedure TForm3.Button1Click(Sender: TObject);
begin
AAA := AAA + 1;
Button1.Caption := IntToStr(AAA);
end;
<では、ここで問題。
<以下の Unit3のボタンクリックの結果は?
「21」ですかね。uses unit1, unit2; 最後に定義したunitが有効になりましたが...
なぞなぞに答えてもらうという主旨ではなくて
可読性の低いプログラムは書かない方がいいよ。
っていう話だと思いますよ。
Unit1.AAAやUnit2.AAAという指定も出来るのですが
グローバル変数は自分は、ほとんど使いませんね。
Form1 とか Form2 とかもグローバル変数ですよね。
ユニットをひとつだけに限定して宣言すればよく、とくに避ける理由は
ないですよ。
もっと統一した答えが出ると思ったのですが、長いレスになりそうなので
この問題の質問者として解決済みにしておきます。
ツイート | ![]() |