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

Phi::Application

Phi::Application クラス

実行中のアプリケーションについての情報を表す。

Phi は Phi::APPLICATION ( 定数 ) を用意する。

methods

terminated : Boolean

WM_QUIT メッセージを受け取ったか

properties

icon : Phi::Icon

デスクトップやタスクバーに表示されるアイコン

title : String

Application?#icon の下に付けるテキスト

IO 関連

methods

Phi を導入すると,標準入出力は切り替わる。

require 'phi'
p $stdin  #==> #<Application:0x??>
p $stdout #==> #<Application:0x??>
p $stderr #==> #<Application:0x??>
p $>      #==> #<Application:0x??>

write(s) : Fixnum

標準出力支援

$> == Phi のときは, Ruby 組み込みの関数 p , print はこれを呼び出す。

Apollo.exe では, Console#memo.lines に s を追加する。

s
String:

gets : String or nil

標準入力支援

$stdin == Phi のときは, Ruby 組み込みの関数 gets はこれを呼び出す。

入力文字列の長さが 0 のときは nil を返す。 EOF を検出するためだ。

while gets
  print
end

Apollo.exe では, Console#memo からの入力を返す。

入力は Console#memo に focus を置いて, key を打てばよい。 [Enter] ( 0x0d "\r" ) が押されるまで,入力は蓄えられる。行末の \r は \n に置き換えられる。

[Ctrl+D] ( 0x04 "\C-d" ) を押すことによっても,入力を完了できる。最後の完了合図のための打鍵は入力に含まれない。

getc : Fixnum or nil

標準入力支援

$stdin == Phi のときは, Ruby 組み込みの関数 getc はこれを呼び出す。

入力文字列の長さが 0 のときは nil を返す。そのほか, Application?#gets と同じ扱いになる。



_dump => Phi::Component#_dump

activate_hint

active

bring_to_front

bring_to_front_ex

component_count => Phi::Component#component_count

components => Phi::Component#components

create_handle

event_handle

exe_name

起動コマンドのフルパスを返す。

  • apollo.exe で起動した場合
require "phi"
p Phi::APPLICATION.exe_name
 #=>"C:/Program Files/Apollo/bin/Apollo.exe"
  • ruby.exe や ruby_sp.exe で起動した場合。
G:\Apollo>ruby -rPhi -e "p Phi::APPLICATION.exe_name"
"C:/Program Files/Apollo/bin/ruby.exe"

G:\Apollo>ruby_ap -rPhi -e "p Phi::APPLICATION.exe_name"
"C:/Program Files/Apollo/bin/ruby_ap.exe"

G:\Apollo>
  • Apollo のインストールパス($(Apollo))は File_split3.rb? を使って次のようにして調べることができる。
G:\Apollo>ruby_ap -rPhi -rFile_split3
    -e "p File.split3(Phi::APPLICATION.exe_name)[0]"

"C:/Program Files/Apollo/bin/"

extend => Phi::Persistent#extend

handle

handle=

handle_message

hint

hint=

hint_color

hint_color=

icon

icon=

main_form

name

name=

on_activate

on_activate=

これは使わない方が無難です。

require "phi"
form = Phi::Form.new
Phi::APPLICATION.create_handle
Phi::APPLICATION.on_activate = proc{|*args| p [:on_activate, args]}
form.show
p :before_mainloop
Phi.mainloop
p :after_mainloop

を ruby.exe で実行すると次のように出ますが・・

G:\apollo\kumalaw\tables>ruby 1.rb
:before_mainloop
[:on_activate, [#<Phi::Application:0x292d7a0>], 1]
:after_mainloop
1.rb:16: unhandled exception
G:\apollo\kumalaw\tables>

Phi::APPLICATION.create_handle を入れないと出ません。

また、ruby.exe 以外の apollo.exe ruby_ap.exe などでも出ません。これは、アプリケーションの起動がスクリプトの実行以前に始まってしまうためだと思われます。

on_exception

on_exception=

on_hint

on_hint=

on_idle

on_idle=

require "phi"
form = Phi::Form.new
@cnt=0
Phi::APPLICATION.on_idle = proc{|*args| p [:on_idle, args, @cnt+=1]}
form.show
Phi.mainloop

を実行すると、コンソールに次の様な出力が出るでしょう。

[:on_idle, [#<Phi::Application:0x16ebd60>, true], 1]
[:on_idle, [#<Phi::Application:0x16ebd60>, true], 2]
[:on_idle, [#<Phi::Application:0x16ebd60>, true], 3]
・・・

ハンドラがnilまたはtrueを返すと、マウスが動いているときなどにしか呼ばれないことが分かります。

ハンドラがfalseを返すようにすると、連続して呼ばれるようになります。ただし、アプリケーション全体の動作は遅くなる可能性があります。

Phi::APPLICATION.on_idle = proc{|*args| p [:on_idle, args, @cnt+=1];false}

on_message

Windows からのメッセージを受け取ります。

require 'phi'
require 'Win32API'
SendMessage = Win32API.new("user32", "SendMessage", ['L'] * 4, 'L')
PostMessage = Win32API.new("user32", "PostMessage", ['L'] * 4, 'I')

Phi::APPLICATION.on_message = proc do |recv, handled, (hwnd, message, w, l, time, pt)|
   if message == 0x442
     p [:message_received, '0x%x 0x%x 0x%x 0x%x' % [hwnd, message, w, l]]
     handled = true
   end
   handled
end

class F < Phi::Form
   def initialize
     super
     Phi::Button.new(self, :send_msg, "send")
     @send_msg.on_click = proc do
       ret = SendMessage.call(self.handle, 0x442, 0x42, 0)
       p [:message_sent, "0x%x" % self.handle,ret]
     end
     Phi::Button.new(self, :post_msg, "post")
     @post_msg.top = 30
     @post_msg.on_click = proc do
       ret = PostMessage.call(self.handle, 0x442, 0x42, 0)
       p [:message_posted, "0x%x" % self.handle,ret]
     end
   end
end
f=F.new
f.show
Phi::mainloop

* プロセス間通信の仕組みには、他に Phi::Form#on_copy_data もあります。

process_messages

prop_info => Phi::Component#prop_info

show_exception

show_hint

show_hint=

terminated

title

title=

write_res_file => Phi::Component#write_res_file

Last modified:2006/10/24 18:49:37
Keyword(s):
References:[Phi-Classes] [Phi-Constants] [Phi::APPLICATION] [RubyModuleWikiName]