コマンドライン引数によって起動時のフォームを切替える

 Delphiではプロジェクトオプションで最初に表示するフォームや、フォームを自動生成するかどうかを変更出来ます。なんとなく最初に表示させるフォームがメインプログラムのような感じを受けますが、実際にはすべてのフォームは同じ条件のもとに動作します。
 通常はコマンドライン引数の処理を、最初に生成されるフォームのOnCreateイベントで処理しますが、このコマンドライン引数で表示するフォームを切替える場合にはやっかいな事になります。
 例えば、コマンドラインのスイッチによっていは、最初に生成されるフォームではなく別のフォームを表示させたい場合です。OnCreateの処理内では、自分自身のフォームの表示状態を変更することが出来ないため、結構姑息な手段を取ったりしなければなりません。
 Delphiのプロジェクトファイルは、それ自体がDelphiのプログラムになっており、ここで自動生成に指定されている各フォームの生成と起動を行なっています。
 このプロジェクトソース内で、コマンドライン引数をチェックして、その内容に応じて必要なフォームだけを生成して実行させるようにすれば、とても簡単に起動フォームの切替えを実現出来ます。また、コマンドライン引数が設定されていない場合にはフォームを一切生成せずにプログラムを終了するといったことも可能です。

program MiScProp;

uses
  Forms,
  PropUnit in 'PropUnit.pas' {PropForm},
  Unit1 in 'Unit1.pas' {Schedule},
  Unit2 in 'Unit2.pas' {Option},
  Unit3 in 'Unit3.pas' {LogView};

{$R *.RES}

begin
  Application.Initialize;
  // ParamCoutはコマンドライン引数の数を保持している
  if ParamCount = 0 then
    Exit;
  // ParamStrはコマンドラインの文字列を保持している
  // ParamStr(0)は起動されたアプリケーションのフルパス名で
  // (1)以降が引数となっている
  if ParamStr(1) = '/P' then
  begin
    // 一行しかありませんが、CreateForm()の最後に';'がないと、プロジェクト
    // ソースにエラーがあると判断されますので、必ずbegin/endで区切って';'を
    // つけること
    Application.CreateForm(TPropForm, PropForm);
  end else if ParamStr(1) = '/L' then
  begin
    Application.CreateForm(TLogView, LogView);
  end else
    Exit;
  Application.Run;
end.

 上記のプロジェクトソース例では、オプションスイッチがない場合にはそのまま終了。二種類のオプションスイッチに対してそれぞれ別のフォームを自動生成して起動するようになっています。
 たったこれだけのことで、起動フォームの切替えが出来てしまいます。
 但し、こういった「手動でプロジェクトソースを書き換える」ことを行なうと、プロジェクトオプション「フォーム」の自動生成生成の対象におかしな表示がされます。また、ここでフォームの生成を切替えてしまうと、せっかく修正したプロジェクトソースが変になってしまいますので注意して下さい。

戻る