Create  Edit  Diff  Phillro Industries  Index  Search  Changes  History  Source  RSS  Note  wikifarm  Login

tut-tut_custom_dlg

Author: NISHIO Mizuho

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

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

その1

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

$(Apollo)/sample/tutorial/custom_dlg.rb

   1|require 'phi'
   2|
   3|class MyDialog < Phi::Form
   4|
   5|  def initialize(com_name, capt)
   6|    super(com_name, capt)
   7|    self.border_style = Phi::BS_DIALOG
   8|    self.width = 300
   9|    self.height = 100
  10|    self.position = Phi::PO_MAIN_FORM_CENTER
  11|
  12|    margin = 10
  13|    
  14|    ok = Phi::Button.new(self, :ok1, 'OK')
  15|    cancel = Phi::Button.new(self, :cancel1, 'キャンセル')
  16|    edit = Phi::Edit.new(self, :edit1, '')
  17|
  18|    ok.modal_result = Phi::MR_OK
  19|    cancel.modal_result = Phi::MR_CANCEL
  20|
  21|    edit.top = margin
  22|    edit.left = margin
  23|    edit.width = self.width - margin * 2 - 5
  24|
  25|    ok.top = edit.top + edit.height + margin
  26|    cancel.top = ok.top
  27|
  28|    cancel.left = self.width - cancel.width - margin - 5
  29|    ok.left = cancel.left - ok.width - margin
  30|
  31|    self.on_show = proc do
  32|      edit.set_focus
  33|    end
  34|  end
  35|  
  36|end
  37|
  38|form = Phi::Form.new(:form1, 'formです')
  39|button = Phi::Button.new(form, :button1, 'hoge')
  40|form.height = 95
  41|label = Phi::Label.new(form, :label1, '')
  42|button.align = Phi::AL_TOP
  43|label.align = Phi::AL_CLIENT
  44|label.color = Phi::CL_WHITE
  45|
  46|button.on_click = proc do
  47|  dlg = MyDialog.new(:dlg1, '何か入力してください。')
  48|  result = dlg.show_modal
  49|  case result
  50|  when Phi::MR_OK
  51|    if dlg.edit1.text != ''
  52|      label.caption = dlg.edit1.text
  53|    end
  54|  when Phi::MR_CANCEL
  55|    label.caption = 'キャンセルが押されました。'
  56|  end
  57|end
  58|form.show
  59|Phi.mainloop

このスクリプトを実行すると、このような ウィンドウがあらわれます。

解説

上のスクリプトを実行して、ボタンを押すと自作ダイアログが現れます。ダイアログのエディットの部分に文字を入力して「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行が実行され、ラベルの文字が「キャンセルが押されました。」になります。

クラスやダイアログ

Phi::Form

Phi::Button

Phi::Edit

Last modified:2004/11/26 05:30:35
Keyword(s):
References:[tut-tut_index]