nakamurakko’s blog

仕事で覚えたこと、勉強したことを自分のメモ代わりに書いていこうかなと。

Delphiで初期宣言されたForm変数の削除を検討する

環境

  • 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ファイルを宣言しただけで変数が参照できてしまう問題は解消出来る。