title: Apollo チュートリアル
Author: NISHIO Mizuho
mailto: mzh@portnet.ne.jp

1. フォーム(Phi::Form)
  フォームはいろいろなボタンやバーやラベルをのせるためのコントロールのことです。Apollo の Phi::Form は Delphi の TForm クラスを Ruby で使えるように包み込んだものです。このクラスを使用することで Delphi の高機能で使いやすいフォームがそのまま Apollo でも使うことができるようになります。

1.1. その1(フォームを作る)
  最初にこれから説明するスクリプトを紹介します。(%s:分かりやすくするために行番号を付けています%)

  %href: ./rb/form1.rb form1.rb% 
--ruby
001  require 'phi'
002
003  form = Phi::Form.new
004  form.show
005  Phi.mainloop
--

  このスクリプトを実行すると、%href: img/form1.png このような% ウィンドウがあらわれます。

1.1.1. 解説
  1行目はApolloでGUIのスクリプトを書くときのおまじないです。こういうものだと思ってください(私自身require 'phi'を深く追ったことはありません)。"phi"というのはDelphi用のコンポネーントをRubyから使うための拡張ライブラリの名前です。require はDelphiのusesに近いものだと言えば分かりやすいでしょうか。
  
  3行目の Phi::Form.new で Phi::Form のオブジェクトを生成し、それをformに代入しています。これによってフォームが作られますが、これだけではフォームが作られただけで何も表示されません。そこで、フォームを表示するために4行目で form.show( Phi::Form#show ) を行います。

  最後の行はループに入って、ウィンドウを表示させ続けるためのおまじないです。これもrequire 'phi'と同じくこういうものだと思ってください。

1.1.1.1. クラスやメソッド

: Rubyの組み込みメソッド
* require 

: Phi#
* Phi.mainloop

: Phi::Form#
* Phi::Form.new
* Phi::Form#show ( < Phi::Control#show )

1.1.1.2. Rubyの文法
  あまり深く触れませんが、Rubyスクリプトを書く時に注意することを述べておきます。詳しくはRubyのマニュアルを参照してください。

  : コメント
    行の先頭に %c:#% が付いていると、その行はコメントになります。同様に 先頭が =begin になっている行から先頭が =end になっている行まではすべてコメントとして扱われます。

    例

--ruby
# hoge これはコメント

print 'ここはコメントじゃない' 

=begin
コメントです。

ここもコメントです。
=end

print 'ここはコメントじゃない' 
--
 
  : 大文字と小文字の区別
    その1のスクリプトではformとFormが出てきますが、Rubyでは大文字と小文字の区別があるので、この二つは別のものを指します。それぞれについて細かく言うと、定数（クラス名も含む）は大文字で、ローカル変数やメソッド名は小文字で 始めることになっていますので、その1のスクリプトでは Form はクラス名を、form はローカル変数を指します。

  : リテラルの表し方
    数字の1や文字列"hello world"のようにRubyのプログラムの中に直接記述できる値の事をリテラルと言います。このチュートリアルで頻繁に使われるリテラルとしては数字と文字列があります。
    
    数字の表し方には幾つか種類がありますが、整数であれば 123 のように、小数であれば 1.234 のように記述します。

    例

--ruby
123
1.2355
--

    文字列の表現の仕方にもいくつかあります。一番単純なのは '文字列' のように '(シングルクォート) で文字列をくくることです。この場合は シングルクォート の中の文字列がそのまま使われることになります。
    
    例

--ruby
print 'hoge'     # これは 「hoge」 と出力される
--

     別の表現の仕方の一つとして "(ダブルクォート) で文字列をくくる方法があります。シングルクォートでくくる時と違い、この場合はダブルクォートの中の文字列がそのまま使われるわけではありません。例えば、"hoge\n" のようにすると、最後の \n は改行を表すことになります。この他にも %c:#{}% を使って式を文字列に展開する表記があります。

     例

--ruby
print "hoge\r\n"   # これは 「hoge」 と出力された後、改行される 

s = 'foo'
print "#{s} hoge\r\n" # これは 「foo hoge」 と出力された後、改行される
--

     (%s:注: Windowsで使われるSJISという文字コードでは文末は \r\n になっていますが、UNIXで使われるEUCという文字コードでは 文末は \n になっています。文字コードはRubyスクリプトに日本語を含める場合や他で配布されているRubyスクリプトを使用する際に注意してください。%)

  : モジュール
     上のスクリプトの Phi::Form の Phi というのはRubyのモジュールというものです。モジュールというのは大雑把に言って、様々な定数・メソッド・クラスが定義されているものです。Phiモジュールに定義されている定数･メソッド･クラスを使いた場合は「Phi::」や「Phi.」という表記をします。ですから、上のスクリプトでは Phi::Form によって Phiモジュールに定義されている Phi::Form というクラスを、Phi.mainloop によって Phiモジュールに定義された Phi.mainloop というメソッドを使っているわけです。「::」と「.」の違いはきちんと説明すべきなのかもしれませんが、ここでは説明しません。その代わりこのチュートリアルでは「::」と「.」の違いが分からなくても良いように説明していくつもりです。 

     (%s:注: 上の説明はモジュールの説明の一部分でしかありません。%)

1.2. その2(タイトル)
  次の例です。%href: ./rb/form2.rb form2.rb%

--ruby
001  require 'phi'
002
003  form = Phi::Form.new(:form1, 'formです')
004  form.show
005  Phi.mainloop
--

  このスクリプトを実行すると、%href: img/form2.png このような% ウィンドウがあらわれます。

1.2.1. 解説
  form1.rbと違うのは3行目の部分です。 Phi::Form のオブジェクトを生成する Phi::Form.new はいくつかの引数を取ることができます。上のスクリプトの場合は第1引数が :form1 で、第2引数が 'formです' になります。

  Phi::Formのnewの第1引数については少し説明が難しいです。これに関する詳細はap-listのMLの過去ログにありますが、分からなくてもスクリプトを書くことはできるので、ここでは説明を省略します。後で説明するので、その時まで待ってください。

  次に Phi::Form.new の第2引数ですが、この値によってウィンドウのタイトルが変わることはすぐ分かると思います。色々な文字列を入れて、ウィンドウのタイトルを変えてみてください。

1.3. その3(イベントに反応する)
  %href: ./rb/form3.rb form3.rb%
--ruby
001  require 'phi'
002
003  form = Phi::Form.new(:form1, 'formです')
004  form.show
005  form.on_click = proc do 
006    print "Hello World\r\n"
007  end
008  Phi.mainloop
--

  このスクリプトを実行して出てくるウィンドウはform2.rbの時と同じです。

1.3.1. 解説
  form3.rbのウィンドウの外見はform2.rbの時と同じですが、フォームをクリックすると、apollo.exeで実行している場合は操作卓に、DOSプロンプトから実行している場合はDOSプロンプトに「Hello World」の一行が表示されます。

  5〜7行が「Hello World」を表示させるためのコードです。 form.on_click( Phi::Form#on_click Rubyの属性)にProcのオブジェクト(何か実行させたい命令)を代入すると、フォームがクリックされる度にProcのオブジェクトが実行されます。今回の場合はProcのオブジェクトの内容が print "Hello World\r\n" となっているので、操作卓やDOS窓に「Hello World」が表示されます。 print というのはRubyの組み込み関数で、引数の値を文字列として出力します。

  Phi::Formにはその他にもon_で始まる属性があり、イベントに対して何かの命令を実行させるときに使います。例えば、form3.rbの5〜7行を

--ruby
005  form.on_dbl_click = proc do
006    print "Hello evreyone\r\n"
007  end
--

  と変更すれば、マウスでダブルクリックした時に「Hello everyone」が表示されるようになります。on_で始まる属性にどのようなものがあるか興味がある場合はクラスブラウザーで調べてみて下さい。

  (Procの説明をどうするか?)

1.3.1. クラスやメソッド
: Rubyの組み込みメソッド
* print

: Rubyの組み込みクラス
* Proc

: Phi::Form#
* Phi::Form#on_click ( Phi::Control#on_click )
* Phi::Form#on_dbl_click ( Phi::Control#on_dbl_click)
