2011年5月29日日曜日

wxErlang wxTextCtrlを試す On wxDialog

飛行機本のIRCをwxErlangで実現すべく、wxTextCtrlを試している。
その際、setEditableメソッドを試したので、ソースを記載しておく。

なお、wx.hrlはErlangのインストールディレクトリを検索し、ソースと同一ディレクトリ内に置いてくれ。

ソース:


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


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


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


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


    TxtEdit = wxTextCtrl:new(Dialog,?wxID_txtEdit,[{pos,{1,150}},{size,{290,20}}]),
    TxtUnEdit = wxTextCtrl:new(Dialog,?wxID_txtUnEdit,[{pos,{1,0}},{size,{290,140}}]),
    wxTextCtrl:setEditable(TxtUnEdit,false),
    wxTextCtrl:appendText(TxtUnEdit,"Test\r"),
    
    % connect
    wxDialog:connect(Dialog, close_window),


    Dialog.


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


wxErlang wxFrameのみ表示させる

ここのブログの記事に「wxErlang wxDialogのみ表示させる」ってのがある。
それをwxFrameにした版。
DialogをFrameに置換しただけ。

ソース:


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


start() ->
    Wx = wx:new(),
    Frame = wx:batch(fun() -> create_window(Wx) end),
    wxWindow:show(Frame),
    loop(Frame),
    wx:destroy(),
    ok.


create_window(Wx)->
    Frame = wxFrame:new(Wx,
-1,
"Frame Example",
[{size,{300,200}}]),
    % connect
    wxFrame:connect(Frame, close_window),


    Frame.


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

色を変えているのは見やすさのため。
インデントがうまくできてないのは、すみません。

wxErlang wxDialogのみ表示させる

なかなか分かってきた。wxErlangが。
wxDialogだけ表示させるソースを載っける。

ソース:

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


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


create_window(Wx)->
    Dialog = wxDialog:new(Wx,
-1,
"Dialog Example",
[{size,{300,200}}]),
    % connect
    wxDialog:connect(Dialog, close_window),


    Dialog.


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

wx:new()はたぶん必要。
すべてのwxクラス(wxDialogとか)のベースになっているようで。
それにしても、wxErlangのサンプルは大きすぎてわからん。

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月26日木曜日

Dev-C++ Vista 基本

DevC++をVistaにインストールした。
Program file配下に入れた。

http://www.speqmath.com/tutorials/wxwidgets_getting_started/index.html
上記URLを試した。

エラーになった。
VistaでProgram file配下に入れちゃダメなのは、常識だよね。忘れてた。

2011年5月19日木曜日

Microsoft Visual C++ 2008 Express Edition で wxWidgets2.9.1を使った開発のための設定

丁寧にサイトを読まないから、結構手間取った。
wxWidgetsをビルド出来る環境の設定方法を記す。

1.ソリューション構成を「Release」にする。
wxWidgetsをRelease版しかビルドしてないもんで。


2.Alt+F7を押す。プロジェクトの設定(プロパティ)画面を出す。
3.画面左にある「C/C++」から「全般」を選択し、「追加のインクルードディレクトリ」に
「C:\wxWidgets-2.9.1\include」と「C:\wxWidgets-2.9.1\lib\vc_lib」を設定する。

4.wxWidgetsのライブラリのディレクトリを設定する。
「C:\wxWidgets-2.9.1\lib\vc_lib」である。

5.wxWidgetsのライブラリを指定する。「リンカ」-「入力」-「追加の依存ファイル」から。
wxmsw29u_core.lib
wxbase29u.lib
wxtiff.lib
wxjpeg.lib
wxpng.lib
wxzlib.lib
wxregexu.lib
wxexpat.lib 
を指定する。

6.エラーがなくなることを願う。

以上

Microsoft Visual C++ 2008 で wxWidgets2.9.1をビルド

VC++ 2010だとなんかエラーが出る。
目的はそのエラーをどうこうすることではない。

VC++ 2008でビルドを開始した。

このブログでは言葉足らずなので、他のサイトを参照したほうがよい。
http://freepg.fc2web.com/cpp/topic_wx_vc.html

1.VC++ 2008をインストールする。
2.wxWidgetsのインストールフォルダ内で「wx.dsw」を検索する。今回ビルドする対象のソリューションだ。
3.VC++の「ファイル」-「開く」からwx.dswを開く。
4.なんか言われるので、「すべてはい」を選択する。


5.ビルドをする準備をする。ソリューション構成を好きなものにする。「Release」でいいと思う。
(画像は「Debug」だけど。)

6.ビルドする。
画面中の左にツリーが出来ていると思う。そのツリーの1番上の「ソリューション~」を右クリック-「ソリューションをビルド」を選択する。

7.確認する。「C:\wxWidgets-2.9.1\lib\vc_lib」にいっぱいなんか出来ているとおもう。あれば完了。


2011年5月17日火曜日

wxWidgets 2.9.1 と Visual Studio 2010 Express

wxWidgetsのライブラリが作れない。
Visual Studio 2010 Expressでは。

