2011年7月31日日曜日

Erlang error Reason:enoent エラーについて

Reason:enoent

↑これは「そんなファイルねーよ」です。俺のソースで出てきたときは。

Erlang Crashdumpの表示方法

WindowsのbatファイルからErlangプログラムを起動することを試していた。
プログラムが落ちたとき、Erlangの情報がCrashdumpしかなかったので、それを表示させるべく、下記URLを参考に表示させてみた。

Erlang のクラッシュダンプ - Life Logging Life : http://blogs.asanegra.org/mnaniwa/entry/29

このとき、上記サイトの通りにいかなかった箇所を記述する。

サイトでは、EshellのカレントとCrashdumpの場所が同一の状態で、webtool:start().を行うと表示できるとある。

しかし、できなかった。
http://localhost:8888へアクセスし、Crashdumpを指定すると、C:\fakepathにCrashdumpないという表示が出る。
なので、C直下にfakepathを作成し、Crashdumpをそこに置いたら、できるようになった。

下記画像が表示できた様子:

これをどう解析して、落ちた原因を特定するのかは不明。

Erlang filename basename のサンプル sample

filename の basenameのサンプルだ。
注意点は「/(スラッシュ)」のパスしかダメなところ。

ソース:

-module(basenameTest).
-export([start/0]).

start() ->
    Path = "C:/Dir/FileA.txt",
    File1 = filename:basename(Path),
    io:format("File1:~p~n",[File1]).

Erlang filenameのsplitとbinaryのsplit

splitでwindowsのパスを分割しようとして苦しんだ。
そのためのメモ。

動作結果:

ソース:

-module(filenameTest).
-export([start/0]).

start() ->
    Path = "C:\Dir\File.txt",
    io:format("Path:~p~n",[Path]),
    Split = filename:split(Path),
    io:format("Split:~p~n",[Split]),
   
    Path1 = "C:/Dir/File.txt",
    io:format("~nPath1:~p~n",[Path1]),
    Split1 = filename:split(Path1),
    io:format("Split1:~p~n",[Split1]),
   
    Path2 = list_to_binary(Path),
    Splitter = <<" ">>,
    Split2 = binary:split(Path2, Splitter),
    io:format("~nSplit2:~p~n",[Split2]),
   
    AddPath = Path ++ " " ++ Path1,
    Path3 = list_to_binary(AddPath),
    Split3 = binary:split(Path3, Splitter),
    io:format("~nSplit3:~p~n",[Split3]).

   

2011年7月30日土曜日

Erlang Windows上でダブルクリックでErlangを実行する。

大層なことをタイトルに書いたが、要するに

batファイルをダブルクリックして、Erlangのプログラムを起動する

ってだけ。

test.batファイルの中身:

erl -noshell -s hello1 hello_out -s init stop

hello1.erlの中身:


-module(hello1).
-export([hello_out/0]).

hello_out() -> io:fwrite("Hello world!\n").

事前にhello1をコンパイルする必要がある。
そして、test.batファイルとhello1.beamを同一ディレクトリに配置して、test.batファイルをダブルクリックする。
そうすると、コマンドプロンプトが起動し、「Hello world!」が表示される。

2011年7月24日日曜日

Erlang zip sample サンプル

Erlangのzip:zipについてどう動作するのか確認したくて、プログラミングしたので、そのソースを載せる。

そのまとめみたいなメモをgoogle Docに作ったので、合わせて参照あれ。
https://docs.google.com/document/d/1lQmkEN8UxggewyHtPGLfwhW5_r8qR1e7yeedYkdnR2M/edit?hl=ja


ソース:

-module(zipTest).
-include_lib("wx.hrl").

-export([start/0]).

%% -*- coding: shift-JIS -*-
%% Current Directory -> C:\Users\andre\erlwork
start() ->
    %myzipMem().
    %myzipVerbose().
    %myzipCwd().
    %myzipUcp().
    myzipCmt().

