環境
- Delphi 10.2 Update 3
困ったこと
Delphiで新規Formを作成した場合、下記のようなソースが生成される。
unit MainForms; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs; type TMainForm = class(TForm) private { private 宣言 } public { public 宣言 } end; var MainForm: TMainForm; implementation {$R *.fmx} end.
コードのMainForm: TMainForm;
の部分はメインFormのインスタンスとして使用される変数だけど、interfaceセクションにあるのでグローバル変数扱いになる。
つまり、Formのunitをusesに追加しただけで、Formの変数が参照できてしまう。
プロジェクトにTSubFormという名前の新規Formを追加すれば、interfaceセクションにSubFormという名前で宣言され、クラスの変数やプロパティでもないのに、
procedure TMainForm.Button1Click(Sender: TObject); begin SubForm.ShowModal; end;
と書けてしまう。
対処
- Formファイル作成後、interfaceセクションに書いてあるForm変数は削除する。
- 自動生成が不要な画面は、メニューの「プロジェクト」「フォーム」で対象外にする。
- メインFormや、自動生成が必要となるForm変数はdprに宣言する。
なので、interfaceセクションに書いてあるForm変数は
//var
// HogeForm: THogeForm;
と、削除しておき、呼び出す必要があるときにインスタンスを生成してForm表示する。
メインFormであれば、
//var
// MainForm: TMainForm;
と、interfaceセクションの宣言は削除しておいて、
program Sample; uses System.StartUpCopy, FMX.Forms, MainForms in 'MainForms.pas' {MainForm}; {$R *.res} var MainForm: TMainForm; // メインFormの宣言を移動 begin Application.Initialize; Application.CreateForm(TMainForm, MainForm); Application.Run; end.
と、dprファイルに宣言を移動する。
Form変数をFormファイルのinterfaceセクションからdprファイルに移動しているので、usesにFormファイルを宣言しただけで変数が参照できてしまう問題は解消出来る。