我开始使用C ++ \ Cli所以要温柔; - )
看来我的问题并不罕见,但我找不到适用于我的解决方案,即我能够实施。
我在Form1_Load()中创建一个对象“Genome”,然后我想通过工具条菜单显示子Form3中的数据。该对象在构造函数中提供了默认系统数据。需要将此默认数据作为输入字段中的起始值发送到子表单。用户接受或修改此数据后,需要相应地修改对象,之后关闭子表单。
我的感觉是,这可以通过将对象的指针/句柄发送到子表单来完成,从而使数据可访问。
两个问题:1)基本,2)基础不足。
1)ToolstripMenuItem_Click操作没有看到在Form1_Load中创建的对象。
2)我似乎无法弄清楚如何使用ToolStripMenuItem_click事件将(句柄)传递给对象,以便可以在子窗体中访问对象数据。
这是一些代码,我已经尽可能地删除了,我希望不要太多(数据隐藏仍然要做):
Genome.h
ref class Genome
{
public:
int nTFA; // nr of Transcription Factor genes
int nFDE; // nr of Function cell Death genes
List<char>^ cString; // chromosome string
List<Gene^>^ cStruct; // structure consisting of a List with Gene objects
// methods
void loadIniGen(String^ iniFile); // load genome values from .ini file
Genome(void);
};
Genome.cpp(遗漏的方法和许多变种):
// constructor
Genome::Genome(void)
{
nTFA = 20; // nr of Transcription Factor genes
cString = gcnew List<char>();
cStruct = gcnew List<Gene^>();
}
// methods
Form1.h
#pragma endregion
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e)
{
Genome^ myGenome = gcnew Genome(); // instantiate genome object
}
private: System::Void genomeToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
Form3^ genomeForm = gcnew Form3(myGenome); // pass genome object to Form3 for data input
genomeForm->Text = "Genome settings";
genomeForm->StartPosition = FormStartPosition::CenterParent;
genomeForm->ShowDialog(); // modal
}
谢谢,Jan
让我们添加错误:
1)给出:错误C2065:'myGenome':未声明的标识符
2)给出:错误C3673:'GenomeV2 :: Form3':类没有拷贝构造函数(当我在ToolStrip操作中创建myGenome对象进行测试时)
为了澄清,Form3已经设计,但还没有功能。总结:
namespace GenomeV2 {
public ref class Form3 : public System::Windows::Forms::Form
{
public:
Form3(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
}
protected:
/// <summary>
/// Clean up any resources being used.
/// </summary>
~Form3()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::GroupBox^ groupBox1;
etc.
#pragma region Windows Form Designer generated code
etc.
#pragma endregion
private: System::Void Form3_Load(System::Object^ sender, System::EventArgs^ e)
{
numericUpDown1->Minimum = 10; // TFA nr of Transcription Factor genes
numericUpDown1->Maximum = 100;
etc.
}
答案 0 :(得分:1)
错误C2065:您需要将myGenome
对象存储在其他方法可以看到的位置。现在,它是Form1_Load
方法中的局部变量。使它成为一个类字段,该对象中的其他方法可以看到它。
ref class Genome
{
public:
Genome^ myGenome;
};
错误C3673:如果您还没有,请将Form3
的构造函数添加到Genome^
。完成后,您已对myGenome
的存储进行了上述更改,则此行应编译。
“用户接受或修改此数据后,需要相应地修改对象,之后关闭子表单。”您正在传递对象本身,子表单将直接修改它。在myGenome
返回后,您不需要在genomeToolStripMenuItem_Click
内对ShowDialog
进行任何操作。
答案 1 :(得分:0)
好吧,我已经开始工作了。这是正确的方式,或者如果可以改进,请告诉我!
1)使myGenome
可见
我已将Genome^ myGenome;
的变量声明放在Form1
公开声明中,以便所有操作都可以看到,然后我使用{{Form1_Load
事件创建对象1}}稍后可以将其更改为带有基因组对象的List等。
2)来回传递表格之间的数据
正如大卫所建议的那样,当用myGenome = gcnew Genome();
实例化genomeForm时,我将(现在可见的)myGenome
对象传递给Form3
。在Form3^ genomeForm = gcnew Form3(myGenome);
声明中,我创建了一个Form3
对象作为副本,以获取传递给表单的数据。这是在bGenome
的构造函数中完成的(请参阅下面的代码)。这个Form3
对象包含Form1的bGenome
对象的数据副本,我可以使用它来填充myGenome
的numericUpDown字段,即从Form3
到Form1
的数据传输Form3
。
在需要时审核和修改所有数据时,单击“确定”关闭表单。此时,在numericUpDown字段中输入的数据将被复制回bGenome
对象。
由于Form3
#included
Form1
Form1
#included
Form3
Form1
bGenome
bGenome
myGenome
Form3
Form1
Form1
Form3
Form3
有权访问bGenome
,myGenome
的数据可以复制回myGenome
,关闭循环:数据从myGenome
传回public ref class Form1 : public System::Windows::Forms::Form
{
public:
Genome^ myGenome;
etc.
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e)
{
myGenome = gcnew Genome(); // instantiate genome object
}
etc.
private: System::Void genomeToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
Form3^ genomeForm = gcnew Form3(myGenome); // pass genome object to Form3 for data input
genomeForm->ShowDialog(); // modal
myGenome->nTFA = genomeForm->bGenome->nTFA; // feed data from Form3 back to myGenome
textBox1->Text = myGenome->nTFA.ToString();
}
。
注意:我意识到public ref class Form3 : public System::Windows::Forms::Form
{
public:
Genome^ bGenome;
public:
Form3(Genome^ aGenome)
{
InitializeComponent();
bGenome = gcnew Genome();
bGenome = aGenome;
}
etc.
private: System::Void Form3_Load(System::Object^ sender, System::EventArgs^ e)
{
numericUpDown1->Minimum = 10; // TFA nr of Transcription Factor genes
etc.
numericUpDown1->Value = bGenome->nTFA; // show the current Genome data in the input field
}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
bGenome->nTFA = Convert::ToInt32(numericUpDown1->Value); // copy the (modified) input data back into the Genome object
etc.
this->DialogResult = System::Windows::Forms::DialogResult::OK;
this->Close();
}
也可以读取aGenome
的numericUpDown字段,因为它有权访问,但我认为将它们放在bGenome
和myGenome
中是更清晰的只反馈一个完整的修改对象Form3
,然后可以在一个语句中将其复制到Form1
。
对象Form3
用于将输入字段填充到用户,并且(修订的)输入反馈给#include
。
代码,所有非必需品都被删除了。
Form1.h
Form1
Form3.h
Form3
我希望能够取消本地副本({{1}}和{{1}})并直接从{{1}}访问{{1}},所以如果有办法的话要做到这一点,请告诉我。我有一种感觉,可以通过将{{1}}传递给{{1}}的{{1}}和{{1}} {{1}}。{{1}}。(以避免循环引用)。 ),但没试过。