%% @doc write to file on memory data that compress by zip:zip/3
%% in C:\Users\andre\erlwork\auiTest.erl
%% out C:\Users\andre\erlwork\ngs_bin.zip
myzipMem() ->
    Option = [memory],
    case zip:zip("ngs.zip",["auiTest.erl"],Option) of
{ok,{"ngs.zip",Mem}} -> file:write_file("ngs_bin.zip",Mem),
ok;
{error,Reason} -> io:format("Reason:~p~n",[Reason])
    end.

%% @doc compress the directory
%% in C:\Users\andre\erlwork\zip
%% out C:\Users\andre\erlwork\ngs.zip
myzipDrct() ->
    Option = [],
    case zip:zip("ngs.zip",["zip"],Option) of
{ok,"ngs.zip"} -> ok;
{error,Reason} -> io:format("Reason:~p~n",[Reason])
    end.

%% @doc compress the file
%% in C:\Users\andre\erlwork\auiTest.erl
%% out C:\Users\andre\erlwork\ngs.zip
myzip() ->
    Option = [],
    case zip:zip("ngs.zip",["auiTest.erl"],Option) of
{ok,"ngs.zip"} -> ok;
{error,Reason} -> io:format("Reason:~p~n",[Reason])
    end.

%% @doc compress the directory with option [verbose]
%% in C:\Users\andre\erlwork\zip
%% out C:\Users\andre\erlwork\ngs.zip
myzipVerbose() ->
    Option = [verbose],
    case zip:zip("ngs.zip",["zip"],Option) of
{ok,"ngs.zip"} -> ok;
{error,Reason} -> io:format("Reason:~p~n",[Reason])
    end.

%% @doc compress the directory and change current directory
%% in C:\Users\andre\erlwork\zip_work\test
%% out C:\Users\andre\erlwork\ngs_cwd.zip
myzipCwd() ->
    Option = [verbose,{cwd,"zip_work"}],
    case zip:zip("ngs_cwd.zip",["test"],Option) of
{ok,"ngs_cwd.zip"} -> ok;
{error,Reason} -> io:format("Reason:~p~n",[Reason])
    end.

%% @doc compress the directory but uncompress the extension "*.erl".
%% in C:\Users\andre\erlwork\zip
%% out C:\Users\andre\erlwork\ngs_ucp.zip
%% ucp -> uncompress
myzipUcp() ->
    ZipName = "ngs_ucp.zip",
    Option = [verbose,{uncompress,{add,[".erl"]}}],
    case zip:zip(ZipName,["zip"],Option) of
{ok,ZipName} -> ok;
{error,Reason} -> io:format("Reason:~p~n",[Reason])
    end.

%% @doc compress the directory but uncompress the extension "*.erl".
%% in C:\Users\andre\erlwork\zip
%% out C:\Users\andre\erlwork\ngs_cmt.zip
%% cmt -> comment
myzipCmt() ->
    ZipName = "ngs_cmt.zip",
    Option = [verbose,{comment,"This is test."}],
    case zip:zip(ZipName,["zip"],Option) of
{ok,ZipName} -> ok;
{error,Reason} -> io:format("Reason:~p~n",[Reason])
    end.

wx.hrlはErlangのインストールディレクトリ内を検索するとあるので、それを本ソースと同一ディレクトリに配置してください。

ディレクトリ構成がちょっと面倒かも。C:\Users\andre\erlwork\に実行モジュール(beam)がある。それと同一ディレクトリにzipディレクトリとかzip_workディレクトリとかある。

毎回のことだけど、解説がつかないブログで申し訳ありません :-<


2011年7月18日月曜日

Erlang zip ドキュメントの制限事項部分をgoogleで翻訳する。

Erlangのzipには制限事項がある。
その部分の翻訳をgoogleでやった。
それをコピペする。


ZIP64アーカイブは現在サポートされていません。

パスワードで保護し、暗号化されたアーカイブは、現在サポートされていません

のみDEFLATE(zlibの圧縮)とSTORE(非圧縮データ)ZIP方式がサポートされています。

アーカイブのサイズは2 Gバイト(32ビット)に制限されています。

zipアーカイブを作成するときに個々のファイルのコメントはサポートされていません。全体のZIPアーカイブのZIPアーカイブのコメントがサポートされています。

