从WXTEXTCRL中获取数值 我正在学习WxWiWeDes,而不是WxPython,实际的C++库。 我用wxtxtctrl绑定双变量时遇到了麻烦。据我所知,应该通过wxValidator模板完成

从WXTEXTCRL中获取数值 我正在学习WxWiWeDes,而不是WxPython,实际的C++库。 我用wxtxtctrl绑定双变量时遇到了麻烦。据我所知,应该通过wxValidator模板完成,c++,wxwidgets,wxtextctrl,C++,Wxwidgets,Wxtextctrl,这里是一个示例代码,我想在其中保存一个数组并编辑5个不同的双精度。要从值切换到值,我使用wxComboBox。主要问题是此代码在调用TransferDataFromWindow()函数时不更新双变量tracable,并且在调用TransferDataToWindow()函数时不读取此变量的值 #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include

这里是一个示例代码,我想在其中保存一个数组并编辑5个不同的双精度。要从值切换到值,我使用
wxComboBox
。主要问题是此代码在调用
TransferDataFromWindow()
函数时不更新双变量
tracable
,并且在调用
TransferDataToWindow()
函数时不读取此变量的值

#include "wx/wxprec.h"

#ifdef __BORLANDC__
    #pragma hdrstop
#endif

#ifndef  WX_PRECOMP
  #include "wx/wx.h"
#endif //precompiled headers

#include "wx/log.h"
#include "wx/config.h"
#include "wx/splitter.h"
#include "wx/sizer.h"
#include <wx/spinctrl.h>
#include <wx/grid.h>

//#ifndef wxHAS_IMAGES_IN_RESOURCES
    //#include "../sample.xpm"
//#endif

class FMApp: public wxApp
{
public:
  virtual bool OnInit();
  virtual int OnExit();
};

IMPLEMENT_APP(FMApp)


class FMWnd: public wxFrame
{
public:
    FMWnd();
    virtual ~FMWnd();

    // callbacks
    void OnQuit(wxCommandEvent& event);
    void OnAbout(wxCommandEvent& event);
    void OnSelectDB(wxCommandEvent& event);

private:

    uint        nTrackers;
    double      tracable;
    double      *allTrac;
    int         curTrackers;

    //=== LIFE ===//
    wxTextCtrl *lInTrac;
    wxComboBox *lTrac;

    /*inner functions*/
    void onTrackerChange( wxCommandEvent &);

    wxDECLARE_EVENT_TABLE();
};

enum{
    ID_TRACK= wxID_HIGHEST,
    ID_UNIT,
    //------- EVENTS -------//
    SELECT_TRANS,
    ID_ADD_TRACKABLE,
    FM_LAST
};

bool FMApp::OnInit()
{
    if ( !wxApp::OnInit() ) return false;
    SetVendorName(wxT("TEST"));
    SetAppName(wxT("---"));

    FMWnd *frame = new FMWnd;
    frame->Show(true);

    return true;
}

int FMApp::OnExit()
{
    return 0;
}




#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "wx/datetime.h"
#include "wx/colour.h"
#include "wx/notebook.h"
#include "wx/valgen.h"
#include "wx/valnum.h"



wxBEGIN_EVENT_TABLE(FMWnd, wxFrame)
  EVT_MENU(wxID_EXIT, FMWnd::OnQuit)
  EVT_MENU(wxID_ABOUT, FMWnd::OnAbout)
  EVT_COMBOBOX(ID_TRACK, FMWnd::onTrackerChange)
wxEND_EVENT_TABLE()


