逆引き Apollo

Widget 全般

幅や高さを設定する

A.フォームのなかでラベルの大きさを指定する。

require "phi" ; include Phi
form  = Phi::Form.new        :form, "大きさを指定する(1)"
label = Phi::Label.new form, :label, "Hello!"
label.height = 50
label.width  = 70
label.color  = Phi::CL_RED
form.show
Phi.mainloop

# by take_tk

B.ラベルをフォームのクライアント領域全体と指定して、フォームの大きさを指定する。

require "phi" ; include Phi
form  = Phi::Form.new        :form,  "大きさを指定する(2)"
label = Phi::Label.new form, :label, "Hello!"
label.align = Phi::AL_CLIENT
label.color = Phi::CL_RED
form.height = 200
form.width  = 300
form.show
Phi.mainloop

# by take_tk

幅や高さを取得する

require "phi" ; include Phi
form  = Phi::Form.new        :form, "大きさを取得する。フォームの大きさを変えてください。"
label = Phi::Label.new form, :label, "Hello!"
label.align = Phi::AL_CLIENT
form.on_resize = proc{
  label.caption = "height = %d, width = %d" % [form.height, form.width]
}
form.show
Phi.mainloop

# by take_tk

Widget の見ためを変える

Widget 間の間隔(余白)を設定する

require "phi" ; include Phi
require"rgui"

form = RGUI::Form.new :form, "Widget 間の間隔(余白)を設定する"

form.add (
  hbox1 = RGUI::Hbox.new(true,10).add(*[
    vbox1 = RGUI::Vbox.new(true,10).add(*[
      button1  = Button.new( form , :button1, "横に広げる"),
      button2  = Button.new( form , :button2, "横に狭める")
    ]),
    vbox2 = RGUI::Vbox.new(true,10).add(*[ 
      button3  = Button.new( form , :button3, "縦に広げる"),
      button4  = Button.new( form , :button4, "縦に狭める")
    ]),
  ])
)

button1.on_click = proc{ hbox1.space += 1 ; form.layout }
button2.on_click = proc{ hbox1.space -= 1 ; form.layout }
button3.on_click = proc{ vbox2.space = vbox1.space += 1 ; form.layout }
button4.on_click = proc{ vbox2.space = vbox1.space -= 1 ; form.layout }
form.on_resize = proc{ form.layout }

form.show
mainloop

前景、背景色を変える

アクティブ時(マウスが上に来たとき)の前景、背景色を変える

フォントを変える

require 'phi'
include  Phi 

form = Form.new
form.font.name = 'MS ゴシック'
i = Button.new form, :btn, 'hello'
i.align = Phi::AL_CLIENT
def i.on_click
  self.caption = Time.now.to_s
  print "clicked\n"
end

form.show
Phi.mainloop

フォント(文字)の色を変える

font.color = CL_RED

フォントの大きさを変える

font.size = 20

フォントの一覧を取得する

p SCREEN.fonts

#<Phi::Strings: "$JSゴシック", "$JS明朝", "&CenturyOldst", "&Gothic720", "@$JSゴシック", "@$JS明朝", "@FixedSys", "@GulimChe", "@HGPゴシックE", "@HGP創英角ゴシックUB", "@HGP創英角ポップ体", "@HGSゴシックE", "@HGS創英角ゴシックUB", "@HGS創英角ポップ体", "@HGゴシックE", "@HG丸ゴシックM-PRO", "@HG正楷書体-PRO", "@HG創英角ゴシックUB", "@HG創英角ポップ体", "@JSPゴシック", "@JSP明朝", "@JSゴシック", "@JS平成明朝体W3", "@JS明朝", "@Mojikyo M101", "@Mojikyo M102", "@Mojikyo M103", "@Mojikyo M104", "@Mojikyo M105", "@Mojikyo M106", "@Mojikyo M107", "@Mojikyo M108", "@Mojikyo M109", "@Mojikyo M110", "@Mojikyo M111", "@Mojikyo M112", "@Mojikyo M113", "@Mojikyo M114", "@Mojikyo M115", "@Mojikyo M116", "@Mojikyo M117", "@Mojikyo M118", "@Mojikyo M119", "@Mojikyo M120", "@Mojikyo M121", "@Mojikyo M181", "@Mojikyo M182", "@Mojikyo M183", "@MS Pゴシック", "@MS P明朝", "@MS UI Gothic", "@MS ゴシック", "@MS 明朝", "@Small Fonts", "@System", "@Terminal", "Arial", "Arial Black", "Arial Narrow", "Book Antiqua", "Bookman Old Style", "Century", "Century Gothic", "CenturyOldst", "Comic Sans MS", "Courier", "Courier New", "Default", "FixedSys", "FixedSys", "Garamond", "Gothic720", "GulimChe", "Haettenschweiler", "HGPゴシックE", "HGP創英角ゴシックUB", "HGP創英角ポップ体", "HGSゴシックE", "HGS創英角ゴシックUB", "HGS創英角ポップ体", "HGゴシックE", "HG丸ゴシックM-PRO", "HG正楷書体-PRO", "HG創英角ゴシックUB", "HG創英角ポップ体", "Impact", "JSPゴシック", "JSP明朝", "JSゴシック", "JS平成明朝体W3", "JS明朝", "JustHalfMark", "JustHalfMarkG", "JustKanaMark", "JustKanaMarkG", "JustOubunMark", "JustOubunMarkG", "JustWabunMark", "JustWabunMarkG", "Map Symbols", "Marlett", "Modern", "Mojikyo M101", "Mojikyo M102", "Mojikyo M103", "Mojikyo M104", "Mojikyo M105", "Mojikyo M106", "Mojikyo M107", "Mojikyo M108", "Mojikyo M109", "Mojikyo M110", "Mojikyo M111", "Mojikyo M112", "Mojikyo M113", "Mojikyo M114", "Mojikyo M115", "Mojikyo M116", "Mojikyo M117", "Mojikyo M118", "Mojikyo M119", "Mojikyo M120", "Mojikyo M121", "Mojikyo M181", "Mojikyo M182", "Mojikyo M183", "Monotype Corsiva", "MS Outlook", "MS Pゴシック", "MS P明朝", "MS Sans Serif", "MS Serif", "MS UI Gothic", "MS ゴシック", "MS 明朝", "OCRB", "Small Fonts", "sshlinedraw", "Symbol", "Symbol", "System", "System", "Tahoma", "Tera Special", "Terminal", "Terminal", "Times New Roman", "Trebuchet MS", "Verdana", "Webdings", "Wingdings", "Wingdings 2", "Wingdings 3">