既存のzipアーカイブを変更するためのサポートはありません。アーカイブからファイルを追加または削除するには、アーカイブ全体を再作成する必要があります。

2011年7月17日日曜日

Erlang zip unzip sample サンプル

解凍・圧縮のサンプルを貼っておきます。
カレントディレクトリにある「auiTest.erl」というファイルを「ngs.zip」という名前の圧縮ファイルにし、圧縮に成功した場合、そのファイルを解凍する。

解凍時には、カレントディレクトリの同ファイルに上書き保存される。

ソース:

-module(zipTest).
-include_lib("wx.hrl").

-export([start/0]).

start() ->
    myzip().

myzip() ->
 
    case zip:zip(ngs.zip,["auiTest.erl"]) of
{ok,ngs.zip} -> ok,
zip:unzip("ngs.zip");
{error,Reason} -> io:format("Reason:~p~n",[Reason])
    end.

Erlang filename dirname 取得する

ソース内に直書きしたディレクトリ名の配下にあるファイル名およびディレクトリ名を表示するプログラムを書いた。
ファイル名に日本語があると落ちるけど。

ソース:

-module(filelibTest).
-include_lib("wx.hrl").

-export([start/0]).

start() ->
    % get file name
    Files = filelib:wildcard("C:/Users/andre/erlwork/*"),
    % print file name
    print(Files).

print([]) ->
    io:format("ok~n");
print([File|Files]) ->
    Filename = filename:basename(File),
    io:format("filename:~ts~n",[Filename]),
    print(Files).


wxErlang wxListCtrl Sample2 サンプル2 1x2に文字列をセットする。

前回の記事で、wxListCtrlの中に、縦にItemおよび文字列をセットするものはできた。
しかし、ほしいものは横にセットするものだった。
それができたので、貼っておく。

画像:

ソース:

-module(listCtrlTest).
-include_lib("wx.hrl").

-export([start/0]).

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

create_window(Wx)->  
    %% Create Frame
    Frame = wxFrame:new(Wx,
 -1,
 "wxListCtrl and wxListItem Example",
 %%[{size,{300,200}}]),
 [{size,{-1,-1}}]),

    % Create wxListCtrl
    ListCtrl = wxListCtrl:new(Frame,[{style,?wxLC_REPORT bor ?wxLC_HRULES}]),
    %ListCtrl = wxListCtrl:new(Frame,[{style,?wxLC_LIST}]),

    % Set Column Name
    Option = [{format,?wxLIST_FORMAT_LEFT}],
    Col0 = wxListCtrl:insertColumn(ListCtrl,0,"Column0",Option),
    Col1 = wxListCtrl:insertColumn(ListCtrl,1,"Column1",Option),

    % Create wxListItem
    Item1 = wxListItem:new(),
    wxListItem:setText(Item1,"Item1"),
    %wxListItem:setColumn(Item1,0),

    % Create wxListItem
    Item2 = wxListItem:new(),
    wxListItem:setText(Item2,"Item2"),
    %wxListItem:setColumn(Item2,0),

    % Insert Item to List
    %wxListCtrl:insertItem(ListCtrl,Item1),
    Index = wxListCtrl:insertItem(ListCtrl,Col0,"Item1s"),
    %wxListCtrl:insertItem(ListCtrl,Item2),
    %wxListCtrl:insertItem(ListCtrl,Col1,"Item2s"),
    wxListCtrl:setItem(ListCtrl,Index,Col1,"Item2s"),
 
    %% Set Connect Close
    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.

wx.hrlはErlangのインストールディレクトリにある。検索してください。
それを本ソースと同一ディレクトリに配置してください。

参考:
How to add value to second column using wxListCtrl in wxWidgets (C++ code)?? - Stack Overflow : http://stackoverflow.com/questions/2962057/how-to-add-value-to-second-column-using-wxlistctrl-in-wxwidgets-c-code

2011年7月16日土曜日

wxErlang wxGrid Sample サンプル

いつもの通りサンプルを貼っておきます。

画面:


ソース:

-module(gridTest).
-include_lib("wx.hrl").

