グローバル変数の扱い方

解決


デルデル  2006-10-06 18:49:27  No: 23488

お世話になります。
変数の扱い方で聞きたいのですが、
varの下に変数を定義するものとpublicの所で定義する変数は
インスタンスを作成する手順はありますが、同じグローバル変数ですよね?
それとも根本的に違う(使用方法に関して)のでしょうか?


通りすがり  2006-10-06 22:46:21  No: 23489

親がどれになるかの違いしかないと勝手に理解しています。
使用方法はどこに定義しようと変わりません。


えーと  2006-10-07 00:11:06  No: 23490

スコープが似ているだけで、全く違います。

implementation より上の var で宣言されたのが、真の意味のグローバル変数で
す。TForm1 の public に宣言されたのはクラスのフィールド変数です。これは
おのおののインスタンスに付随した変数です。インスタンスで使う変数は、本質的
にここで宣言すべきです。普通のグローバル変数と違って、インスタンスと1対1
の関係があります。当然ながら、インスタンス自体がスコープ外のときは、アクセ
スできません。

逆に真のグローバル変数は、インスタンスに依存しない用途に使うべきです。
例えば、何かの状態を表すフラグとかの複数のインスタンスからアクセスされる
べきもの、などです。


そうなの  2006-10-07 01:38:04  No: 23491

ということは、
TForm1のものだけど、皆が使うものはpublicに、
誰のものでもないけど、皆が使うものはvarに宣言する、でOK?


Fusa  2006-10-07 07:21:47  No: 23492

そうです。

TForm1というか、Form1.A、でアクセスするものですね。

var Form1Copy: TForm1;
...
Form1Copy := TForm1.Create(...

って記述もできるし
Form1.Aと
Form1Copy.Aは
別物になりますね。


虫の穴  2006-10-07 09:26:12  No: 23493

クラスに属さないグローバル変数は極力使わないようにすべきです。
でないと、思わぬドツボにハマルことも…
例えば、以下のようにしても多重定義エラーにはなりません。
当然、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;


デルデル  2006-10-11 06:08:45  No: 23494

<では、ここで問題。
<以下の Unit3のボタンクリックの結果は?
「21」ですかね。uses unit1, unit2;  最後に定義したunitが有効になりましたが...


Fusa  2006-10-11 06:55:54  No: 23495

なぞなぞに答えてもらうという主旨ではなくて
可読性の低いプログラムは書かない方がいいよ。
っていう話だと思いますよ。

Unit1.AAAやUnit2.AAAという指定も出来るのですが
グローバル変数は自分は、ほとんど使いませんね。


そう?  2006-10-11 07:19:06  No: 23496

Form1 とか Form2 とかもグローバル変数ですよね。
ユニットをひとつだけに限定して宣言すればよく、とくに避ける理由は
ないですよ。


デルデル  2006-10-11 17:19:23  No: 23497

もっと統一した答えが出ると思ったのですが、長いレスになりそうなので
この問題の質問者として解決済みにしておきます。


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

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






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