0

クリックするとカメラを開始するメインフォームのボタンに関数があります。その開始関数を、条件文ifおよびelseを含む2番目のフォームでも実行したいです。通常、私は a を作成しpublic void Name、その関数を呼び出すために2番目の形式でコンストラクターを作成した後、関数を内部に配置しますが、今回は機能しません。他の方法はどうしますか?

  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

なぜ「動かない」のか、どのように失敗するのかは指摘されませんでしたが、最初のフォームがサブスクライブしている 2 番目のフォームでイベントを作成することをお勧めします (イベントのチュートリアルを参照)。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

これを行うには、カメラを起動するメソッドを 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 には 2 つのボタンしかありません。

2 番目のフォーム (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();
   }
}

その上にボタンが1つしかありません。

于 2013-05-03T13:20:34.267 に答える
0

複数のフォームで関数を使用する場合は、別のクラスで関数を記述する必要があります。そして、そのクラスのオブジェクトを使用して、関数を呼び出す必要があります。

ただし、それでも自分のやり方で進みたい場合は、次のことを試してください

StartCamera()メソッドを記述した1st Formのオブジェクトを作成します。StartCamera() メソッドが public であることを確認してください。2番目のフォームで:

Form1 frmObj=new Form1();
frmObj.StartCamera();
于 2013-05-03T13:26:51.130 に答える