apollo 各コンポーネント覚書

apollo基本形

require 'phi'
include Phi
f = Phi::Form.new
f.show
Phi::mainloop
フォームがすべて
閉じられたとき終了。
赤の行があれば、
青い接頭辞Phi::
省略できる。
   一覧リンク  
コンテナ  Form  Panel  ToolBar
ダイアログ  OpenDialog, SaveDialog  ColorDialog  FontDialog
メッセージボックス
書き込み、文字表示  Edit  Memo  RichEdit  CLIPBOARD  Label  StringGrid
リスト表示  ComboBox  ListBox  TreeView
ボタン  Button  BitBtn  RadioButton  UpDownボタン  ToolButton  CheckBox
メニュー
バー  ScrollBar  TrackBar
コントロール  PageControl  TabSheet
印刷  FormStringsPrint

alignパラメータ ------------ 配置設定
1=AL_TOP
2=AL_BOTTOM
3=AL_LEFT
4=AL_RIGHT
5=AL_CLIENT
anchorsパラメータ ---- サイズ変化時の親との相対位置(配列指定)----
0=AK_LEFT     コントロールの位置は親の左端に固定される
1=AK_TOP      コントロールの位置は親の上端に固定される
2=AK_RIGHT    コントロールの位置は親の右端に固定される
3=AK_BOTTOM   コントロールの位置は親の下端に固定される
        (例:edit.anchors=[AK_TOP,AK_LEFT](または、[1,0])とすれば、拡大しても左上に固定
             edit.anchors=[AK_TOP,AK_BOTTOM]とすれば、上下拡大につれてedit拡大)
イベントハンドラ(大体のオブジェクトで使える共通のもの)
グラフィック・ループを使うときは、 適当な回数 Phi::APPLICATION.process_messages をはさまないと、割り込みできないことがある。
標準的な使用法は、
object.on_click=proc{|*sender| (イベント実行ブロック。ブロック引数senderが使える)}
である。(* は、Ruby1.8以降の複数引数同時引渡しで必要)もちろんブロック引数の名前senderは変更可
object.on_click
object.on_dbl_click
object.on_key_down		#使用注意(キーリピート等無効)
object.on_key_up
 sender[1]:キーコード, sender[2] : ShiftState配列 []:なし、[0]Shift押下, [1]Alt押下, [2]Ctrl押下
object.on_key_press	Shiftstateなし
object.on_mouse_down 
object.on_mouse_up 
 sender[1](0:左、1:右)、sender[2]配列(0:shift、3:左、4:右)sender[3]:x座標、sender[4]:y座標
object.on_mouse_move 	sender[1]配列(3:左、4:右)、sender[2]:x座標、sender[3]:y座標
object.on_enter				#focusがあたったとき。ENTER入力時ではない。
object.on_exit

コンテナ等基礎部品 ------------ 

Form すべての土台「作業台」
f=Form.new
f.caption="タイトル"	#フォームf のキャプション
f.top=100   		#縦位置
f.left=100  		#横位置
f.height =300		#縦幅  
f.width = 300		#横幅
f.show		#フォームf を見えるようにする
f.show_modal        #モード付きダイアログとして表示。modal_result が0以外になれば閉じ、設定された値を返す。
f.modal_result      #デフォルト値は MR_NONE=0 である。
f.close   	#Formを閉じる(終了命令もかねる。ただ閉じたいだけなら f.hide)
f.on_close_query 	#Formを閉じるかどうか確認する手段
		#戻り値がfalseだとクローズ処理はそこで終わって戻る。
		#戻り値がtrueだとon_close が呼ばれ、閉じる処理に入る。
f.on_close 	#閉じたときのイベント。上記に依存。
f.on_show   #開いたときのイベント
f.set_focus     #他のところがactiveなとき、activeにする
f.cursor=k		#kの値はマイナスの右の値で右の形状  >>>>>>
f.border_style = BS_DIALOG      #枠スタイル指定。3と同じ。
   #他に、0=BS_NONE, 1=BS_SINGLE, 2=BS_SIZEABLE(デフォルト),4=BS_TOOL_WINDOW、5=BS_SIZE_TOOL_WIN
Panel グルーピング用に!「作業台上のプレート」
      Form型のFrameや同類のGroupBox(captionが使えるPanel)もある
panel=Panel.new form
panel.align=AL_BOTTOM
ToolBar いろいろボタン等並べるフォーム上のバー (デフォルトalign=AL_TOP)
    逆のデフォルトalign=AL_BOTTOM のStatusBar もある
