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


1. 自作ダイアログ(クラス定義)

  今回は Phi::Form を継承して自作ダイアログを作ります。

1.1. その1

  ユーザーの入力を受け取るためのダイアログです。

  %href: ./rb/custom_dlg.rb custom_dlg.rb%

--ruby
001  require 'phi'
002  
003  class MyDialog < Phi::Form
004  
005    def initialize(com_name, capt)
006      super(com_name, capt)
007      self.border_style = Phi::BS_DIALOG
008      self.width = 300
009      self.height = 100
010      self.position = Phi::PO_SCREEN_CENTER
011  
012      margin = 10
013      
014      ok = Phi::Button.new(self, :ok1, 'OK')
015      cancel = Phi::Button.new(self, :cancel1, 'キャンセル')
016      edit = Phi::Edit.new(self, :edit1, '')
017  
018      ok.modal_result = Phi::MR_OK
019      cancel.modal_result = Phi::MR_CANCEL
020  
021      edit.top = margin
022      edit.left = margin
023      edit.width = self.width - margin * 2 - 5
024  
025      ok.top = edit.top + edit.height + margin
026      cancel.top = ok.top
027  
028      cancel.left = self.width - cancel.width - margin - 5
029      ok.left = cancel.left - ok.width - margin
030  
031      self.on_show = proc do
032        edit.set_focus
033      end
034    end
035    
036  end
037  
038  form = Phi::Form.new(:form1, 'formです')
039  button = Phi::Button.new(form, :button1, 'hoge')
040  form.height = 95
041  label = Phi::Label.new(form, :label1, '')
042  button.align = Phi::AL_TOP
043  label.align = Phi::AL_CLIENT
044  label.color = Phi::CL_WHITE
045  
046  button.on_click = proc do
047    dlg = MyDialog.new(:dlg1, '何か入力してください。')
048    result = dlg.show_modal
049    case result
050    when Phi::MR_OK
051      if dlg.edit1.text != ''
052        label.caption = dlg.edit1.text
053      end
054    when Phi::MR_CANCEL
055      label.caption = 'キャンセルが押されました。'
056    end
057  end
058  form.show
059  Phi.mainloop
--

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

1.1.1. 解説

  上のスクリプトを実行して、ボタンを押すと自作ダイアログが現れます。ダイアログのエディットの部分に文字を入力して「OK」ボタンを押すと、入力した文字がフォームのラベルに表示されます。

  3〜36行が自作ダイアログのクラスを定義している部分です。3行目はクラス定義を宣言しており、クラスの名前は MyDialog にしています。Rubyでクラスを定義するときは大文字から始まる名前にしなければなりません(例外はあります)。また、「< Phi::Form」はどのクラスを継承するか決定します。この部分がない場合はRubyのObjectを継承することになりますが、今回はダイアログを作るために Phi::Form を継承することにします。

  5〜34行はinitialize( MyDilaog.new の時に呼ばれるメソッド )を定義しています。5行目は initialize の引数を二つにし、第1引数はSymbolのオブジェクトを、第2引数はダイアログのタイトルの文字をとるように設定しています。ただし、Rubyでは型が存在しないので、実際にはメソッドの引数にはどんなオブジェクトでもとることができます。
 
  6行目の super は親クラスの initialize を呼び出すためのメソッドです。継承クラスでは super によって親クラスの initialize を実行します。

  7〜10行はダイアログの外見を設定しています。ここに出てくる self というのは使用する文脈によって変化しますが、この場合は MyDialog.new によって生成されるオブジェクトをさします。従って、8行目の self.width( MyDialog#width <- Phi::Form#width )ではダイアログの横幅を設定していることになります。7行目では self.border_style( MyDialog#border_style <- Phi::Form#border_style )に Phi::BS_DIALOG を代入することでダイアログらしい外見にしています。10行目では self.position( MyDialog#position <- Phi::Form#position )に Phi::PO_SCREEN_CENTER に代入して画面の中心にダイアログが現れるようにしています。

  12行目はコントロールの配置を決める時に使う値です。コントロール間の間隔を表します。

  14〜16行はダイアログのボタンやエディットを生成しています。

  18行はダイアログの「OK」ボタンが押されたときの設定です。 ダイアログが 48行の dlg.show_modal( MyDialog#show_modal <- Phi::Form#show_modal )によって現れた後、ダイアログの「OK」ボタンが押されると、ダイアログが閉じて dlg.show_modal の返り値は ok.modal_result( Phi::Button#modal_result )の値( Phi::MR_OK )になります。同様に19行では cancel.modal_result に Phi::MR_CANCEL を代入していますので、ダイアログが表示された後に「キャンセル」ボタンが押されると、ダイアログが閉じ dlg.show_modal の返り値は cancel.modal_result の値( Phi::MR_CANCEL )になります。 

  21〜29行はコントロールの大きさや位置を設定しています。

  31〜33行はダイアログが現れた時のアクションがコードされています。32行は edit.set_focus( Phi::Edit#set_focus )を実行して、ダイアログが現れた時のフォーカスがエディットになるようにしています。(ちなみに31と33行をコメントにするとこのスクリプトの動作はおかしくなります。)
  
  38〜44行は起動時に現れるフォームやボタンを作っています。

  46〜57行がフォームのボタンが押されたときのアクションです。47行で自作のクラスのMyDialogのオブジェクトを生成し、48行の dlg.show_modal でダイアログとして表示します。48行の dlg.show_modal の返り値は result に代入されますが、その値は上で説明したように「OK」ボタンが押された時に Phi::MR_OK になり、「キャンセル」ボタンが押された時に Phi::MR_CANCELになります。

  49行以降は result の値によって変わります。「OK」ボタンが押された時、 result は Phi::MR_OK なので、51〜53行が実行され、ラベルの文字がダイアログのエディットに代入された文字になります。「キャンセル」ボタンが押された時は 55行が実行され、ラベルの文字が「キャンセルが押されました。」になります。

1.1.1.1. クラスやダイアログ
: Phi::Form
* Phi::Form#border_style
* Phi::Form#show_modal

: Phi::Button
* Phi::Button#modal_result

: Phi::Edit
* Phi::Edit#set_focus ( Phi::WinControl#set_focus )

