0

我在主窗体的按钮中有一个函数,单击时启动相机,我希望该启动函数也以第二种形式执行,该函数包含条件语句 if 和 else。通常我会创建一个public void Name并将函数放入其中,然后我会以第二种形式创建一个构造函数来调用该函数,但这次它不起作用。你怎么做另一种方式?

  public void startProg()
        {
            if (start.Text == "&Start")
            {
                if (DeviceExist)
                {
                    videoSource = new VideoCaptureDevice(videoDevices[comboBox1.SelectedIndex].MonikerString);
                    videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);
                    CloseVideoSource();
                    videoSource.DesiredFrameSize = new Size(1366, 768);
                    //videoSource.DesiredFrameRate = 10;
                    videoSource.Start();
                    lblCam.Text = "Device running...";
                    start.Text = "&Stop";
                }
                else
                {
                    lblCam.Text = "Error: No Device selected.";
                }
            }
            else
            {
                if (videoSource.IsRunning)
                {
                    CloseVideoSource();
                    lblCam.Text = "Device stopped.";
                    start.Text = "&Start";
                }
            }
        }

   private void start_Click(object sender, EventArgs e)
        {
              startProg();
        }

第二种形式

 private void Close(object sender, FormClosingEventArgs e)
        {
            frmMain main = new frmMain();
main.startProg();
        }
4

4 回答 4

2

尽管您没有指出它为什么“不起作用”或它是如何失败的,但我建议以第一种形式订阅的第二种形式创建一个事件(请参阅事件教程)。一旦您在第二种形式中触发事件,第一种形式可以执行与您按下按钮时完全相同的操作。

于 2013-05-03T13:13:42.970 回答
1

在我看来,您只需要一个static类和方法来执行此操作-我确定这不需要状态,因此将实际的 API 调用放置在这样的类中以启动相机:

public static class Camera
{
    public static void Start() { ... }
}

然后这样称呼它:

Camera.Start();

从这两种形式。

于 2013-05-03T13:11:52.073 回答
0

如果你想在多个表单上使用一些函数,你应该在单独的类中编写函数。并且使用该类的对象,您应该调用该函数。

但是,如果您仍然想按照自己的方式继续,请尝试以下操作

创建写入 StartCamera() 方法的 1st Form 对象。确保 StartCamera() 方法是公开的。现在在第二种形式:

Form1 frmObj=new Form1();
frmObj.StartCamera();
于 2013-05-03T13:26:51.130 回答
0

您可以通过传递 Method 以将相机从 form1 启动到 form2 来做到这一点。

我为此做了一个非常简单的例子。

第一种形式的代码是:

public Form1()
{
    InitializeComponent();
    this.button1.Click += delegate { ShowMessageBoxFromForm1(); };
    this.button2.Click += delegate
        {
            Form2 form2 = new Form2(ShowMessageBoxFromForm1);
            form2.ShowDialog();
        };
}

private void ShowMessageBoxFromForm1()
{
    MessageBox.Show("I'm in Form1");
}

Form1 上只有两个按钮。

第二种形式(Form2)的代码是:

public partial class Form2 : Form
{
   private readonly Action action;
   public Form2(Action action)
   {
       InitializeComponent();
       this.action = action;
   }

   private void button1_Click(object sender, EventArgs e)
   {
       this.action.Invoke();
   }
}

上面只有一个按钮。

于 2013-05-03T13:20:34.267 回答