2013-03-18 88 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