如何执行主窗体按钮功能到第二种形式?

时间:2013-05-03 13:08:26

标签: c# constructor

我在主窗体的按钮中有一个功能,点击时启动摄像头,我希望启动功能也以第二种形式执行,该函数包含条件语句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 个答案:

答案 0 :(得分:2)

虽然你没有指出为什么它“不起作用”或它是如何失败的,但我建议用第一种形式订阅的第二种形式创建一个事件(参见Events Tutorial)。 只要您以第二种形式触发事件,第一个表单就可以执行与按下按钮时相同的操作。

答案 1 :(得分:1)

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

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

然后像这样调用它:

Camera.Start();

来自两种形式。

答案 2 :(得分:0)

您可以通过传递方法将相机从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();
   }
}

它上面只有一个按钮。

答案 3 :(得分:0)

如果要在多个表单上使用某些函数,则应该在单独的类中编写函数。使用该类的对象,您应该调用该函数。

但如果您仍想按照自己的方式行事,请尝试按照

进行操作

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

Form1 frmObj=new Form1();
frmObj.StartCamera();