FMWnd::FMWnd()
    : wxFrame((wxFrame *) NULL, wxID_ANY, wxT("- TEST -"),
        wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE|wxWS_EX_VALIDATE_RECURSIVELY
        )
{
    // menu
    wxMenu *file_menu = new wxMenu;
    file_menu->AppendSeparator();
    file_menu->Append(wxID_EXIT, wxT("E&xit\tAlt-X"), wxT("Exit the program"));
    wxMenuBar *menu_bar = new wxMenuBar;
    menu_bar->Append(file_menu, wxT("&File"));
    SetMenuBar(menu_bar);

    // child controls
    wxPanel* p = new wxPanel(this, wxID_ANY);
    wxBoxSizer *lAmExDlg = new wxBoxSizer( wxHORIZONTAL );
    lAmExDlg->Add(lTrac = new wxComboBox(p,ID_TRACK),0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL| wxFIXED_MINSIZE, 3);
    lTrac->Append(wxT("---"));
    lTrac->Append(wxT("-1-"));
    lTrac->Append(wxT("-2-"));
    lTrac->Append(wxT("-3-"));
    lTrac->Append(wxT("-4-"));
    lTrac->Append(wxT("-5-"));
    lTrac->SetSelection(0l);
    lTrac->SetEditable(false);
    lAmExDlg->Add(lInTrac = new wxTextCtrl(p,wxID_ANY, wxT(""),wxDefaultPosition,wxDefaultSize,wxTE_LEFT, 
            wxMakeFloatingPointValidator(3,&tracable,wxNUM_VAL_THOUSANDS_SEPARATOR |wxNUM_VAL_NO_TRAILING_ZEROES)),
            4, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 3);

    wxBoxSizer *lTopSizer = new wxBoxSizer( wxVERTICAL );
    lTopSizer->Add(lAmExDlg, 1, wxEXPAND );
    p->SetSizer(lTopSizer);

    wxBoxSizer* topSizer = new wxBoxSizer(wxHORIZONTAL);
    topSizer->SetMinSize(250, 100);
    topSizer->Add(p, 1, wxEXPAND);
    SetSizerAndFit(topSizer);

    curTrackers = -1;
    tracable = 20.0;
    nTrackers = 5;
    allTrac = new double[nTrackers];
    for(int cnt=0; cnt<nTrackers; ++cnt)allTrac[cnt] = 0.0;
    if (TransferDataToWindow())fprintf(stderr,"Cannot Transefer Data to Windows\n");
//  lInTrac->TransferDataToWindow();
}

void FMWnd::OnQuit(wxCommandEvent&)
{
    Close(true);
}

void FMWnd::OnAbout(wxCommandEvent&)
{
    wxMessageBox(wxT("wxConfig demo\n(c) 1998-2001 Vadim Zeitlin"), wxT("About"),
                 wxICON_INFORMATION | wxOK);
}

FMWnd::~FMWnd()
{
    delete[] allTrac;
}