解決法はあるらしい。英語で書いてある。
wxWidgets Discussion Forum :: View topic - Fixed wxWidgets 2.9.1 project files Visual Studio 2010 : http://forums.wxwidgets.org/viewtopic.php?t=27630

あきらめた。
2008入れる。

Windows Vistaでプログラムを管理者モードで実行する

vistaは面倒だ。
コマンドプロンプトを管理者モードで行う方法についての記事
Windows Vistaでプログラムを管理者モードで実行する - @IT : http://www.atmarkit.co.jp/fwin2k/win2ktips/899uacpromo/uacpromo.html

2011年5月15日日曜日

wxWidgets 2.9.1 インストール On Windows Vista

wxWidgetsをインストールしてみる。
wxErlangはwxWidgetsをもとにしているからだ。

下記アドレスからダウンロードしてほしい。
http://www.wxwidgets.org/downloads/

どれをダウンロードするかは画像を参照してほしい。

ダウンロードした実行ファイル(exe)をダブルクリックして、全部「OK」ボタンぽいのを押しておけばよい。

Erlang ? はマクロ

下記URLを参照してください。
[Erlang] レコードとマクロ - うなの日記 : http://d.hatena.ne.jp/unageanu/20071117

2011年5月8日日曜日

wxErlang wxMenuBar を表示させる

ErlangのGUIばかりやっている。
なんていったって、wxWidgetsがわからないのでwxErlangもわからない。

ソース:

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

start() ->
    Wx = wx:new(),
    Frame = wx:batch(fun() -> create_window(Wx) end),
    wxWindow:show(Frame),
    loop(Frame),
    wx:destroy(),
    ok.

create_window(Wx)->
    Frame = wxFrame:new(Wx,
-1,
"IRC On wxErlang",
[{size,{300,200}}]),
    % Create Sizer
%    Panel = wxPanel:new(Frame),
%    Sz = wxStaticBoxSizer:new(?wxVERTICAL, Panel, [{label, "BoxLabel"}]),
%    wxPanel:setSizer(Panel,Sz),

    % Create MenuBar
    MB = wxMenuBar:new(),


    % Create Menu
    File    = wxMenu:new([]),
    wxMenu:append(File, ?wxID_PRINT, "&Print code"),
    wxMenu:appendSeparator(File),
    wxMenu:append(File, ?wxID_EXIT, "&Quit"),


    % Create Menu
    Help    = wxMenu:new([]),
    wxMenu:append(Help, ?wxID_HELP, "Help"),
    wxMenu:append(Help, ?wxID_ABOUT, "About"),


    % Append Menu on MenuBar
    wxMenuBar:append(MB, File, "&File"),
    wxMenuBar:append(MB, Help, "&Help"),


    % Set MenuBar on Frame
    wxFrame:setMenuBar(Frame,MB),

    % Create StatusBar
    wxFrame:createStatusBar(Frame,[]),
    wxFrame:setStatusText(Frame,"Hello World"),
 
    % connect
    wxFrame:connect(Frame, close_window),
    wxFrame:connect(Frame, command_menu_selected),

    Frame.

loop(Frame) ->
    receive
#wx{event=#wxClose{}} ->
   io:format("~p Closing window ~n",[self()]),
   ok = wxFrame:setStatusText(Frame, "Closing...",[]),
   wxWindow:destroy(Frame),
   ok;
Msg ->
   io:format("Got ~p ~n",[Msg]),
   loop(Frame)
    end.

wx.hrlはErlangのインストールディレクトリから検索をかけると見つかると思う。
それを実行モジュールと同一ディレクトリに配置する。


ステータスバーに「Hello World」が表示されるが、メニューを触ると消える。
なんだそれは!

wxErlang wxStaticBoxSizer 表示させる

wxStaticBoxSizerがよくわからない。
Sizerってのがよくわからない。
わからないなりに表示はさせた。
以下ソース

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

start() ->
    Wx = wx:new(),
    Frame = wx:batch(fun() -> create_window(Wx) end),
    wxWindow:show(Frame),
    loop(Frame),
    wx:destroy(),
    ok.

create_window(Wx)->
    Frame = wxFrame:new(Wx,
-1,
"IRC On wxErlang",
[{size,{300,200}}]),
   
    Panel = wxPanel:new(Frame),
    Sz = wxStaticBoxSizer:new(?wxVERTICAL, Panel, [{label, "BoxLabel"}]),
    wxPanel:setSizer(Panel,Sz),
   
    wxFrame:createStatusBar(Frame,[]),
    wxFrame:setStatusText(Frame,"Hello World"),
   
    wxFrame:connect(Frame, close_window),
   
    Frame.

loop(Frame) ->
    receive
#wx{event=#wxClose{}} ->
   io:format("~p Closing window ~n",[self()]),
   ok = wxFrame:setStatusText(Frame, "Closing...",[]),
   wxWindow:destroy(Frame),
   ok;
Msg ->
   io:format("Got ~p ~n",[Msg]),
   loop(Frame)
    end.

