- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个对话窗口,其中包含一些动态控件。基本上,在构建时我将一个指向结构的指针传递给它,在这个结构中是一个容器 std::pair<wxString,wxString>
.对于其中的每一个,我需要创建另一行三个控件,一个 wxTextCtrl
, wxChoice
和一个 wxButton
.
这部分有效,基于容器中的可用项目,我在对话框构建时成功创建了这些项目。我也用 wxTextValidator
连接 wxTextCtrl
第一个wxString
在这对。所以如果容器中有三对,我会有三个 wxTextCtrl
s 被创建,并且每个都有一个验证器到它各自的 wxString
.
根据wxID_OK
在对话框中,文本验证器工作并且我作为指针传递给它的原始结构包含正确的数据。
但是,我还在我的对话框中添加了一个按钮,它应该允许创建新的 std::pair<wxString,wxString>
记录在容器中。如果我这样做,在 wxID_OK
,应用程序崩溃。 DrMingW 使指向 wxString
的指针看起来像无效,但这是不可能的,因为单击按钮时我正在我的容器中创建一条新记录,并指向 wxTextValidator
到这个新创建的记录。它存储在对话框之外,因此不会在关闭对话框时失效。
我的数据结构:
struct StoryNodeData
{
wxString title;
wxString text;
std::vector<std::pair<wxString,wxString>> options;
};
我的对话框标题:
#ifndef STORYDIALOG_H
#define STORYDIALOG_H
#include "flowchart.hpp"
#include <map>
//(*Headers(StoryDialog)
#include <wx/bmpbuttn.h>
#include <wx/button.h>
#include <wx/choice.h>
#include <wx/dialog.h>
#include <wx/gbsizer.h>
#include <wx/scrolwin.h>
#include <wx/sizer.h>
#include <wx/textctrl.h>
//*)
class StoryDialog: public wxDialog
{
public:
StoryDialog(wxWindow* parent,StoryNodeData* data, wxArrayString titles,wxWindowID id=wxID_ANY,const wxPoint& pos=wxDefaultPosition,const wxSize& size=wxDefaultSize);
virtual ~StoryDialog();
void HandleOptionDelete(wxCommandEvent& e);
//(*Declarations(StoryDialog)
wxButton* OptionButton;
wxFlexGridSizer* OptionsSizer;
wxScrolledWindow* OptionsWindow;
wxTextCtrl* EventTextCtrl;
wxTextCtrl* TitleTextCtrl;
//*)
protected:
//(*Identifiers(StoryDialog)
static const long ID_TEXTCTRL1;
static const long ID_TEXTCTRL2;
static const long ID_BUTTON1;
static const long ID_TEXTCTRL3;
static const long ID_CHOICE1;
static const long ID_BITMAPBUTTON1;
static const long ID_SCROLLEDWINDOW1;
//*)
private:
//(*Handlers(StoryDialog)
void OnNewOptionButtonClick(wxCommandEvent& event);
void OnBitmapButton1Click(wxCommandEvent& event);
//*)
std::map<wxObject*,std::tuple<wxTextCtrl*, wxChoice*, std::size_t>> m_optionCtrls;
StoryNodeData* m_data;
wxArrayString m_titles;
void ConstructOption(wxString* text, wxString* title);
DECLARE_EVENT_TABLE()
};
#endif
以及对话框实现:
#include "StoryDialog.h"
#include <wx/artprov.h>
#include <wx/valgen.h>
//(*InternalHeaders(StoryDialog)
#include <wx/artprov.h>
#include <wx/bitmap.h>
#include <wx/image.h>
#include <wx/intl.h>
#include <wx/string.h>
//*)
//(*IdInit(StoryDialog)
const long StoryDialog::ID_TEXTCTRL1 = wxNewId();
const long StoryDialog::ID_TEXTCTRL2 = wxNewId();
const long StoryDialog::ID_BUTTON1 = wxNewId();
const long StoryDialog::ID_TEXTCTRL3 = wxNewId();
const long StoryDialog::ID_CHOICE1 = wxNewId();
const long StoryDialog::ID_BITMAPBUTTON1 = wxNewId();
const long StoryDialog::ID_SCROLLEDWINDOW1 = wxNewId();
//*)
BEGIN_EVENT_TABLE(StoryDialog,wxDialog)
//(*EventTable(StoryDialog)
//*)
END_EVENT_TABLE()
StoryDialog::StoryDialog(wxWindow* parent,StoryNodeData* data, wxArrayString titles,wxWindowID id,const wxPoint& pos,const wxSize& size)
{
//(*Initialize(StoryDialog)
wxBitmapButton* BitmapButton1;
wxChoice* Choice1;
wxFlexGridSizer* FlexGridSizer1;
wxGridBagSizer* GridBagSizer1;
wxStaticBoxSizer* StaticBoxSizer1;
wxStdDialogButtonSizer* StdDialogButtonSizer1;
wxTextCtrl* TextCtrl1;
Create(parent, wxID_ANY, _("New Event"), wxDefaultPosition, wxDefaultSize, wxSTAY_ON_TOP|wxCAPTION|wxRESIZE_BORDER|wxCLOSE_BOX|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxSIMPLE_BORDER, _T("wxID_ANY"));
GridBagSizer1 = new wxGridBagSizer(0, 0);
GridBagSizer1->AddGrowableCol(0);
GridBagSizer1->AddGrowableRow(1);
TitleTextCtrl = new wxTextCtrl(this, ID_TEXTCTRL1, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, wxTextValidator(wxFILTER_NONE,&data->title), _T("ID_TEXTCTRL1"));
GridBagSizer1->Add(TitleTextCtrl, wxGBPosition(0, 0), wxDefaultSpan, wxALL|wxEXPAND, 5);
EventTextCtrl = new wxTextCtrl(this, ID_TEXTCTRL2, wxEmptyString, wxDefaultPosition, wxSize(259,138), wxTE_MULTILINE|wxVSCROLL, wxTextValidator(wxFILTER_NONE,&data->text), _T("ID_TEXTCTRL2"));
GridBagSizer1->Add(EventTextCtrl, wxGBPosition(1, 0), wxDefaultSpan, wxALL|wxEXPAND, 5);
StdDialogButtonSizer1 = new wxStdDialogButtonSizer();
StdDialogButtonSizer1->AddButton(new wxButton(this, wxID_OK, wxEmptyString));
StdDialogButtonSizer1->AddButton(new wxButton(this, wxID_CANCEL, wxEmptyString));
StdDialogButtonSizer1->Realize();
GridBagSizer1->Add(StdDialogButtonSizer1, wxGBPosition(2, 0), wxGBSpan(1, 2), wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5);
StaticBoxSizer1 = new wxStaticBoxSizer(wxHORIZONTAL, this, _("Options"));
FlexGridSizer1 = new wxFlexGridSizer(2, 1, 0, 0);
FlexGridSizer1->AddGrowableCol(0);
FlexGridSizer1->AddGrowableRow(1);
OptionButton = new wxButton(this, ID_BUTTON1, _("New Option"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON1"));
FlexGridSizer1->Add(OptionButton, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
OptionsWindow = new wxScrolledWindow(this, ID_SCROLLEDWINDOW1, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxVSCROLL, _T("ID_SCROLLEDWINDOW1"));
OptionsSizer = new wxFlexGridSizer(0, 3, 0, 0);
OptionsSizer->AddGrowableCol(0);
TextCtrl1 = new wxTextCtrl(OptionsWindow, ID_TEXTCTRL3, _("Text"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_TEXTCTRL3"));
OptionsSizer->Add(TextCtrl1, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
Choice1 = new wxChoice(OptionsWindow, ID_CHOICE1, wxDefaultPosition, wxDefaultSize, 0, 0, 0, wxDefaultValidator, _T("ID_CHOICE1"));
OptionsSizer->Add(Choice1, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
BitmapButton1 = new wxBitmapButton(OptionsWindow, ID_BITMAPBUTTON1, wxArtProvider::GetBitmap(wxART_MAKE_ART_ID_FROM_STR(_T("wxART_DELETE")),wxART_BUTTON), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW, wxDefaultValidator, _T("ID_BITMAPBUTTON1"));
OptionsSizer->Add(BitmapButton1, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
OptionsWindow->SetSizer(OptionsSizer);
OptionsSizer->Fit(OptionsWindow);
OptionsSizer->SetSizeHints(OptionsWindow);
FlexGridSizer1->Add(OptionsWindow, 1, wxALL|wxEXPAND, 5);
StaticBoxSizer1->Add(FlexGridSizer1, 1, wxEXPAND, 5);
GridBagSizer1->Add(StaticBoxSizer1, wxGBPosition(0, 1), wxGBSpan(2, 1), wxALL|wxEXPAND, 5);
SetSizer(GridBagSizer1);
GridBagSizer1->Fit(this);
GridBagSizer1->SetSizeHints(this);
Connect(ID_BUTTON1,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&StoryDialog::OnNewOptionButtonClick);
//*)
OptionsWindow->SetScrollRate(5,5);
OptionsWindow->DestroyChildren();
Bind(wxEVT_BUTTON, &StoryDialog::HandleOptionDelete, this);
m_data = data;
m_titles = titles;
// construct the existing options
for(auto itr = m_data->options.begin(); itr != m_data->options.end(); ++itr)
{
auto title = &((*itr).first);
auto text = &((*itr).second);
ConstructOption(text,title);
}
}
StoryDialog::~StoryDialog()
{
//(*Destroy(StoryDialog)
//*)
}
void StoryDialog::HandleOptionDelete(wxCommandEvent& e)
{
auto b = e.GetEventObject();
auto itr = m_optionCtrls.find(b);
if(m_optionCtrls.end() != itr)
{
auto button = itr->first;
auto pa = itr->second;
m_optionCtrls.erase(itr);
OptionsSizer->Detach(std::get<0>(pa));
OptionsSizer->Detach(std::get<1>(pa));
OptionsSizer->Detach(reinterpret_cast<wxBitmapButton*>(button));
std::get<0>(pa)->Destroy();
std::get<1>(pa)->Destroy();
reinterpret_cast<wxBitmapButton*>(button)->Destroy();
auto index = std::get<2>(pa);
auto itr = m_data->options.begin() + index;
m_data->options.erase(itr);
}
OptionsSizer->Layout();
OptionsWindow->SetSizer(OptionsSizer);
SendSizeEvent();
e.Skip(true);
}
void StoryDialog::OnNewOptionButtonClick(wxCommandEvent& event)
{
m_data->options.push_back(std::make_pair("",""));
auto itr = m_data->options.end()-1;
auto text = &((*(itr)).second);
auto title = &((*(itr)).first);
ConstructOption(text,title);
}
void StoryDialog::ConstructOption(wxString* text, wxString* title)
{
long tId = wxNewId();
long cId = wxNewId();
long bId = wxNewId();
auto optionTextCtrl = new wxTextCtrl(OptionsWindow, tId, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, wxTextValidator(wxFILTER_NONE,text));
OptionsSizer->Add(optionTextCtrl, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
auto optionTitleCtrl = new wxChoice(OptionsWindow, cId, wxDefaultPosition, wxDefaultSize, m_titles, 0, wxGenericValidator(title));
OptionsSizer->Add(optionTitleCtrl, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
auto deleteButtonCtrl = new wxBitmapButton(OptionsWindow, bId, wxArtProvider::GetBitmap(wxART_MAKE_ART_ID_FROM_STR(_T("wxART_DELETE")),wxART_BUTTON), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW, wxDefaultValidator);
OptionsSizer->Add(deleteButtonCtrl, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
OptionsSizer->Layout();
OptionsWindow->SetSizer(OptionsSizer);
SendSizeEvent();
m_optionCtrls[deleteButtonCtrl] = std::make_tuple(optionTextCtrl,optionTitleCtrl,m_optionCtrls.size()-1);
}
您会注意到,无论是基于提供的数据还是用户通过控件添加新数据,我创建动态控件的方式都是相同的。唯一的区别是在添加新记录时,我首先在容器中创建记录
最佳答案
指向 std::vector<>
元素的指针可以(并且将)在 vector 内容更改时失效,例如当你向它附加更多元素时,你不能这样做。
相反,您需要使用不会移动其值的容器(例如 std::[unordered_]map<>
)或存储 unique_ptr<>
s 在你的 vector 中。
关于c++ - wxTextValidator 导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50697451/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!