2009-09-01 107 views
0

我对erlang非常陌生,并且试图让我的脑袋围绕wxerlang,但是碰到了墙壁。有人可以看看这段代码,告诉我什么是错的。我认为这是非常明显的,但我无法解决。wxErlang - 这段代码有什么问题?


-module(main). 

-include_lib("include/wx.hrl"). 

-behavoiur(wx_object). 
-export([start/0]). %% API 
-export([init/1, handle_call/3, handle_event/2, handle_info/2, terminate/2]). %% Call Backs 

-record(state, {win, action}). 

-define(NEW_APP, 101). 

start() -> 
    wx_object:start(?MODULE, [], []). 

init(Options) -> 
    wx:new(Options), 
    Frame = wxFrame:new(wx:null(), ?wxID_ANY, "Rails IDE", [{size,{1000,500}}]), 

    MB = wxMenuBar:new(), 
    wxFrame:setMenuBar(Frame,MB), 
    File = wxMenu:new([]), 
    wxMenu:append(File, ?NEW_APP, "&New"), 
    wxMenu:append(File, ?wxID_EXIT, "&Quit"), 

    wxMenuBar:append(MB, File, "&File"), 

    wxFrame:connect(Frame, command_menu_selected), 

    _SB = wxFrame:createStatusBar(Frame,[]), 

    MainSplitter = wxSplitterWindow:new(Frame, []), 
    LeftSplitter = wxSplitterWindow:new(MainSplitter, []), 
    CenterSplitter = wxSplitterWindow:new(MainSplitter, []), 
    RightSplitter = wxSplitterWindow:new(MainSplitter, []), 
    BottomSplitter = wxSplitterWindow:new(MainSplitter, []), 

    wxSplitterWindow:setMinimumPaneSize(MainSplitter, 1), 
    wxSplitterWindow:setMinimumPaneSize(LeftSplitter, 1), 
    wxSplitterWindow:setMinimumPaneSize(CenterSplitter, 1), 
    wxSplitterWindow:setMinimumPaneSize(RightSplitter, 1), 
    wxSplitterWindow:setMinimumPaneSize(BottomSplitter, 1), 

    wxFrame:show(Frame), 

    State = #state{win=Frame}, 
    {Frame, State}. 

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

handle_call(Msg, _From, State) -> 
    io:format("Got Call ~p~n",[Msg]), 
    {reply,ok,State}. 

handle_event(#wx{id = Id, 
       event = #wxCommand{type = command_menu_selected}}, 
      State = #state{}) -> 
    case Id of 
     ?NEW_APP -> 
      Panel = newAppDialog(State#state.win), 
      {noreply, State#state{action=Panel}}; 
     ?wxID_EXIT -> 
      {stop, normal, State}; 
     _ -> 
      {noreply, State} 
    end; 

handle_event(Ev,State) -> 
    io:format("~p Got event ~p ~n",[?MODULE, Ev]), 
    {noreply, State}. 

terminate(_Reason, _State) -> 
    wx:destroy(). 


newAppDialog(Frame) -> 
    Panel = wxPanel:new(Frame, []), 

    %% Setup sizers 
    MainSizer = wxBoxSizer:new(?wxVERTICAL), 
    SubSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, [{label, "Create a new Rails app."}]), 

    Label1 = wxStaticText:new(Panel, 1, "App root"), 
    DirPicker = wxDirPickerCtrl:new(Panel, 2, 
            [{path, "/"}, 
            {style, ?wxDIRP_USE_TEXTCTRL}, 
            {message, "Select app root"}]), 
    Label2 = wxStaticText:new(Panel, 3, "App name"), 
    TextCtrl = wxTextCtrl:new(Panel, 4), 
    Button = wxButton:new(Panel, ?wxID_OK), 

    %% Add to sizers 
      PickerOptions = [{border, 4},{flag, ?wxALL bor ?wxEXPAND}], 
    wxSizer:add(SubSizer, Label1, PickerOptions), 
    wxSizer:add(SubSizer, DirPicker, PickerOptions), 
    wxSizer:add(SubSizer, Label2, PickerOptions), 
    wxSizer:add(SubSizer, TextCtrl, PickerOptions), 
    wxSizer:add(SubSizer, Button, PickerOptions), 

    SizerOptions = [{flag, ?wxEXPAND}], 
    wxSizer:add(MainSizer, SubSizer, SizerOptions), 

    wxWindow:connect(Panel, command_button_clicked), 
    wxPanel:setSizer(Panel, MainSizer), 
    wxSizer:layout(MainSizer), 
    Panel. 
+0

这可能有助于你得到实际的错误 – 2009-09-02 01:08:36

+1

你也可以尝试将代码缩减为一个较小的例子,它表现出同样的问题除了使其他人更容易回答你,这是一个很好的调试自己的技巧;一旦你消除了一切无关,其余代码中的问题可能会变得更加明显 – 2009-09-02 01:30:42

+0

我的问题在于handle_event/3的情况NEW_APP newAppDialog运行为一个新的进程并退出,但没有任何显示在框架中,主进程仍在运行,但将退回到命令行。 我很困惑,也许我已经跳到远处,并将采取在OTP的东西 – Damian 2009-09-02 08:21:44

回答

2

是否收到汇编错误?当它运行(我使用ERL 5.7.2在Mac OS X)

更改include_lib线

-include_lib("wx/include/wx.hrl"). 

有了它编译一个改变,我得到了一个空白窗口。这是你所期望的吗?

如果您是Erlang的新手,可能更容易从更直接的事情开始。理解wx_object手册页并不难,但是只有当你掌握了OTP并且先写了几个测试服务器的时候,我才会首先发表一些愚蠢的观点。一旦你在这一点上覆盖wx如何工作,这是一个更简单的步骤。在同一时间做这两个将是一个更大的挑战,但你的里程可能会有所不同,当然......!

+0

我经历了spawnlink的教程并且现在对erlang有了更好的理解,虽然我显然还有很长的路要走,但是谢谢你的建议。 http://spawnlink.com/articles/tag/erlybank/ – Damian 2009-09-06 02:15:36

+0

我还没有看到这些教程,感谢您的链接... – 2009-09-06 05:40:42

0

我意识到这是一个老问题,但我注意到,

-behaviour(wx_object)。

拼写错误。 (你的行为(wx_object))