是否有必要为wxErlang小部件创建ID?

nmi*_*els 3 erlang wxwidgets wxerlang

我一直在探索Erlang的wx模块和教程.我之前没有使用过wxwidgets,所以也许这就是它的完成方式,但这段代码对我来说真的很糟糕:

%% create widgets
    T1001 = wxTextCtrl:new(Panel, 1001,[]),
    ST2001 = wxStaticText:new(Panel, 2001,"Output Area", []),
    B101  = wxButton:new(Panel, 101, [{label, "&Countdown"}]),
    B102  = wxButton:new(Panel, ?wxID_EXIT, [{label, "E&xit"}]),
    wxFrame:show(Frame),
Run Code Online (Sandbox Code Playgroud)

人们是否真的必须在创建小部件时为其分配小部件ID?在窗口小部件ID之后命名指向窗口小部件的变量是否正常?

VZ.*_*VZ. 8

我不知道Erlang,但是在C++中(以及我所知道的其他绑定),通常最好使用wxID_ANYwidget ID,这意味着你不关心它的特定值,然后Connect()用来处理来自的小部件.如果您需要稍后通过其ID找到窗口小部件(尽管您也可以使用窗口小部件名称),或者如果您需要连续的ID范围(例如,使用ID 100,101,...,那么显式ID)可能很方便. ..,109用于计算器的按钮,因为您可以轻松地从其ID中推导出每个按钮值,但不需要总是使用它们.

至于命名,当然,没有必要使用这个奇怪的约定(快速查看教程表明它是作者的个人偏好 - 不用说,我不分享).


3le*_*gos 5

与上面提到的VZ一样,如果您不需要稍后通过其id查找窗口小部件,则可以使用wxID_ANY.

但是,我认为不仅在ids之后命名变量是不正常的,而且这样做是一个非常糟糕的主意.根据变量的含义命名变量,而不是使用一些模糊的id.

此外,您最好定义所需的ID并为其指定正确的(语义)名称,以便它们只在一个地方定义,以后您可以轻松更改ID而不会影响您的程序,如下所示:

-define(ID_TEXT_CTRL, 1001).
-define(ID_OUTPUT_AREA, 2001).
-define(ID_COUNTDOWN_BUTTON, 101).
-define(ID_EXIT_BUTTON, ?wxID_EXIT).

TextCtrl = wxTextCtrl:new(Panel, ?ID_TEXT_CTRL,[]),
OutputArea = wxStaticText:new(Panel, ?ID_OUTPUT_AREA,"Output Area", []),
CountdownButton  = wxButton:new(Panel, ?ID_COUNTDOWN_BUTTON, [{label, "&Countdown"}]),
ExitButton  = wxButton:new(Panel, ?ID_EXIT_BUTTON, [{label, "E&xit"}])
Run Code Online (Sandbox Code Playgroud)

您可以将定义放在.erl文件中(如果只有一个),或者放在.hrl文件中,您必须将这些定义包含在所有与GUI相关的.erl文件中.