-export([start/0]).

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

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

    Grid = wxGrid:new(Frame,?wxID_ANY),
    Row = 2,
    Col = 2,
    wxGrid:createGrid(Grid,Row,Col),
    wxGrid:appendRows(Grid,[{numRows,2}]),
    wxGrid:appendCols(Grid,[{numCols,2}]),

    wxGrid:setCellValue(Grid,{2,2},"2x2"),
    wxGrid:setCellValue(Grid,{3,3},"3x3"),
 
    %% Set Connect Close
    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.

wx.hrlはErlangのインストールディレクトリにあるので、検索してください。
そして、本ソースと同一ディレクトリに配置してください。

参考:
2007-11-23 - 理想のユーザ・インターフェイスを求めて : http://d.hatena.ne.jp/Megumi221/20071123

wxErlang wxListCtrl Sample サンプル

このサンプルが役に立つとは思えない。
wxErlangの使用例がないし、貼っておく。

動作画面:

ソース:

-module(listCtrlTest).
-include_lib("wx.hrl").

-export([start/0]).

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

create_window(Wx)->  
    %% Create Frame
    Frame = wxFrame:new(Wx,
 -1,
 "wxListCtrl and wxListItem Example",
 %%[{size,{300,200}}]),
 [{size,{-1,-1}}]),

    % Create wxListCtrl
    ListCtrl = wxListCtrl:new(Frame,[{style,?wxLC_REPORT}]),

    % Set Column Name
    Option = [{format,?wxLIST_FORMAT_LEFT}],
    wxListCtrl:insertColumn(ListCtrl,0,"Column0",Option),
    wxListCtrl:insertColumn(ListCtrl,1,"Column1",Option),

    % Create wxListItem
    Item1 = wxListItem:new(),
    wxListItem:setText(Item1,"Item1"),
    wxListItem:setColumn(Item1,0),

    % Create wxListItem
    Item2 = wxListItem:new(),
    wxListItem:setText(Item2,"Item2"),
    wxListItem:setColumn(Item2,0),

    % Insert Item to List
    wxListCtrl:insertItem(ListCtrl,Item1),
    %wxListCtrl:setItem(ListCtrl,Item1),
    wxListCtrl:insertItem(ListCtrl,Item2),
    %wxListCtrl:setItem(ListCtrl,Item2),  
 
    %% Set Connect Close
    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.

本当は、左から右へItemを並べたかったけど、どうもできないらしい。
Itemは一行に一個で、Column2に何か表示させたければ、SetItemとかするのだと思う。
今度やってみる。

参考:
wxListCtrlで作成した表の値を編集 - 理想のユーザ・インターフェイスを求めて : http://d.hatena.ne.jp/Megumi221/20100225/1267592869

2011年7月10日日曜日

Windows Vistaでファイル名とファイル内文字列検索する方法

くそったれVistaでは初期設定で、インデックスが作成されている場所では、ファイル名とファイル内文字列が検索対象である。インデックスが作成されていない場所では、ファイル名のみ検索対象だ。

まさにダメ。これはWindows 7でも同じ気がする。

解決方法が下記URLでできる。参照あれ。
Windows Vista ファイル内容(文字列)検索 : http://ratan.dyndns.info/vista/kennsaku.html

俺はこれでもできなかったけど。どうすればいいんだ・・・


wxErlang wxChoice wxSpinCtrl wxListBox Sample サンプル

当初、wxErlangを勉強していたきっかけは、飛行機本のチャットのGUIをwxErlangで書き換えることだった。しかし、今やwxErlangのサンプルを貼ることが目的になってしまっている。

Erlangで何かツールを作ってみようと思っているので、今度からサンプルも貼りつつ、ツールの作成にも着手していく。

今回のソースはリストボックスとかその周辺のもの。

ソース:

-module(choicesTest).
-include_lib("wx.hrl").

-export([start/0]).

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

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

    %% Create Panel
    Panel = wxScrolledWindow:new(Parent, []),

    %% Setup sizers
    MainSizer = wxBoxSizer:new(?wxVERTICAL),
    ListBoxSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel,
