簡體   English   中英

關閉表單后啟用按鈕

[英]Enable a button after closing a form

我想在第二個窗體關閉時從主窗體啟用一個按鈕。 我讀過一些有關調用的內容,但了解得不多。

我怎樣才能做到這一點?

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

通過在事件中添加委托實例,可以在.NET中注冊事件處理程序。 委托是一種描述方法簽名的類型。 如果使用gcnew實例化委托,則將其與代碼中的函數關聯。 您可以自己調用委托(這里不需要),也可以將其傳遞給其他代碼,然后再調用它。 后者用於事件。

對於您而言,這意味着:

  1. 查看FormClosed事件的委托類型。 是FormClosedEventHandler,它定義為delegate void FormClosedEventHandler(Object^ sender, FormClosedEventArgs^ e)
  2. 這意味着您必須實現不返回任何內容(無效)並接受兩個參數的方法:System :: Object和System :: Windows :: Forms :: 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;
}

暫無
暫無

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

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