void FMWnd::onTrackerChange(wxCommandEvent& event){
    TransferDataFromWindow();
    lInTrac->TransferDataFromWindow();
    if(curTrackers >= 0){
        allTrac[curTrackers]=tracable;
        printf("Tr:%d Var:%g Val:%g\n",curTrackers,allTrac[curTrackers],tracable);
    }
    if (event.GetSelection() == 0){
        tracable = 0.;
        curTrackers = -1;
        lInTrac->SetValue("0.0");
        printf("Reset Tracker\n");
    } else {
        curTrackers = event.GetSelection() - 1;
        tracable = allTrac[curTrackers];
        TransferDataToWindow();
        lInTrac->TransferDataToWindow();
        printf("Set Tracker to %d\n",curTrackers);
    }

}
#包括“wx/wxprec.h”
#ifdef__BORLANDC__
#布拉格语hdrstop
#恩迪夫
#ifndef WX_预压缩
#包括“wx/wx.h”
#endif//预编译头
#包括“wx/log.h”
#包括“wx/config.h”
#包括“wx/splitter.h”
#包括“wx/sizer.h”
#包括
#包括
//#ifndef wxHAS\u图像\u在\u资源中
//#包括“./sample.xpm”
//#恩迪夫
类别FMApp:公共wxApp
{
公众:
虚拟bool-OnInit();
虚拟int-OnExit();
};
执行应用程序(FMApp)
类FMWnd:公共wxFrame
{
公众:
FMWnd();
虚拟~FMWnd();
//回调
退出时作废(wxCommandEvent&事件);
关于(wxCommandEvent&event)的无效;
选择数据库无效(wxCommandEvent&event);
私人:
uint-NTracker;
双重可追踪;
双*allTrac;
内特勒索者;
//==生活===//
wxTextCtrl*lInTrac;
wxComboBox*lTrac;
/*内部功能*/
无效交易(wxCommandEvent&);
wxDECLARE_事件_表();
};
枚举{
ID_轨道=wxID_最高,
身份证组,
//-------事件-------//
选择_TRANS,
ID\u添加\u可跟踪,
最后
};
bool FMApp::OnInit()
{
如果(!wxApp::OnInit())返回false;
SetVendorName(wxT(“测试”));
SetAppName(wxT(“--”);
FMWnd*帧=新FMWnd;
帧->显示(真);
返回true;
}
int-FMApp::OnExit()
{
返回0;
}
#包括
#包括
#包括
#包括“wx/datetime.h”
#包括“wx/color.h”
#包括“wx/notebook.h”
#包括“wx/valgen.h”
#包括“wx/valnum.h”
wxBEGIN_事件_表(FMWnd,wxFrame)
EVT_菜单(wxID_退出,FMWnd::OnQuit)
EVT_菜单(wxID_关于,FMWnd::OnAbout)
EVT\U组合框(ID\U轨道,FMWnd::onTrackerChange)
wxEND_事件_表()
FMWnd::FMWnd()
:wxFrame((wxFrame*)NULL,wxID_ANY,wxT(“-TEST-”),
wxDefaultPosition、wxDefaultSize、wxDEFAULT_FRAME_STYLE | wxWS_EX_VALIDATE_递归
)
{
//菜单
wxMenu*文件菜单=新建wxMenu;
文件菜单->附件分隔符();
文件菜单->附加(wxID\u退出,wxT(“E&xit\tAlt-X”),wxT(“退出程序”);
wxMenuBar*菜单栏=新的wxMenuBar;
菜单栏->附加(文件菜单,wxT(“&file”);
设置菜单栏(菜单栏);
//子控件
wxPanel*p=新的wxPanel(这个,wxID_ANY);
wxBoxSizer*lAmExDlg=新的wxBoxSizer(wxHORIZONTAL);
lAmExDlg->Add(lTrac=新的wxComboBox(p,ID_轨道),0,wxALIGN_中心_垂直| wxALIGN_中心_水平| wxFIXED_最小尺寸,3);
lTrac->Append(wxT(“--”);
lTrac->Append(wxT(“-1-”);
lTrac->Append(wxT(“-2-”);
lTrac->Append(wxT(“-3-”);
lTrac->Append(wxT(“-4-”);
lTrac->Append(wxT(“-5-”);
lTrac->SetSelection(0l);
lTrac->SetEditable(假);
lAmExDlg->Add(lInTrac=new wxTextCtrl(p,wxID_ANY,wxT(“”),wxDefaultPosition,wxDefaultSize,wxTE_LEFT,
wxMakeFloatingPointValidator(3,&可跟踪,wxNUM_VAL_数千_分隔符| wxNUM_VAL_NO_training_zero)),
4,wxALIGN_中心_垂直| wxALIGN_中心_水平,3);
wxBoxSizer*lTopSizer=新的wxBoxSizer(wxVERTICAL);
lTopSizer->Add(lAmExDlg,1,wxEXPAND);
p->设置器(lTopSizer);
wxBoxSizer*顶置器=新的wxBoxSizer(WX水平);
顶置器->设置尺寸(250100);
顶置器->添加(p,1,wxEXPAND);
设置施胶剂(顶部施胶剂);
curTrackers=-1;
可追踪=20.0;
nTrackers=5;
allTrac=新的双[nTracker];
对于(int cnt=0;cntTransferDataToWindows();
}
void FMWnd::OnQuit(wxCommandEvent&)
{
接近(真);
}
void FMWnd::OnAbout(wxCommandEvent&)
{
wxMessageBox(wxT(“wxConfig demo\n(c)1998-2001 Vadim Zeitlin”),wxT(“About”),
wxICON|u信息| wxOK);
}
FMWnd::~FMWnd()
{
删除[]allTrac;
}
void FMWnd::onTrackerChange(wxCommandEvent&事件){
TransferDataFromWindow();
lInTrac->TransferDataFromWindow();
如果(curTrackers>=0){
allTrac[curTrackers]=可追踪;
printf(“Tr:%d Var:%g Val:%g\n”,curTrackers,allTrac[curTrackers],可跟踪);
}
if(event.GetSelection()==0){
可跟踪=0。;
curTrackers=-1;
lInTrac->SetValue(“0.0”);
printf(“重置跟踪器”);
}否则{
curTrackers=event.GetSelection()-1;
tracable=所有Trac[限行器];
TransferDataToWindow();
lInTrac->TransferDataToWindow();
printf(“将跟踪器设置为%d\n”,curTrackers);
}
}

调用
TransferDataFromWindow()
使用窗口子项的验证器而不是窗口本身来传输数据。您可以调用
lInTrac->GetValidator()->TransferFromWindow())
直接使当前代码工作,但事实上,将显式处理程序和验证器一起使用的整个想法是可疑的:如果您使用其中一种机制,而不是同时使用这两种机制,您的代码将更加清晰

也就是说,您需要为组合框使用一个(可能是自定义的)验证器,或者重写
FMWnd::Transfer{to,From}Window()
来处理这个组合框并完全删除
onTrackerChange()
,或者您应该使用
GetValue()直接从文本控件获取值
显式处理程序中的方法


如果您想要立即更新,后者是唯一的方法,因为使用validator实际上只与某种“应用”/“提交”按钮兼容。

谢谢您的回答。您能以您认为最好的方式更正我的代码并将其添加到