[{label, "wxListBox"}]),

    ChoiceSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel,
[{label, "wxChoice"}]),
    SpinSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel,
    [{label, "wxSpinCtrl"}]),
    ComboSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel,
    [{label, "wxComboBox"}]),
    Sizer = wxBoxSizer:new(?wxHORIZONTAL),
    Sizer3  = wxBoxSizer:new(?wxHORIZONTAL),

    Choices = ["one","two","three",
      "four","five","six",
      "seven","eight","nine",
      "ten", "eleven", "twelve"],

    %% Create a wxListBox that uses multiple selection
    ListBox = wxListBox:new(Panel, 1, [{size, {-1,100}},
      {choices, ["Multiple selection"|Choices]},
      {style, ?wxLB_MULTIPLE}]),
    wxListBox:setToolTip(ListBox, "A wxListBox with multiple selection"),

    %% Create a wxListBox that uses single selection
    ListBox2 = wxListBox:new(Panel, 2, [{size, {-1,100}},
{choices, ["Single selection"|Choices]},
{style, ?wxLB_SINGLE}]),
    wxListBox:setToolTip(ListBox2, "A wxListBox with single selection"),

    %% Create a wxChoice
    Choice = wxChoice:new(Panel, 4, [{choices, Choices}]),
    wxChoice:setToolTip(Choice, "A wxChoice"),

    %% Create a wxSpinCtrl with range between 0 and 100
    SpinCtrl = wxSpinCtrl:new(Panel, []),
    wxSpinCtrl:setRange(SpinCtrl, 0, 100),
    wxSpinCtrl:setToolTip(SpinCtrl, "A wxSpinCtrl with range from 0 to 100"),

    %% Create a wxComboBox and set the value to "Default value"
    ComboBox = wxComboBox:new(Panel, 5, [{choices, Choices}]),
    wxComboBox:setToolTip(ComboBox, "A wxComboBox"),


    wxChoice:connect(Choice,command_choice_selected),
    wxSpinCtrl:connect(SpinCtrl,command_spinctrl_updated),
    wxComboBox:connect(ComboBox, command_combobox_selected),


    %% Add to sizers
    Options = [{border,4}, {flag, ?wxALL}],
    wxSizer:add(Sizer, ListBox, Options),
    wxSizer:add(Sizer, ListBox2, Options),

    wxSizer:add(ChoiceSizer, Choice, Options),
    wxSizer:add(SpinSizer, SpinCtrl, Options),
    wxSizer:add(Sizer3, ChoiceSizer, []),
    wxSizer:add(Sizer3, SpinSizer, [{border, 4}, {flag, ?wxLEFT}]),

    wxSizer:add(ComboSizer, ComboBox, Options),

    wxSizer:add(ListBoxSizer, Sizer, Options),
    wxSizer:add(MainSizer, ListBoxSizer, Options),
    wxSizer:add(MainSizer, Sizer3, Options),
    wxSizer:add(MainSizer, ComboSizer, Options),

    wxScrolledWindow:setScrollRate(Panel, 5, 5),
    wxPanel:setSizer(Panel, MainSizer),

    %% Set Connect Close
    wxFrame:connect(Parent, close_window),

    Parent.

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

2011年7月8日金曜日

wxErlang wxTreeCtlr Sample サンプル

ツリーのサンプル。

ソース:

-module(wxTreeCtrlTest).
-include_lib("wx.hrl").

-export([start/0]).

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

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

    %% Create Panel
    %%Panel1 = wxPanel:new(Frame),
    Panel = wxPanel:new(Frame, []),

    %% Setup sizers
    MainSizer = wxBoxSizer:new(?wxVERTICAL),
    Sizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel,