tbar=ToolBar.new form
sb=StatusBar.new form
sb.simple_panel=true; sb.simple_text="caption"
ダイアログコンポーネント ----- dialogsライブラリを使う:require 'dialogs'

dlg = ダイアログコンポーネント.new のとき、
		if dlg.execute
			・・・
		end
で、入力後の処理をする。以下、各ダイアログの入力値プロパティを示す。
OpenDialog
SaveDialog
        .file_name
        .default_ext='txt'      #拡張子無指定時の拡張子
        .initial_dir            #デフォルトファイル検索フォルダ
        .filter = 'すべて|*|テキスト|*.txt'
ColorDialog
	.color
FontDialog
	.font
	.font.name
	.font.size	#heightから変換
	.font.color
	.font.style
		=["FS_BOLD","FS_ITALIC","FS_UNDERLINE"]  #この配列の要素があれば実効
	.font.charset
	.font.pitch=FP_DEFAULT
メッセージボックス ------ 特殊ダイアログ。簡単な確認・指定用
r = Phi::message_dlg 'OKですか?', 3, [2,3]
 if r==1   #OK 2=CANCEL
   (OKの時の処理)
 end
のように使う。

第3引数
    ボタン     配列内 戻り値(右の定数名はPhiのプロパティ)	
    はい            0       6       MB_YES
    いいえ          1       7       MB_NO
    OK              2       1       MB_OK
    キャンセル      3       2       MB_CANCEL
    中止            4       3       MB_ABORT
    再試行          5       4       MB_RETRY
    無視            6       5       MB_IGNORE
    すべて          7       8       MB_ALL
    すべていいえ    8       9       MB_ALL_NO
    すべてはい      9      10       MB_YES_TO_ALL 
    ヘルプ         10       2(モードつき。
    第4引数 help_ctx : Fixnum :help_file_name で示されるヘルプファイルのコンテキスト識別子 )
第2引数
    0=MT_WARNING                △内!	題名「警告」
    1=MT_ERROR                  赤×		題名「エラー」
    2=MT_CONFIRMATION           噴出し内青!	題名「情報」
    3=MT_CONFIRMATION           噴出し内青?	題名「確認」
    4=MT_CUSTOM                 絵なし	題名「ruby」(APPLICATION.title の値)
第5変数以下: x=-1, y=-1, help_fname=''

書き込み、文字表示のコンポーネント --------------

Edit 1行メモ
e =Edit.new form		#formは、(form,  :ename,'初期文字列')でも可
e.width
e.align
e.text					#表示文字列
e.sel_length
e.sel_start
e.sel_text
e.password_char=0		#そのまま。それ以外は指定文字コードで表示:*なら42
e.read_only = false
e.can_undo =FALSE
e.char_case=EC_NORMAL		#EC_LOWER_CASE, EC_UPPER_CASE 
e.border_style=BS_SINGLE
e.auto_select=FALSE
e.auto_size=TRUE
e.hide_selection=FALSE
e.max_length=20
e.modified=TRUE
Memo メモコンポーネント
m=Memo.new(form, :memoname,'初期文字列')
m.caption='キャプション'
m.align
m.scroll_bars = 3		#この場合横縦両方表示 0なし、1下、2右
m.color=0xffffb0		#BGR各1バイトで背景色。色パラメータも使える↓
m.font
	m.font.size=12
	m.font.color		#文字色。色パラメータは、CL_RED のように指定可
m.lines					#各行が配列に(改行コードなし)
                        #(本当はDelphiの文字列リストだが、上記の解釈で仕様可)
	m.lines.text		#全ての行を文字列に(改行コード含む)
    m.lines.add         #行追加
    m.lines.clear       #全行クリア
    m.lines.load        #ファイル名の引数でテキストファイルをロード
    m.lines.save        #ファイル名の引数でテキストファイルとしてセーブ
m.sel_start				#上記で、カーソルが何文字目か(改行コード含む)
m.sel_length			#選択文字列長
m.sel_text				#選択文字列
m.caret_pos				#カーソル座標(point型)
	m.caret_pos.x		#上記横数値
	m.caret_pos.y		#上記縦数値
m.word_wrap = true      #画面端で折り返す。
m.read_only = true
m.set_focus     #他のところがactiveなとき、activeにする
m.focused?      #このメモmに、カーソルがあるかどうか?
RichEdit (文字単位)書式付メモ
re =RichEdit.new form		#formは、(form, 'キャプション', :labelname)でも可
使い方は、Memo とほとんど同じなので、変更点のみ。(ただし、ap-636_bde60以降をインストール済みのこと)