wx.hrlはErlangをインストールしたディレクトリで検索をかけるとある。
それを本実行モジュールと同一ディレクトリに置く。


wxErlang Button を表示させる

やっとButtonを画面に載せることができた。
wxPanelを使って。
以下ソース。

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

start() ->
    Wx = wx:new(),
    Frame = wx:batch(fun() -> create_window(Wx) end),
    wxWindow:show(Frame),
    loop(Frame),
    wx:destroy(),
    ok.

create_window(Wx)->
    Frame = wxFrame:new(Wx,
-1,
"IRC On wxErlang",
[{size,{300,200}}]),
   
    %GSizer = wxGridSizer:new(2),
    %SizerItem = wxSizer:add(GSizer,Frame),
    Panel = wxPanel:new(Frame),
    Button = wxButton:new(Panel,
-1,
[{label,"Button"}]),

    wxFrame:createStatusBar(Frame,[]),
    wxFrame:setStatusText(Frame,"Hello World"),
   
    wxFrame:connect(Frame, close_window),
   
    Frame.

loop(Frame) ->
    receive
#wx{event=#wxClose{}} ->
   io:format("~p Closing window ~n",[self()]),
   ok = wxFrame:setStatusText(Frame, "Closing...",[]),
   wxWindow:destroy(Frame),
   ok;
Msg ->
   io:format("Got ~p ~n",[Msg]),
   loop(Frame)
    end.

wx.hrlはErlangのインストールディレクトリ配下を検索するとある。
それを実行モジュール(beam)と同一ディレクトリに置く。

2011年5月7日土曜日

Erlang wxErlang でHello World サンプル

やっと、画面を出せた。自分が納得できるもので。
以下Hello Worldのサンプル


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

start() ->
    Wx = wx:new(),
    Frame = wx:batch(fun() -> create_window(Wx) end),
    wxWindow:show(Frame),
    loop(Frame),
    wx:destroy(),
    ok.

create_window(Wx)->
    Frame = wxFrame:new(Wx,
-1,
"IRC On wxErlang",
[{size,{300,200}}]),
   
    wxFrame:createStatusBar(Frame,[]),
   
    wxFrame:connect(Frame, close_window),
   
    Frame.

loop(Frame) ->
    receive
#wx{event=#wxClose{}} ->
   io:format("~p Closing window ~n",[self()]),
   ok = wxFrame:setStatusText(Frame, "Closing...",[]),
   wxWindow:destroy(Frame),
   ok;
Msg ->
   io:format("Got ~p ~n",[Msg]),
   loop(Frame)
    end.

wx.hrlはErlangをインストールしたフォルダ内を検索するとあるもの。
本ソースをコンパイルしたbeamと同一フォルダに置いてください。

画面を消すときは、右上の☓ボタン押下で。

Hello Worldとはいっても、ソースのどこにもその記述がない。
これは、飛行機本(Erlangの参考書)のIRCがGSで書かれているので、それをwxErlangで書き換えようとしている最中のものなので、「IRC On wxErlang」とか書いている。

2011年5月4日水曜日

プログラミングErlang IRC Lite エラーが出た2

プログラミングErlangのIRC(チャット)の実行をしようとしたら、エラーが出てくる。
それらを1つずつ解決していく。

以下エラー文

4> chat_client:start().
<0.45.0>
chat_client disconnected unexpected:{'EXIT',<0.52.0>,
                                     {undef,
                                      [{lib_md5,string,
                                        ["plupqdypjmzrxocwtweslasffAsDT67aQ"]},
                                       {lib_chan,authenticate,4},
                                       {lib_chan,connect,5},
                                       {chat_client,try_to_connect,4}]}}

lib_md5がない(定義されていない)という問題。
上記URLで解決。

URLの中身は英語なので、解決策を日本語で解説する。

Windows環境でErlangを動かしているので、それを前提にする。
解決策を要すると、lib_md5.beamを作って、chat_clientと同一フォルダに移動させればいい。

1.コマンドプロンプトを起動し、下記のプログラミングErlangのソースをダウンロードしたフォルダに移動する。
C:\Users\andre\erlwork\jaerlang-code-ja

2.ここで「make」と入力し、Enterキーを押下する。
すると、何やらいろいろ始める。

3.lib_md5.beamができあがるので、socket_distフォルダに移動させる。

4.エラーが消える。

ほかのエラーが出ているのはまた次回。

プログラミングErlang IRC Lite エラーが出た

プログラミングErlangの本(一般には飛行機本とか言われている)を勉強中だ。
そこに記載されているチャットツールをコンパイルし、動かそうとした。

サーバを起動(chat_server:start())したら、chat_server.erlでregister/2 bad argumentのエラー。

ちょっと調べると、registerの第一引数の「chat_server」に原因があるようだ。

http://www.trapexit.org/forum/viewtopic.php?p=44086
上記URLを参考にした。

chat_serverをchat_server1にしたら、別の問題に変わった。
ひとまず、bad argumentはOKぽい。