2013-05-03 19 views
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(); 
     } 
+0

代碼pleasssseee :) – christopher 2013-05-03 13:11:27

+0

我忘了提,我使用C#Windows窗體C# – user2262382 2013-05-03 13:11:50

+0

是代碼,因爲這個問題是有點不清楚 – Steve 2013-05-03 13:12:00

回答

1

在我看來,你只需要一個static類和方法來做到這一點 - 它不是一件需要狀態我敢肯定,所以將實際的API調用啓動相機一類這樣的:

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

,然後調用它像這樣:

Camera.Start(); 

這兩種形式。

+0

但我有一個組合框,並把靜態類不會工作,因爲組合框不需要靜態類。 – user2262382 2013-05-03 13:13:25

+0

@ user2262382,你說你正在開攝像機嗎?將啓動相機的代碼放入靜態類。如果這不是你正在做的事情,那麼**真的需要澄清。**請參閱,你可以從任何地方調用這種啓動相機的方法,因此不管它是按鈕事件還是組合框事件。 – 2013-05-03 13:17:26

2

雖然你沒有指出爲什麼它「不起作用」或者它失敗了,我建議在第一個表單訂閱的第二個表單中創建一個事件(請參閱Events Tutorial)。 只要您以第二種形式啓動事件,第一種形式就可以執行與您按下按鈕時相同的動作。

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中的按鈕。

用於第二窗體(Form)的代碼是:

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(); 
    } 
} 

這裏只有一個按鈕就可以了。

0

如果你想在多個表單上使用某個函數,你應該在單獨的類中編寫函數。並且使用該類的對象,您應該調用該函數。

但如果你仍然想通過自己的方式來進行,嘗試以下

建立在其上寫StartCamera()方法第1形態的物體。確保StartCamera()方法是公開的。現在,在第二種形式:

Form1 frmObj=new Form1(); 
frmObj.StartCamera(); 
相關問題