2012年12月12日水曜日

コンソールアプリケーション1(Delphi Advent Calendar 2012-12-12)

Delphi Advent Calendar 2012 12/12 の記事です。

ちょっとした値の出力や関数・メソッドのテストに便利な、コンソールアプリケーションについて、述べてみます。

コンソールアプリケーションは、その名の通り、コンソール(コマンドプロンプト)で動作するアプリケーションです。
コンソールアプリケーションは、標準入力から値を受け取り、標準出力へ値を出力します。

標準入力 キーボードなど
標準出力 ディスプレイなど

標準エラー出力という物もあります。
これは、エラーが発生したときにエラー情報を出力する場所です。
基本的には標準出力と同じ「ディスプレイ」となっていることが多いようです。
しかし、これを変更することも可能です。
例えば、標準出力の出力先は「ディスプレイ」、標準エラー出力の出力先は「外部接続」とすることもできます。

なにはともあれ、実際に作ってみます。

「ファイル」→「新規作成」→「その他...」を選んで新規作成ダイアログを開いたところです。



ここで「コンソールアプリケーション」を選びます。
すると、次のようなコードが開きます。

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

begin
  try
    { TODO -oUser -cConsole メイン : ここにコードを記述してください }
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

例外処理とかが入っているステキなスケルトンができますが、今回の記事には邪魔なのですっきりさせます。
すっきりさせたのが下記です。

program Project1;

{$APPTYPE CONSOLE}

begin
end.

{$APPTYPE CONSOLE} は、コンパイラ指令です。
コンパイラに、このアプリケーションはコンソールアプリケーションであることを指示しています。

これを動かすと、一瞬コマンドプロンプトが開いてすぐに閉じます。
何もしないプログラムなので、当然の動作です。
せっかくなので、なにか表示してみます。

program Project1;

{$APPTYPE CONSOLE}

begin
  Write('Hello, console !');
end.

ここで出てきた Write は、標準出力に値を出力します。

より正確にいうならば、Write は、ファイルに値を出力する関数です。
ファイル変数を省略すると、標準出力に値を出力する、という動作になります。

引数に指定できるのは、文字列などの「値」です。
なので、ここには、Integer や Boolean も書くことができます。

たとえば、こんな風に書けます。
Write('Hello, console !', 123, True);

とりあえず実行させてみましょう。
しかし、やはり一瞬でコマンドプロンプトは閉じてしまい、表示されているか確認できません。

ちなみに、先にコンソールを開いてから、Project1 と入力して起動させれば、当然閉じたりはしません。
ですが、IDE から起動させる方が楽ちんです。
なので、開いたコンソールが勝手に閉じないようにする方法が必要です。
方法はいくつかありますが、今回は Readln を使います。

program Project1;

{$APPTYPE CONSOLE}

begin
  Write('Hello, console !');
  Readln;
end.

すると、下記の様に自動的にコンソールが閉じなくなりました。



コンソールを閉じるためには、「リターンキー/エンターキー」を押します。

さて、ここで出てきた Readln ですが、これは標準入力から値を受け取ります。

より正確にいうならば、Read は、ファイルから値読み出す関数です。
ファイル変数を省略すると、標準入力から値を読み込みます。

Read ではなく Readln なのは、何故でしょう?
実は、Read という関数もあり、こちらも標準入力から値を受け取るものです。

では、Read と Readln は、なにが違うのでしょう?
違いは Read は標準入力から値を読み出すだけですが、Readln は標準入力から「行」を読み出す、ということです。
Readln の "ln" は "Line" のことです。

では、行とは何のことでしょうか?
それは「改行」がある、ということです。
つまり、Readln は改行を受け取るまで、待機します。
そのため、Readln があるとコマンドプロンプトは自動的に閉じなくなり、「リターンキー/エンターキー」を押すと閉じたのです。

では Read では、ダメなのでしょうか?
残念ながら、Read では、ダメなのです。
それは、何も入力が無かったよ、という結果で復帰してしまうためです。
結局すぐに、コンソールは閉じてしまいます。

ところで、入力には Read と Readln がありましたが、出力には無いのでしょうか?
……当然、Write と Writeln があります。
Write は値を出力しますが、Writeln は行を出力します。
つまり、値の最後に「改行」を出力します。

たとえば、こんなコードを書くと

program Project1;

{$APPTYPE CONSOLE}

begin
  Write('Hello ');
  Write('world !');
  Writeln('');
  Writeln('Hello world 2!');
  Writeln('Hello world 3!');
  Readln;
end.

結果は、こうなります



最初の Write の "Hello " と "world !" は繋がって表示されていますが、Writeln で表示した物は自動的に改行されています。
ちなみに Writeln('') とすると、改行だけが出力されます。

今回は Write/Writel について詳述しました。
次回は、Read/Readln について紹介してみたいと思います。

0 件のコメント:

コメントを投稿