[{label, "wxTreeCtrl"}]),

    %% Setup treeCtrl
    TreeCtrl = wxTreeCtrl:new(Panel, []),
    RootId = wxTreeCtrl:addRoot(TreeCtrl, "Root"),
    %% Name the first items
    Items = ["item "++integer_to_list(Int)||
Int <- lists:seq(1,10)],
    %% Create the first items in the treeCtrl
    SubItems = [{wxTreeCtrl:appendItem(TreeCtrl, RootId, Item), Item}||
  Item <- Items],
    %% Create sub items
    [wxTreeCtrl:appendItem(TreeCtrl, ItemId, Item++" sub item "++integer_to_list(Int))||
{ItemId, Item} <- SubItems, Int <- lists:seq(1,10)],
    wxTreeCtrl:expand(TreeCtrl, RootId),

    %% Add to sizers
    Options = [{flag, ?wxEXPAND}, {proportion, 1}],
    wxSizer:add(Sizer, TreeCtrl, Options),
    wxSizer:add(MainSizer, Sizer, Options),

    wxTreeCtrl:connect(TreeCtrl, command_tree_item_collapsed),
    wxTreeCtrl:connect(TreeCtrl, command_tree_item_expanded),
    wxTreeCtrl:connect(TreeCtrl, command_tree_sel_changed),
    wxPanel:setSizer(Panel, MainSizer),
        %% Set Connect Close
    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.

2011年7月3日日曜日

wxErlang wxAui と wxNotebook Sample サンプル

Erlangインストールディレクトリ配下にあるdemoディレクトリのex_aui.erlを参考に作ったものを載せる。
wxAuiとwxBoxSizerを混ぜたものである。


ソース:

-module(auiandboxTest).
-include_lib("wx.hrl").

-export([start/0]).

-define(pi, wxAuiPaneInfo).

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

create_window(Wx)->  
    %% Create Frame
    Frame = wxFrame:new(Wx,
 -1,
 "Aui and BoxSizer Example",
 %%[{size,{300,200}}]),
 [{size,{-1,-1}}]),

    %% Create Panel
    %%Panel1 = wxPanel:new(Frame),
     Panel = wxPanel:new(Frame, []),

    %% Setup sizers
    MainSizer = wxBoxSizer:new(?wxVERTICAL),

%% Create AuiManager
    Manager = wxAuiManager:new([{managed_wnd, Panel}
]),

%% Create wxAuiPaneInfo
    Pane = ?pi:new(),
    ?pi:closeButton(Pane),
    ?pi:right(Pane),
    ?pi:dockable(Pane, [{b, true}]),
    ?pi:floatingSize(Pane, 300,200),
    ?pi:minSize(Pane, {50,50}),
    ?pi:paneBorder(Pane),
    ?pi:floatable(Pane, [{b, true}]),

%% Create Pane Clone?
    create_pane(Panel, Manager, Pane),
    create_pane(Panel, Manager,
?pi:caption(?pi:top(?pi:new(Pane)), "One")),
    create_pane(Panel, Manager,
?pi:caption(?pi:left(?pi:new(Pane)), "two")),
    create_pane(Panel, Manager,
?pi:caption(?pi:bottom(?pi:new(Pane)), "Three")),
    create_pane(Panel, Manager,
?pi:caption(?pi:centre(?pi:new(Pane)), "Four")),

    wxPanel:setSizer(Panel, MainSizer),

    wxAuiManager:connect(Manager, aui_pane_button, [{skip,true}]),
    wxAuiManager:connect(Manager, aui_pane_maximize, [{skip,true}]),
    wxAuiManager:update(Manager),

    %% Set Connect Close
    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.

create_pane(Parent, Manager, Pane) ->
    TextCtrl = wxTextCtrl:new(Parent, ?wxID_ANY, [{size, {300,200}},
 {value, "An empty pane"},
 {style, 0
  bor ?wxDEFAULT
  bor ?wxTE_MULTILINE}]),
    wxAuiManager:addPane(Manager, TextCtrl, Pane),
    TextCtrl.
   
wx.hrlはErlangのインストールディレクトリ内にあるものを使用している。検索をかけて見つけて。
それを本ソースと同一ディレクトリに配置する。

サンプルが長くなっていく。

wxErlang wxNotebook Sample サンプル

wxNotebookについては、wxWidgetsではこんな感じに記述されている。
「このクラスは、関連するタブで複数のウィンドウを管理するノートブックのコントロールを表します。」



ソース:
-module(notebookTest).
-include_lib("wx.hrl").

