掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
複数のユニットを使用するには? (ID:15161)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
面白そうなので参戦します。 最初にお断り。 私も、ヘルプを見て初めて知ったのですが、 ヘルプの記述「手続きまたは関数の内部で宣言された変数はローカル変数,その他の変数はグローバル変数と呼ばれることがあります。」 ということは、implementation以下にvar 変数:型;としても、グローバル変数ということですよね。 もし、ヘルプの記述通りの「グローバル変数」でしたら、面倒ですよ。動的にメモリを確保し、そのメモリを「グローバル変数を使用しないで」参照できなければなりませんから。 ひとまず、一般的(かどうかはわかりませんが)に、「他のユニットから参照できない変数」=「グローバル変数」ということで書きます。 まず1つめ。Formをグローバル変数を使わずに表示する方法。 //AntiGrobal.dpr(プロジェクトのソース) program AntiGlobal; uses Forms, uMain in 'uMain.pas' {Form1}; {$R *.res} begin ApplicationRun; end. //uMain.pas(Form1のソース) unit uMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private { Private 宣言 } public { Public 宣言 } end; procedure ApplicationRun; implementation {$R *.dfm} var Form1: TForm1; procedure ApplicationRun; begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end; end. プロジェクト内で行っていた部分をプロシージャにし、uMainのグローバル関数にしてしまう。そのうえで、Form1というグローバル変数を、ユニット変数に変更。 以上でグローバル変数を使わずにFormを表示できますね。 2つめとして、グローバル変数を使わずに他に値を渡す方法。 クラスにプロパティを持たせるのと同じ要領で、ユニットの中に変数を隠蔽すればよいかと思います。 unit uSub; interface function GetValue: String; procedure SetValue(Value: String); implementation var strValue: String = ''; function GetValue: String; begin Result := strValue; end; procedure SetValue(Value: String); begin strValue := Value; end; end.
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.