追加されたmethod・property

re.sel_attributes #memo.font と類似。文字単位(選択範囲)で指定できる。 re.sel_attributes.color re.sel_attributes.size re.sel_attributes.style #配列型だが直接配列操作できない。[FS_BOLD,FS_ITALIC]=[0,1]要素があれば働く re.sel_attributes.name re.sel_attributes.charset re.print #書式付プリント re.lines.load re.lines.save #リッチテキスト形式のロード・セーブ re.on_change #文書変更に対応 re.caret_pos re.on_selection_change #状態変化時のイベントハンドラ(選択に反応)

削除or未完成のmethod・property

re.popup_menu #マウス右クリックの自動指定(Cut-Copy-Paste等)なし。 re.modified
CLIPBOARD クリップボード定数
CLIPBOARD.text			#クリップボード内文字列
Label
l=Label.new form		#formは、(form, :labelname, 'キャプション')でも可
l.align
l.caption
l.layout=TL_CENTER 	#または1、TL_TOP または0、TL_BOTTOM または2
StringGrid  表計算タイプのSpreadSheet
sg=StringGrid.new f       #フォームf上に表sgを作る
sg.col_count=       #列数
sg.row_count=       #行数
sg.align = AL_CLIENT   #表全体をフォーム上に拡げる
sg.options +=             #表設定
[GO_EDITING,GO_ALWAYS_SHOW_EDITOR,GO_TABS]  #(編集可能・常に編集モード・タブで移動可能)
sg.cells[列座標,行座標]="12"       #セル値代入
sg.on_key_down = proc{}      #keyを押せば{}内を実行
sg.col_widths[k]=	#k列の幅
sg.row_heights[k]= 	#k行の高さ
リスト表示コンポーネント --------------

ComboBox 下に伸びる選択範囲
c=ComboBox.new form
c.align=AL_RIGHT
c.items                 #Strings型(Memoのlinesと同じ)
  c.items.add('項目文字列')
c.width = 50
c.text                  #選択された中身(最初の窓)
c.hide
ListBox 一覧表(通常一列)
lb = ListBox.new form
lb.items                #Strings型(Memoのlinesと同じ)
  lb.items.add('a')
  n=lb.item_index       #現在選択されているindexの値
  lb.items[n]           #その中身
lb.selected[k]          #k個目が選択されているか(Boolean)
lb.multi_select=true    #複数選択可
lb.on_click = proc {}
lb.selected.nil?
TreeView ツリー型リスト表示
tv = TreeView.new form
tv.align
tv.items                    #tree node型配列
  tv.items[0].text          #0番目の中身
  tv.items[0].index         #0番目のindex(0であたりまえだが、tree node 型はこうなっている)
  n=tv.items.add(nil, 'root')    #最初(ルート)はnil。
  tv.items.add_child(n, 'root-1')#どこの下位(この場合n)にあるかのnode名
tv.selected.text            #選択された中身
tv.selected.index           #選択されたindex
tv.on_click = proc {}
tv.selected.nil?
ボタンコンポーネント -------------------

Button
b= Button.new form		(省略形 b = Button.new((コンテナ名), :(名前),'キャプション'))
b.align=AL_RIGHT		#右寄せ
b.cancel=TRUE				#[Esc] が押されたときに on_click を実行するかどうか 
b.default=TRUE			#[Enter] が押されたときに on_click を実行するかどうか 
b.modal_result=0			#ボタンが ( mode 付 ) 親 form を閉じるかどうか。簡易イベント
BitBtn 絵入りボタン。動作やmodal_resultが決まっていて、使いやすい
b= BitBtn.new form                  #kind=6以外はダイアログが閉じるらしいが・・・?
b.kind =0 (->指定)   (指定:glyph)
        1 (->1 )     OK             #(-> は、modal_result)
        2 (->2 )     キャンセル
        3 (->0 )     ヘルプ         #b.help_context=ヘルプファイル で指定されたものが開く
        4 (->6 )     はい
        5 (->7 )     いいえ
        6 (->×)     閉じる          #フォームが閉じる
        7 (->3 )     中止
        8 (->4 )     再試行
        9 (->5 )     無視
        10(->8 )     すべて
