使用Form1's公共变量从Form1调用Form2's函数

本文关键字:Form1 调用 Form2 函数 使用 变量 | 更新日期: 2023-09-27 18:10:39

所以基本上,我的程序用套接字将你登录到游戏中,一旦你登录"控制面板"按钮出现,就可以修改游戏中的一些内容,比如在游戏中发送消息。"控制面板"按钮通过一个新表单显示所有这些功能。现在我将提供Form1打开Form2的代码片段。

private void cpanel_btn_Click(object sender, EventArgs e)
{
    Form2 cPanel = new Form2();
    cPanel.Show();
}

可以看到,它显示了Form2。我正在努力让Form2与Form1沟通。基本上,Form2可以与Form1通信,只要运行简单的void(函数)——但仅此而已。下面是Form2的构造函数类。我给了它一个公共名称"Main",并在Form2类的顶部设置了一个"公共Form1 Main"。这是Form2的完整类。

namespace WindowsFormsApplication2
{
    public partial class Form2 : Form
    {
        public Form1 Main;
        public Form2()
        {
            this.FormBorderStyle = FormBorderStyle.FixedSingle;
            InitializeComponent();
            this.Main = new Form1();
        }
        private void Form2_Load(object sender, EventArgs e)
        {
        }
        private void button1_Click(object sender, EventArgs e)
        {
            this.Main.sendGameData("Hello world!");
        }
    }
}

正如你所看到的,这个类底部的按钮的void试图与Form1通信并发送一些数据。然而,它运行了这个函数,但是让我们看看Form1的"sendGameData"void。

    public void sendGameData(string data)
    {
        data += "'x00";
        byte[] game_data = Encoding.UTF8.GetBytes(data);
        if (this.log_packets_opt) this.log("[SENT]: " + data);
        this.game_socket.Send(game_data);
    }

它运行函数,但似乎在该void的底线处遇到错误。Form2不能运行sendGameData,因为它没有"game_socket"公共套接字。这是一个巨大的问题,因为它阻止了我的代码工作。game_socket在任何大的事情发生之前被分配到Form1,我不想重建它,因为这会重叠socket,让你不得不重新连接和东西。

我想知道如何使Form2完全访问Form1,并拥有已经设置的所有公共变量。

哦,我收到的错误是:对象引用未设置为对象的实例。

使用Form1's公共变量从Form1调用Form2's函数

您正在Form2中创建Form1的新实例,而不是将Form1的实例传递给Form2。这样做:

private void cpanel_btn_Click(object sender, EventArgs e)
{
    Form2 cPanel = new Form2(this);
    cPanel.Show();
}
namespace WindowsFormsApplication2
{
    public partial class Form2 : Form
    {
        public Form1 Main;
        public Form2(Form1 main)
        {
            this.FormBorderStyle = FormBorderStyle.FixedSingle;
            InitializeComponent();
            this.Main = main;
        }
        private void Form2_Load(object sender, EventArgs e)
        {
        }
        private void button1_Click(object sender, EventArgs e)
        {
            this.Main.sendGameData("Hello world!");
        }
    }
}