-export([start/0]).

-define(pi, wxAuiPaneInfo).

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

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

    %% Create Panel
    %%Panel1 = wxPanel:new(Frame),
     Panel = wxPanel:new(Frame, []),

%% Create AuiManager
    Manager = wxAuiManager:new([{managed_wnd, Panel}
]),

%% Create wxAuiPaneInfo
    Pane = ?pi:new(),
    ?pi:closeButton(Pane),
    %?pi:right(Pane),
    ?pi:dockable(Pane, [{b, true}]),
    ?pi:floatingSize(Pane, 300,200),
    ?pi:minSize(Pane, {50,50}),
    ?pi:paneBorder(Pane),
    ?pi:floatable(Pane, [{b, true}]),

    ?pi:centrePane(Pane),

    %Pane2 = wxAuiPaneInfo:new(Pane),
    %?pi:centrePane(Pane2),
    
    %% Create Pane2 Clone?
    create_notebook(Panel, Manager, Pane),

    wxAuiManager:connect(Manager, aui_pane_button, [{skip,true}]),
    wxAuiManager:connect(Manager, aui_pane_maximize, [{skip,true}]),
    wxAuiManager:update(Manager),

    %% Set Connect Close
    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.

create_notebook(Parent, Manager, Pane) ->
    Style = (0
    bor ?wxAUI_NB_DEFAULT_STYLE
    bor ?wxAUI_NB_TOP
    bor ?wxAUI_NB_WINDOWLIST_BUTTON
    bor ?wxAUI_NB_CLOSE_ON_ACTIVE_TAB
    bor ?wxAUI_NB_TAB_MOVE
    bor ?wxAUI_NB_SCROLL_BUTTONS
   ),
    
    Notebook = wxAuiNotebook:new(Parent, [{style, Style}]),

    Tab1 = wxPanel:new(Notebook, []),
    wxPanel:setBackgroundColour(Tab1, ?wxBLACK),
    wxButton:new(Tab1, ?wxID_ANY, [{label,"New tab"}]),
    wxAuiNotebook:addPage(Notebook, Tab1, "You can", []),

    Tab2 = wxPanel:new(Notebook, []),
    wxPanel:setBackgroundColour(Tab2, ?wxRED),
    wxButton:new(Tab2, ?wxID_ANY, [{label,"New tab"}]),
    wxAuiNotebook:addPage(Notebook, Tab2, "rearrange", []),

    Tab3 = wxPanel:new(Notebook, []),
    wxPanel:setBackgroundColour(Tab3, ?wxGREEN),
    wxButton:new(Tab3, ?wxID_ANY, [{label,"New tab"}]),
    wxAuiNotebook:addPage(Notebook, Tab3, "these tabs", []),

    wxAuiManager:addPane(Manager, Notebook, Pane),

    wxAuiNotebook:connect(Notebook, command_button_clicked),
    wxAuiNotebook:connect(Notebook, command_auinotebook_page_close, [{skip, false}]),
    wxAuiNotebook:connect(Notebook, command_auinotebook_page_changed),
    Notebook.
    
    
wx.hrlはErlangのインストールディレクトリ配下を検索すると、みつかる。
本ソースと同一ディレクトリに配置する。
本サンプルはErlangインストールディレクトリ配下にあるdemoディレクトリのex_aui.erlを参考にしている。いや、ほぼ同じである。

「New Tab」ボタンを押下しても何も起きないので注意。

wxErlang wxAui Sample サンプル

wxAuiを使ったサンプルを作った。Erlangのインストールディレクトリにあるdemoのex_aui.erlから画面部分を抜粋したものだ。
wxAuiは画面?をドッキングする機能みたい。
以下を参照。
にょろぷにらん | wxPythonのwx.aui : http://mag.matrix.jp/mag/queen/log/soft/eid358.html

「One」の部分をクリックしたまま移動させると、画面がポッと出てきて、他の部分に移動させることができる。すげーな。


ソース:

-module(auiTest).
-include_lib("wx.hrl").

-export([start/0]).