フォーカスを移動する

イメージつきにする

マウスカーソルの形状を変更する

独自カーソルを使用する

Widget の種類を取得する

配置

Widget 間の間隔(余白)を設定する

親 Widget を指定する

Widget を非表示にする

上から下に順にpackする

下から上に順にpackする

左から右に順にpackする

絶対座標で配置する

格子状の配置をする

イベント

マウスの第一ボタンをクリックしたときの動作を設定する

マウスをダブルクリックしたときの動作を設定する

マウスの第二ボタンをクリックしたときの動作を設定する

マウスを移動したときの動作を設定する

マウスの座標を取得する

Enter キーを押したときの動作を設定する

どのキーが押されたかを取得する

特殊キー(Shift, Crtl, ALT)などが押されたかどうか知る

Widget にフォーカスが移って来たときの動作を設定する

C-x C-c で終了する

Label Widget

表示後にテキストを変更する

表示したテキストを取得する

文字の位置揃えをする

複数行表示する

折り返し幅を指定する

下線を引く

Message Widget

折り返し幅を指定する

Button Widget

Enter で選択できるようにする

ショートカットできるようにする

ボタンを使用不可にする

イメージつきボタンを使用する

CheckButton Widget

ボタンの選択、非選択を切り換える

チェックされているかどうか調べる

チェック領域を表示しないようにする

ビットマップを使用する

ボタンを選択(非選択)したときの動作を設定する

RadioButton Widget

どのボタンが選択されているかどうかを調べる

ボタンの選択、非選択を切り換える

チェック領域を表示しないようにする

ビットマップを使用する

ボタンを選択(非選択)したときの動作を設定する

Entry Widget

入力内容を取得する

あらかじめ文字列を入力しておく

入力内容をクリアする

複数行の入力を行う

パスワードの入力を行う

数値のみ入力できるようにする

入力最大文字数を設定する

Read Only にする

選択部分を取得する

特定の領域を選択状態にする

フォーカスされたら全体を選択状態にする

日本語入力を開始する

フォーカスが移ってきたときに日本語入力を自動的にONする

カーソル位置を取得する

Enter で入力を完了できるようにする

Enter で次の入力欄に移動できるようにする

Text Widget

スクロールバーを付ける

テキストの全内容を取得する

Read Only にする

選択部分を取得する

クリップボードを使う

カーソル位置を取得する

画像を表示する

文字の属性を変更する

文字に下線を引く

文字の上に横線を引く

ListBox Widget

項目を追加する

項目を削除する

全項目を削除する

項目数を取得する

選択された項目を取得する

選択された項目数を取得する

複数選択できるリストボックスを作る

リストボックスを使用不可にする

スクロールバーを付ける

先頭に表示される項目を設定する

Scale Widget

スケールの範囲を設定する

水平のスケールを使用する

現在の値を取得する

値を変更する

現在の値を表示するかどうかを変える

スケールの移動単位を設定する

Canvas Widget

線を描画する

多角形を描画する

四角を描画する

円を描画する

扇形を描画する

テキストを描画する

図形の中身を塗りつぶす

スクロールバーを付ける

表示範囲を設定する

PostScript を出力する

GIF を出力する

図形の色を変更する

図形を移動する

図形を消去する

図形の上下関係を設定する

図形をドラッグして移動する

図形を一定時間ごとに移動する

メニュー

チェックボタンメニューを作る

ラジオボタンメニューを作る

カスケードメニューを作る

セパレータを使う

イメージを使用する

切り離されないメニューを作る

ポップアップメニューを作る

オプションメニューを作る

ショートカットキーを設定する

