2011年6月5日日曜日

wxErlang wxTextCrtl chat風に文字列を書きこむ

何がやりたいのかというと、過去に書いてきたソースの改良版ができたので、ブログに載せておきたいということ。

改良したところは、loop内のメッセージを受信するところ。
前はloopの引数にwxTextCtrlのポインタを設定して、receive内でそのポインタを使っていた。
しかし、それはメッセージパッシングではなかったので、自分としては納得していなかった。

ようやくメッセージパッシングでできることを知ったので、改良した。
前後の比較はコメントアウトとそうでないもので表現した。

たぶん、もう一個くらいloopの引数を減らすことができるのではないかと思っている。

ソース:

-module(irc2).
-export([start/0]).
-include_lib("wx.hrl").

-define(wxID_txtEdit,1000).
-define(wxID_txtUnEdit,1001).

start() ->
    % Create Window Object
    Wx = wx:new(),

    % Create Window
    %{Dialog,TxtEdit,TxtUnEdit} = wx:batch(fun() -> create_window(Wx) end),
    {Dialog,TxtUnEdit} = wx:batch(fun() -> create_window(Wx) end),

    % Show Window
    wxWindow:show(Dialog),

    % Message Receive Loop
    %loop(Dialog,TxtEdit,TxtUnEdit),
    loop(Dialog,TxtUnEdit),

    % Destroy Window
    wx:destroy(),
    ok.

create_window(Wx)->
    % Create Dialog
    Dialog = wxDialog:new(Wx,
-1,
"Dialog IRC",
[{size,{300,200}}]),
 
    % Set Option
    OptnTE = [{pos,{1,150}},{size,{290,20}},{style,?wxTE_PROCESS_ENTER}],
    TxtEdit = wxTextCtrl:new(Dialog,
    ?wxID_txtEdit,
    OptnTE),

    % Set Option and set multiline({style,?wxTE_MULTILINE})
    OptnTUE = [{pos,{1,0}},{size,{290,150}},{style,?wxTE_MULTILINE}],
    TxtUnEdit = wxTextCtrl:new(Dialog,
      ?wxID_txtUnEdit,
      OptnTUE),
   
    % set unable edit
    wxTextCtrl:setEditable(TxtUnEdit,false),
   
    % connect
    wxDialog:connect(Dialog, close_window),
    wxTextCtrl:connect(TxtEdit,command_text_enter),

    % Return
    %{Dialog,TxtEdit,TxtUnEdit}
    {Dialog,TxtUnEdit}.

%loop(Dialog,TxtUnEdit) ->
loop(Dialog,TxtUnEdit) ->
    receive
% Window Close Event
#wx{event=#wxClose{}} ->
   io:format("~p Closing window ~n",[self()]),
   wxWindow:destroy(Dialog),
   ok;

% Pressed Enter Event
%#wx{event=#wxCommand{type = command_text_enter}} ->
#wx{obj = TxtEdit ,event=#wxCommand{type = command_text_enter}} ->
   Msg = wxTextCtrl:getValue(TxtEdit),
   io:format("String: ~p~n",[Msg]),
   wxTextCtrl:appendText(TxtUnEdit,Msg),
   %loop(Dialog,TxtEdit,TxtUnEdit)
   loop(Dialog,TxtUnEdit)
    end.

0 件のコメント:

コメントを投稿