C ++ / Cli将数据传递给子表单(以及后面)或如何将对象传递给子表单

时间:2013-12-24 16:48:11

标签: winforms c++-cli

我开始使用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.
     }

2 个答案:

答案 0 :(得分:1)

  1. 错误C2065:您需要将myGenome对象存储在其他方法可以看到的位置。现在,它是Form1_Load方法中的局部变量。使它成为一个类字段,该对象中的其他方法可以看到它。

    ref class Genome
    {
    public:
        Genome^ myGenome;
    };
    
  2. 错误C3673:如果您还没有,请将Form3的构造函数添加到Genome^。完成后,您已对myGenome的存储进行了上述更改,则此行应编译。

  3. “用户接受或修改此数据后,需要相应地修改对象,之后关闭子表单。”您正在传递对象本身,子表单将直接修改它。在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字段,即从Form3Form1的数据传输Form3

在需要时审核和修改所有数据时,单击“确定”关闭表单。此时,在numericUpDown字段中输入的数据将被复制回bGenome对象。

由于Form3 #included Form1 Form1 #included Form3 Form1 bGenome bGenome myGenome Form3 Form1 Form1 Form3 Form3有权访问bGenomemyGenome的数据可以复制回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字段,因为它有权访问,但我认为将它们放在bGenomemyGenome中是更清晰的只反馈一个完整的修改对象Form3,然后可以在一个语句中将其复制到Form1

对象Form3用于将输入字段填充到用户,并且(修订的)输入反馈给#include

代码,所有非必需品都被删除了。

Form1.h

Form1

Form3.h

Form3

我希望能够取消本地副本({{1}}和{{1}})并直接从{{1}}访问{{1}},所以如果有办法的话要做到这一点,请告诉我。我有一种感觉,可以通过将{{1}}传递给{{1}}的{​​{1}}和{{1}} {{1}}。{{1}}。(以避免循环引用)。 ),但没试过。