2011年5月28日土曜日

Dev-C++ の Getting started を wxErlang でやる

wxErlangの勉強をしている。
しかし、wxWidgetsの勉強が必要とわかる。
そこで、Dev-C++でGUIで作って、自動的にできるソースを参考に勉強する。
そして、wxErlangで同じ物を作った。

つまり、以下のURIで作成しているものをwxErlangで作った。

Getting started with wxWidgets in Windows - Tutorial : http://www.speqmath.com/tutorials/wxwidgets_getting_started/index.html



大変だった。
なんせwxErlangは参考になるサイトが見つからない。
ドキュメントにメンチ切りながらやった。

できたものは以下。


ソースは以下(Google Docにあるので、リンクからダウンロードなり保存なりしてください。)

https://docs.google.com/leaf?id=0B8Fi1kuQJgFrZDEzN2M3ZmYtZTAzMS00Y2I5LThlNjYtZTI4NWUwZjM5OWNl&hl=ja&authkey=COzP39cO

ソース全文も載せる。モジュール名とダイアログのタイトルがおかしいが、それはこちらの都合でそうなっている。

{Dialog,TxtName,TxtAge} = wx:batch(fun() -> create_window(Wx) end),
の部分はもっといいやり方があるだろうが、わからないので、一旦そのままに。明日資格試験なので、時間かけてられない。
create_windowでオブジェクトのポインタを3つも返すとか、ちょっとないなと。

(wx.hrlはErlangのインストールディレクトリに対して検索をかけて、探す。
それを本モジュールと同一ディレクトリに置く。)


-module(irc).
-export([start/0]).
-compile(export_all).
-include_lib("wx.hrl").


-define(wxID_LOG_TEXT_CTRL, 3000).


-define(wxID_BTNNAME,1005).
-define(wxID_txtName,1004).
-define(wxID_txtAge,1003).
-define(wxID_lblName,1002).
-define(wxID_lblAge,1001).
-define(wxID_lblSize,{20,150}).


start() ->
    Wx = wx:new(),
    {Dialog,TxtName,TxtAge} = wx:batch(fun() -> create_window(Wx) end),
    wxWindow:show(Dialog),
    loop(Dialog,TxtName,TxtAge),
    wx:destroy(),
    ok.


create_window(Wx)->
    Dialog = wxDialog:new(Wx,
-1,
"IRC On wxErlang",
[{size,{300,200}}]),


    % create button
    %BtnPanel = wxPanel:new(Dialog),
    BtnClick = wxButton:new(Dialog,?wxID_BTNNAME,[{label,"Click Here!"}]),
    wxWindow:setSize(BtnClick,{133,128,126,25}),


    % create label
    LblName = wxStaticText:new(Dialog,?wxID_lblName,"name",[{pos,{11,29}}]),
    %wxWindow:setSize(LblName,?wxID_lblSize),


    LblAge = wxStaticText:new(Dialog,?wxID_lblAge,"age",[{pos,{11,75}}]),
    %wxWindow:setSize(LblAge,?wxID_lblSize),


    % create edit
    TxtName = wxTextCtrl:new(Dialog,?wxID_txtName,[{pos,{77,29}},{size,{192,18}}]),
    wxTextCtrl:appendText(TxtName,"<enter your name here>"),


    TxtAge = wxTextCtrl:new(Dialog,?wxID_txtAge,[{pos,{78,79}},{size,{192,18}}]),
    wxTextCtrl:appendText(TxtAge,"<enter your age here>"),


    % connect
    wxDialog:connect(Dialog, close_window),
    wxButton:connect(BtnClick,command_button_clicked),
    wxTextCtrl:connect(TxtName,command_text_updated),
    wxTextCtrl:connect(TxtAge,command_text_updated),


    % return
    {Dialog,TxtName,TxtAge}.


loop(Dialog,TxtName,TxtAge) ->
    receive
% Window Close Event
#wx{event=#wxClose{}} ->
   io:format("~p Closing window ~n",[self()]),
   %ok = wxFrame:setStatusText(Frame, "Closing...",[]),
   wxWindow:destroy(Dialog),
   ok;
% Button Click Event
#wx{event=#wxCommand{type = command_button_clicked}} ->
   %io:format("Clicked ~n"),
   btnButtonClick(Dialog),
   loop(Dialog,TxtName,TxtAge);
% Write Name Event
#wx{event=#wxCommand{type = command_text_updated},obj = TxtName} ->
   %io:format("Name update ~n"),
   GetName = wxTextCtrl:getValue(TxtName),
   put(?wxID_txtName,GetName),
   loop(Dialog,TxtName,TxtAge);
% Write Age Event
#wx{event=#wxCommand{type = command_text_updated},obj = TxtAge} ->
   %io:format("Age update ~n"),
   GetAge = wxTextCtrl:getValue(TxtAge),
   put(?wxID_txtAge,GetAge),
   loop(Dialog,TxtName,TxtAge);
Msg ->
   io:format("Got ~p ~n",[Msg]),
   loop(Dialog,TxtName,TxtAge)
    end.


btnButtonClick(Dialog) ->
    % Get Name and Age
    PutName = get(?wxID_txtName),
    PutAge = get(?wxID_txtAge),
    % Get Now Year
    {Year,_,_} = date(),
    % Calculate Year of Your Birthday
    BirthDay = Year - list_to_integer(PutAge),
    % Create Message
    Info = ["Hello ",PutName,", welcome! ","So you are born in ",integer_to_list(BirthDay),"..."],
    % Create MessageDialog
    MDialog = wxMessageDialog:new(Dialog,Info,[{style,?wxOK}]),
    % Show Dialog
    wxDialog:showModal(MDialog),
    % destroy
    wxMessageDialog:destroy(MDialog),
    ok.


追記:2011 5/29

赤色の部分は、オブジェクトの考え方が抜けていないからだろうと思い至る。
Erlangはメッセージパッシング型なので、メッセージでどうにかするべき。

0 件のコメント:

コメントを投稿