-define(pi, wxAuiPaneInfo).

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

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

    %% Create Panel
    %%Panel1 = wxPanel:new(Frame),
     Panel = wxPanel:new(Frame, []),

    %% Setup sizers
    MainSizer = wxBoxSizer:new(?wxVERTICAL),

%% Create AuiManager
    Manager = wxAuiManager:new([{managed_wnd, Panel}
]),

%% Create wxAuiPaneInfo
    Pane = ?pi:new(),
    ?pi:closeButton(Pane),
    ?pi:right(Pane),
    ?pi:dockable(Pane, [{b, true}]),
    ?pi:floatingSize(Pane, 300,200),
    ?pi:minSize(Pane, {50,50}),
    ?pi:paneBorder(Pane),
    ?pi:floatable(Pane, [{b, true}]),

%% Create Pane Clone?
    create_pane(Panel, Manager, Pane),
    create_pane(Panel, Manager,
?pi:caption(?pi:top(?pi:new(Pane)), "One")),
    create_pane(Panel, Manager,
?pi:caption(?pi:left(?pi:new(Pane)), "two")),
    create_pane(Panel, Manager,
?pi:caption(?pi:bottom(?pi:new(Pane)), "Three")),
    Pane2 = wxAuiPaneInfo:new(Pane),
    ?pi:centrePane(Pane2),
   
    %% Create Pane2 Clone?
    create_notebook(Panel, Manager, ?pi:new(Pane2)),

    wxPanel:setSizer(Panel, MainSizer),

    wxAuiManager:connect(Manager, aui_pane_button, [{skip,true}]),
    wxAuiManager:connect(Manager, aui_pane_maximize, [{skip,true}]),
    wxAuiManager:update(Manager),

    %% Set Connect Close
    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.

create_notebook(Parent, Manager, Pane) ->
    Style = (0
    bor ?wxAUI_NB_DEFAULT_STYLE
    bor ?wxAUI_NB_TOP
    bor ?wxAUI_NB_WINDOWLIST_BUTTON
    bor ?wxAUI_NB_CLOSE_ON_ACTIVE_TAB
    bor ?wxAUI_NB_TAB_MOVE
    bor ?wxAUI_NB_SCROLL_BUTTONS
   ),
   
    Notebook = wxAuiNotebook:new(Parent, [{style, Style}]),

    Tab1 = wxPanel:new(Notebook, []),
    wxPanel:setBackgroundColour(Tab1, ?wxBLACK),
    wxButton:new(Tab1, ?wxID_ANY, [{label,"New tab"}]),
    wxAuiNotebook:addPage(Notebook, Tab1, "You can", []),

    Tab2 = wxPanel:new(Notebook, []),
    wxPanel:setBackgroundColour(Tab2, ?wxRED),
    wxButton:new(Tab2, ?wxID_ANY, [{label,"New tab"}]),
    wxAuiNotebook:addPage(Notebook, Tab2, "rearrange", []),

    Tab3 = wxPanel:new(Notebook, []),
    wxPanel:setBackgroundColour(Tab3, ?wxGREEN),
    wxButton:new(Tab3, ?wxID_ANY, [{label,"New tab"}]),
    wxAuiNotebook:addPage(Notebook, Tab3, "these tabs", []),

    wxAuiManager:addPane(Manager, Notebook, Pane),

    wxAuiNotebook:connect(Notebook, command_button_clicked),
    wxAuiNotebook:connect(Notebook, command_auinotebook_page_close, [{skip, false}]),
    wxAuiNotebook:connect(Notebook, command_auinotebook_page_changed),
    Notebook.


create_pane(Parent, Manager, Pane) ->
    TextCtrl = wxTextCtrl:new(Parent, ?wxID_ANY, [{size, {300,200}},
 {value, "An empty pane"},
 {style, 0
  bor ?wxDEFAULT
  bor ?wxTE_MULTILINE}]),
    wxAuiManager:addPane(Manager, TextCtrl, Pane),
    TextCtrl.
   
   
wx.hrlはErlangのインストールディレクトリ内にあるものを使用。本ソースと同一ディレクトリに配置。
ソースをブログに貼ると長いな。