11-5 フォームをクラスに

ここまでに、フォーム上の全てのコンポーネントが、同等の機能をもつ変数や関数・手続きになりました。すでにフォーム上には何も残っていません。

と言うことは…

type
  TFormInvader = class(TForm)
  private
    { Private 宣言 }
    X: Integer;
    Y: Integer;
    Speed: Integer;
    Alive: Boolean;
  protected
    procedure Draw; virtual;
    procedure Erase; virtual;
    procedure SetSpeed(S: Integer); virtual;
    function GetSpeed: Integer; virtual;
    function GetX: Integer; virtual;
    function GetY: Integer; virtual;
    procedure GoHorizontal; virtual;
    procedure GoDown; virtual;
    procedure HitCheck; virtual;
  public
    { Public 宣言 }
    procedure Move; virtual;
    procedure Construct; virtual;
    procedure Destruct; virtual;
  end;

という機能さえ実現できていれば、フォームがなくても良いことになります。実はフォームも、(それと同等の機能をもつ)「クラス」というものにすることができます (フォームはクラスの一種だったのです)。

【練習問題】

プログラムを書き換えましょう。まずは、フォームではなくするため「class」の後の「(TForm)」を「(TObject)」にしてください。(「(TObject)」という記述を完全に削除してしまっても構いませんが、ここでは「(TObject)」という記述を残すことにします。)

type
  TFormInvader = class(TObject)
  private
    { Private 宣言 }
    X: Integer;
    Y: Integer;
    Speed: Integer;
    Alive: Boolean;
  protected
    procedure Draw; virtual;
    procedure Erase; virtual;
    procedure SetSpeed(S: Integer); virtual;
    function GetSpeed: Integer; virtual;
    function GetX: Integer; virtual;
    function GetY: Integer; virtual;
    procedure GoHorizontal; virtual;
    procedure GoDown; virtual;
    procedure HitCheck; virtual;
  public
    { Public 宣言 }
    procedure Move; virtual;
    procedure Construct; virtual;
    procedure Destruct; virtual;
  end;

もう1ヶ所、プロジェクトファイルを修正する必要があります。まずは「表示」→「プロジェクトマネージャ」を選び、「invader_game.exe」(これがプロジェクトです) の上で右クリックし、「ソース表示」を選びます。

すると、9-5 で見たようなプロジェクトファイル (プロジェクトを管理するファイル) が表示されます。その中の FormInvader1FormInvader4 及び FormInvaderBoss に関する部分を次のように変更します。

begin
  Application.Initialize;
  Application.CreateForm(TFormControl, FormControl);
  Application.CreateForm(TFormDisplay, FormDisplay);
  FormInvader1 := TFormInvader.Create;
  FormInvader2 := TFormInvader.Create;
  FormInvader3 := TFormInvader.Create;
  FormInvader4 := TFormInvader.Create;
  Application.CreateForm(TFormBullet, FormBullet);
  FormInvaderBoss := TFormInvaderBoss.Create;
  Application.Run;
end.

これで、invader ユニットはフォームのないユニットになりました。同時に、これを継承している invader_boss ユニットもフォームのないユニットになりました。実行して、インベーダーフォームが作られないこと、そしてそれにもかかわらずプログラムがこれまで同様にきちんと動作することを確認しましょう。

【基礎課題 11-6】

弾フォーム (bullet フォーム) を単なるクラスにしてください。(変数アクセス用の関数・手続きを新たに作る必要があります。)

ここまでのプログラムをダウンロード(D)