2013-09-21 20 views
3

這是我的問題......我正在創建一個私人消息系統。我有主窗體(Form1)和私人消息屏幕(pm_screen),當我打開私人消息屏幕時,我希望將數據從此表單發送回原始。但不知道如何寫這個。這是隱私信息屏幕上btnSend事件的代碼。如何引用已經聲明的對象

Message_Send = txtSend.Text.Trim(); 

Form1 frm1 = new Form1(); 
Invoke(new Form1._sendPM(frm1.sendPM), Message_Send); 

當我嘗試這一點,它會返回一個錯誤,指出:

Object reference not set to an instance of an object 

或者類似的規定。我的猜測是,這是因爲我正在開始Form1的一個新實例,而實例已經存在。但我不知道如何訪問這個「現有的實例」。你更有經驗的程序員有什麼建議嗎?

感謝

編輯(添加發送方法) - 位於Form1中

public delegate void _sendPM(string Send_Message); 
    public void sendPM(string Send_Message) 
    { 
     Server_Send("PM|" + Send_Message); 
    } 
+0

我的猜測是,frm1.sendPM沒有初始化,並_sendPM吹走上的空sendPM。你的代碼看起來很神祕。很難說出你想要做什麼。 – Tilak

+0

然後我怎麼初始化它? frm1是Form1,它始終打開?這不是說它總是初始化?並且,您希望我添加哪些信息以使其不那麼神祕? – Daaksin

+0

發佈整個代碼,什麼是_sendPM? –

回答

1

刪除我以前的答案,因爲它治療的徵狀,但不是實際的問題。您需要重做你的代碼結構弄成這個樣子:

//Btw should be PmScreen or something else that follows naming conventions 
public partial class pm_screen : Form 
{ 
    Form1 parentForm; 

    public pm_screen(Form1 parentForm) 
    { 
     this.parentForm = parentForm; 
    } 

    //Write GUI code for the class here... 

    public void acceptMessageFromParent(string message) 
    { 
     //Do stuff with string message 
    } 

    private void sendMessageToParent(string message) 
    { 
     parentForm.acceptMessageFromPrivate(message); 
    } 
} 

public partial class Form1 : Form 
{ 
    private void createPrivateMessageForm() 
    { 
     pm_screen privateScreen = new pm_screen(this); 
     //You might want to store privateScreen in a List here, so you can 
     //have several pm_screen instances per Form1 
    } 

    private void sendMessageToPrivate(pm_screen privateScreen, string message) 
    { 
     privateScreen.acceptMessageFromParent(message); 
    } 

    public void acceptMessageFromPrivate(string message) 
    { 
     //Do stuff with string message 
    } 
} 
+0

這個答案是眼睛的糖果。謝謝。 – Daaksin

+0

沒問題!這是我在自己的WinForm項目中使用的一種乾淨而有效的方法。 –

+0

它解決了我在表單之間交流的長期問題! – Daaksin