RadioButton  Panelでグループ化して使う(排他的選択)
b1 = RadioButton.new panel	#パネルやフォーム上で、排他的選択
b2 = RadioButton.new panel
b1.caption="横に出る文字"	#デフォルトでは右に左詰表示
b1.alignment=0		#0で、左表示だが左詰なので、下のwidthを要調整。1で右表示
b1.width = 70
b2.left=100
b1.checked = true           #チェックされているかの判断(代入も可)。これで判断して使用。
UpDownボタン  Editなどにくっつけて使う。制御はこちら。
ud= UpDown.new tb           
ud.associate=edit          #エディットコンポーネントにくっつけて制御を奪う(上下矢印右側)
ud.position=13             #くっつけられた窓の初期値
ToolButton Toolbar上で制御を受ける
tb=ToolBar.new form とするとき、
 ボタン上に文字を表示するならtb.show_captions=true と設定し、
 画像を表示するなら、tb.images= イメージリストを設定しておくこと。    使用例は
    bmp = Bitmap.new        #ビットマップの場合
    bmp.load('c:\pri.bmp')
    ico = Icon.new          #アイコンの場合
    ico.load('c:\ppm.ico')
    il = ImageList.new
    il.masked=false         #マスクの使用法が不明ですので、使わない^^;
    il.add(bmp,0)           #第2引数はマスクですが・・・
    il.add_icon(ico)        #マスクは無い
    tb.images=il            #0番目pri.bmp、1番目ppm.icoが入った。
    btn.image_index = 0     #こればpri.bmp、ppm.icoなら、1    )
tbn=ToolButton.new tbar
tbn.caption='キャプション'
tbn.style=1 #凹凸のトグル。 2:drop_down_menu のメニューが出る。 3:セパレータ。 4:縦線
CheckBox いろいろ並べてオプション指定に使う
cb= CheckBox.new form
cb.checked = true  #または、false      #チェックされているかの判断(代入も可)。これで使う。
メニューコンポーネント ---ボタンの代わりに以下のように指定

new_menu(f,:menu1,[menu_file = new_item('ファイル','',:menu_file1)])
  menu_file.add(new_item('メニューファイル0(&F)','Ctrl+S',:menu_0)) 	#Ctrl+Sはショートカットキー
  menu_file.add(new_item('メニューファイル1(&E)','Ctrl+Z',:menu_1))	#&Eはメニュー表示時のショートカット
menu_file[0].on_click = proc{		}
    ポップアップメニュを作りたいとき、ポップアップオブジェクトを作ればよい: 
    pp = PopupMenu.new(f,:pop,'') 
    pp.items.add(new_item("メニュー1", '', :menu1))
    pp.items[0].add(new_item("メニュー2", '', :menu2))
    pp.items.insert(0, new_item("メニュー3", '', :menu3))
    pp.items.menu1.on_click = proc{   }  
    f.popup_menu = pp    #f上のポップアップメニューを指定
バーコンポーネント ---スライドするボタンとして

ScrollBar  スライドバー
scb=ScrollBar.new f
scb.kind=1		#縦型(横型は0)
scb.align=AL_RIGHT
scb.on_change=proc{p scb.position}
TrackBar  スライド入力
trb=TrackBar.new f
trb.align=AL_BOTTOM
trb.max=100		#目盛り最大値
trb.position=50		#目盛り初期値
trb.frequency=5		#目盛り間隔
trb.tick_marks=0		#目盛り位置下右(上左1、両側2)
trb.on_change=proc{p trb.position.to_i*10}
コントロールコンポーネント ---------------

PageControl TabSheetなどの制御
pc = PageControl.new form
pc.align = AL_CLIENT 
pc.active_page          #現在アクティブなページ番号
TabSheet 同一Form上で複数文書を処理。 この上にMemoやStringGridをおく
tb1 = TabSheet.new pc           #PageControl の上におくこと
印刷コンポーネント ------- strprn をrequireして使う。

FormStringsPrint #詳細なテキスト印刷設定用。
    プリンタオブジェクトsprn = StringsPrinter.new を宣言して、
    FormStringsPrint.execute(sprn, lines)と書けば、設定画面で設定後、文字列配列linesを印刷。
     設定は、sprn.write_ini('print1.ini', 'SPrinter1', 'Property')で 
     (パスが指定なければ、Windowsフォルダの)iniファイル print1.ini の
     項目[SPrinter1]に、Propertyとして保存できる。
     もちろん、sprn.write_iniを、sprn.read_ini とすれば、設定読み込みができる。