メニューの項目を使用不可にする

ヘルプメニューのみ右端に付けるようにする

ダイアログ

ダイアログボックスを表示する

require 'dialog'
:

メッセージボックスを表示する

Phi.message_dlg( Usage , Phi::MT_CONFIRMATION, [Phi::MB_OK])

独自のダイアログを作成する

Phi::Form から継承して作りましょう。 そして form.show_modal します。

ファイル選択のダイアログを表示する

dlg = Phi::OpenDialog.new
if dlg.execute
  :
end

ディレクトリ選択のダイアログを表示する

require 'phi'
include Phi

prompt = 'Select a directory'
root = 'C:/apollo/src'
result_path=''

if Phi.select_dir prompt, root, result_path
  print "You selected [%s]\n" % result_path
else
  print "You canceled to select directory.\n"
end

カラー選択のダイアログを表示する

dlg = Phi::ColorDialog.new
if dlg.execute
  :
end

イメージ

イメージを表示する

form = Form.new
Image.new form, :image
form.image.picture.load file_name

PNG, JPEG, TIFF などを使用する

JPEG は require 'jpeg' で扱えます。

XBM, PPM, PGM をスクリプトに埋め込む

?

GIF をスクリプトに埋め込む

?

その他

プログラムを終了する

ウィンドウを閉じるっていう意味?

exit

とか?

ウィンドウマネージャーのクローズボタンを押したときにすぐに終了しないようにする

すぐには終了しません。 全てのウィンドウを閉じると Phi.mainloop を抜けます。

タイトルを設定する

form.caption = 'タイトル'

あるいは Form 生成時に

form = Form.new :form1, 'タイトル'

アイコンを設定する

Phi::APPLICATION.icon = Phi::Icon.new.load('foo.ico')

A.フォームのアイコンを設定する

#!ruby -Ks
require "phi" ; include Phi
form = Form.new :form, "フォームのアイコンを設定する"
button = Button.new form, :button, "フォームのアイコンを設定します"
button.on_click = proc{
  form.icon = Icon.new.load 'c:/apollo/sample/arima.ico'
  button.caption = "フォームのアイコンを変更しました"
}
button.align = AL_CLIENT
form.show
mainloop

B.アプリケーションのアイコンを設定する

#!ruby -Ks
require "phi" ; include Phi
form = Form.new :form, "アプリケーションのアイコンを設定する"
button = Button.new form, :button, "アプリケーションのアイコンを設定します"
button.on_click = proc{
  APPLICATION.icon = Icon.new.load 'c:/apollo/sample/arima.ico'
  button.caption = "アプリケーションのアイコンを変更しました"
}
button.align = AL_CLIENT
form.show
mainloop

アイコン化されたときに表示される文字列を設定する

form.caption = 'hello'

# by moriq

新しいウィンドウを生成する

form = Phi::Form.new
form.show

# by moriq

ウィンドウを消去する

form.close

# by moriq

ウィンドウを非表示にする

form.hide

# by moriq

画面中央にウィンドウを表示する

form.position = Phi::PO_SCREEN_CENTER

# by moriq

ウィンドウを移動する

form.top = top
form.left = left

form.rect = Rect.new(left, top, right, bottom)

form.set_bounds(left, top, width, height)

# by moriq

画面の大きさを取得する

p Phi::SCREEN.width
p Phi::SCREEN.height

# by moriq

ウィンドウの大きさを固定する

form.border_style = Phi::BS_DIALOG # or BS_SINGLE, BS_NONE

# by moriq

モーダルウィンドウを作成する

form.show_modal

# by moriq

ベルを鳴らす

Sys.beep

# by moriq
# SysUtils Unit 関係は Sys module を使うつもりだったんだけど、ややこしいから Phi にまとめようか?

Windows で動くようにする

動く

# by moriq

漢字コードを設定する

基本的に Delphi は SJIS のみ

# by moriq

ウィンドウがアクティブのとき特定の Widget にフォーカスを移動する

edit.set_focus
form.focus_control = edit

# by moriq

使っている Phi のバージョンを調べる

p Phi::VERSION

# by moriq

使っている Phi に日本語パッチが当たっているかどうか調べる

?

# by moriq

使っている Phi のライブラリディレクトリを調べる

p $:

# by moriq

環境を調べる

?

# by moriq

ドラッグアンドドロップする

#! ruby

# cf:
# Delphi4 プログラミングバイブル p.215
# 5.1.5. コンポーネント間のドラッグ

require 'phi'
include Phi

form = Form.new
form.caption = $0

i = Edit.new form, :edit
i.align = Phi::AL_TOP
i.text = 'hello'

def i.on_mouse_down(btn, shift, x, y)
  begin_drag false, 10
end

i = ListBox.new form, :lbox
i.align = Phi::AL_CLIENT

def i.on_drag_over(accept, src, x, y, state)
  src != parent.edit || items.index_of(parent.edit.text) < 0
end

def i.on_drag_drop(src, x, y)
  case src
  when parent.edit
    items.add src.text
  end
end

form.show

Phi.mainloop

# sample/drag_drop.rb
# by moriq