2013-03-18 86 views

回答

1

當您關閉第二個窗體時,它的FormClosed事件會自動引發。在事件發生之前,您可以向事件註冊事件處理程序。這使您可以編寫在事件發生時自動執行的代碼。

在.NET中註冊事件處理程序是通過向事件添加委託實例來實現的。委託是描述方法簽名的類型。如果你用gcnew實例化一個委託,你可以將它與代碼中的函數關聯起來。你可以自己調用委託(這裏不需要),也可以將它傳遞給其他代碼,然後調用它。後者用於事件。

對於你的情況,這意味着:

  1. 看那FormClosed事件的委託類型。這是它被定義爲delegate void FormClosedEventHandler(Object^ sender, FormClosedEventArgs^ e)
  2. 這意味着你必須實現一個方法返回什麼(無效),並接受兩個參數的FormClosedEventHandler:系統::對象和系統:視窗:形式:FormClosedEventArgs
  3. 實例化FormClosedEventHandler委託並將其與您的方法關聯
  4. 註冊到第二個表單上的FormClosed事件,並啓用事件處理程序中的按鈕。

一個例子:

ref class MainForm 
{ 
    ... 

    // event handler function (compatible to the FormClosedEventHandler delegate) 
    void OnSecondFormClosed(Object^ sender, FormClosedEventArgs^ e) 
    { 
     myButton->Enabled = true; 
    } 

    void DoSomethingWithSecondForm(Form^ secondForm) 
    { 
     // get a disabled Button 
     myButton->Enabled = false; 
     // create an event handler by instantiating a delegate 
     FormClosedEventHandler^ handler = gcnew FormClosedEventHandler(this, &MainForm::OnSecondFormClosed); 
     // register event handler 
     secondForm->FormClosed += handler; 
    } 

    ... 
} 

(我沒編譯代碼,但是這是它是如何工作一般)

當在同一個線程內創建兩種參與形式,有是不需要做一些額外的Invoke。否則,您必須將更改的控件放入創建控件的同一個線程中。您可以通過將代表傳遞給Control::InvokeControl::BeginInvoke來實現此目的。

// event handler function (compatible to the FormClosedEventHandler delegate) 
void OnSecondFormClosed(Object^ sender, FormClosedEventArgs^ e) 
{ 
    if (myButton->InvokeRequired) 
    { 
     // create a delegate to call the same event handler again 
     FormClosedEventHandler^ handler = gcnew FormClosedEventHandler(this, &MainForm::OnSecondFormClosed); 
     // BeginInvoke causes the delegate to be called asynchronously from the UI thread 
     myButton->BeginInvoke(handler, sender, e); 
     // nothing to be done here, the actual work happens when the delegate is actually called 
     return; 
    } 

    myButton->Enabled = true; 
} 
+0

謝謝!但是我沒有把它弄得很好,對不起。我不需要調用,我可以看到,但是如何創建'OnSecondFormClosed'函數?它怎麼叫?我應該在通過腳本關閉第二個窗體時調用它?或者有一種方法可以「自動」調用它? – 2013-03-18 09:21:06

+0

是的,對不起,我以前的問題很簡單...但是,當我打算使用第二種形式時,我應該調用「DoSomethingWithSecondForm」嗎?我不能讓它工作 – 2013-03-18 09:46:41

+0

實現它,謝謝 – 2013-03-18 09:48:27