簡體   English   中英

使用Form1的公共變量從Form1調用Form2的函數

[英]Calling Form2's function from Form1 with Form1's public variables

因此,基本上,我的程序將您登錄到帶有套接字的游戲,並且一旦您登錄“控制面板”按鈕,便會出現修改游戲中某些內容的信息,例如在游戲中發送消息。 “控制面板”按鈕通過新表格顯示所有這些功能。 現在,我將為您提供打開Form2的Form1的代碼段。

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

如您所見,它啟動了Form2。 我正在嘗試讓Form2與Form1通信。 基本上,Form2可以與Form1通信,只要運行簡單的void(函數)就可以了-但這僅此而已。 這是Form2的構造函數類。 我給它起了公共名稱“ Main”,並為其設置了“ public Form1 main;”。 在Form2類的頂部。 這是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!");
        }
    }
}

如您所見,此類底部的按鈕空白會嘗試與Form1通信並發送一些數據。 但是,它運行函數,但是讓我們看一下Form1的“ sendGameData”無效。

    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);
    }

它運行該函數,但似乎與該空隙的底線發生了錯誤。 Form2無法運行sendGameData,因為它沒有“ game_socket”公共套接字。 這是一個很大的問題,因為它使我的代碼無法正常工作。 在發生任何大的事情之前,將game_socket分配到Form1中,並且我不想重構它,因為那會與套接字重疊,從而使您不得不重新連接。

我想知道如何使Form2擁有對Form1的完全訪問權限,並具有已經設置的所有公共變量。

哦,我收到的錯誤是: 對象引用未設置為對象的實例。

您正在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!");
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM