2011年8月20日土曜日

Erlang wx_object behaviour Sample サンプル

ビヘイビアを使ってみた。
まだまだよくわからない。
サンプルにもなるのかはわからない。


動作画面:

ソースサンプル:

-module(wx_objectTest).
-export([start/0]).
-export([new/2, show/1]).  %% API
-export([init/1, handle_call/3, handle_event/2]).
-export([terminate/2,handle_info/2,code_change/3]).
-include("wx.hrl").
-behaviour(wx_object).

start() ->
    Wx = wx:new(),
    new(Wx,?wxID_ANY).
   
%% Client API
new(Parent, Id) ->
    io:format("new~n"),
    %% @spec start(Mod, Args, Options) -> wxWindow().
    %% Starts a generic wx_object server
    %% and invokes Mod:init(Args) in the new process.
     wx_object:start(?MODULE, [Parent,Id], []).

show(Dialog) ->
    io:format("show~n"),
    wxWindow:show(Dialog).

%% Server Implementation ala gen_server
init([Parent, Id]) ->
    io:format("init~n"),
     Dialog = wxDialog:new(Parent, Id, "Testing", []),
    wxDialog:connect(Dialog,close_window),
    show(Dialog),
    MyState = "init",
    {Dialog, MyState}.

handle_call(show, _From, State) ->
    io:format("handle_call~n"),
    {reply, ok, State}.

handle_event(#wx{event=#wxClose{}}, State) ->
    io:format("handle_event~n"),
    io:format("~p Closing window ~n",[self()]),
    wx:destroy(),
    {noreply, State}.

code_change(OldVsn, State, Extra) ->
  io:format("Upgrading from ~p with extra data ~p~n", [OldVsn, Extra]),
  { ok, State }.

terminate(Reason,State) ->
    io:format("Terminating ~p for reason ~p state:~p~n", [ self(), Reason,State ]),
    ok.

handle_info(Msg, State) ->
  io:format("Unexpected Info ~p~n", [Msg]),
  { noreply, State }.

赤字が最低限定義しなければならないものかな。
wx.hrlはErlangインストールディレクトリ配下を検索して探してください。

wx_objectTest:start().を実行すると画面が表示される。
start
→new
→init
→show
の順で動作し、
画面を閉じると
handle_eventが動作する。